首页 > 解决方案 > 双破幂律拟合在python中不起作用

问题描述

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

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()

标签: pythonmatplotlibcurve-fittingmodel-fittingpower-law

解决方案


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

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

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

在此处输入图像描述

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

在此处输入图像描述

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


推荐阅读