python - 双破幂律拟合在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()
解决方案
与要优化的参数数量相比,点的数量太少。这不允许确定选择分段函数。线性分段函数可能与分段幂函数或其他分段定律一样方便。
例如,本文第 12 页显示了线性分段函数的回归方法:https ://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf
按照这种方法,数值演算在下面用参考论文中定义的符号进行了详细说明。H(x) 是阶跃 Heaviside 函数:
相比之下,使用更简单的模型可以获得同样好的拟合:
为了更方便地回答您的具体问题,您应该编辑更具代表性的数据。
推荐阅读
- linux - 如何在 Pop!_OS 20.10 x86_64 Codename:groovy 上安装 ROS Gazebo
- windows - Rust,Windows 10:柴油机不工作,柴油机设置不提供输出
- macos - SwiftUI Mac Catalyst 滚动不适用于 StackNavigationViewStyle
- android - 如何从 AppWidgetProvider 调用 ViewModel 函数?
- mysql - VB.NET Refresh DataGridView 函数适用于插入和删除命令,但不适用于更新
- ruby-on-rails - Rails 控制器:有条件地调用同一控制器的另一个动作
- tsql - 在表中加载了多个文件,现在想查找最小值和最大值来自哪个文件
- bash - AWK 不会在输出区域设置中以十进制形式 (100.000) 过滤数字 100
- javascript - 在 onClick="window.location.href" 上使用 jQuery 重定向到 asp 页面
- python - 下载到本地计算机后,如何在 Python 程序中使用 NNN.py 库?