【问题标题】:Double broken power law fit is not working in python双破幂律拟合在python中不起作用
【发布时间】:2021-05-30 17:45:54
【问题描述】:

我一直在尝试曲线拟合双破幂律。

def sbpl(x,f0,a1,a2,a3,xb1,xb2):
    if x[0] < xb1:
         F=f0* x**(-a1)
    elif xb1 <= x <= xb2:
        F=f0* ((xb1)**(a2-a1)) *(x)**(-a2)
    else:   
        F=f0*((xb1)**(a2-a1))*((xb2)**(a3-a2))*(x**(-a3))   
    return F

x= 数组([5.5,9.0,17.0,18.0,19.0,43.0,45.0])
y = 数组([1.14e-03,2.08e-03,3.18e-03,2.53e-03,2.81e-03,1.491e03,1.311e-03])

popt,pcov=optimize.curve_fit(sbpl,x,y,sigma=err,p0=[1.,1.,0.,0.,0.,0.])

但它显示一个错误。

line 20, in sbpl     
elif xb1 <= x <= xb2:   

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

【问题讨论】:

  • 请将您的代码和错误作为文本添加到此问题中。避免上传文字图片。
  • 你写 xb1 &lt;= x &lt;= xb2x 似乎是一个数组,并且 Python 不允许你将数组与单个值作为 if 测试的一部分进行比较(这种类型的表达式可以可用于np.where 子句)。

标签: python matplotlib curve-fitting model-fitting power-law


【解决方案1】:

与要优化的参数数量相比,点数太少。这不允许确定选择分段函数。线性分段函数可能与分段幂函数或其他分段定律一样方便。

例如,本文第12页显示了线性分段函数的回归方法:https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf

按照这种方法,数值微积分在下面用参考论文中定义的符号进行了详细说明。 H(x) 是步骤 Heaviside 的函数:

相比之下,使用更简单的模型可以获得同样好的拟合:

为了更方便地回答您的具体问题,您应该编辑更具代表性的数据。

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2017-04-07
    • 2017-04-27
    • 2016-06-24
    相关资源
    最近更新 更多