【问题标题】:Polynomial fit using curve_fit()使用 curve_fit() 进行多项式拟合
【发布时间】:2019-09-09 08:57:48
【问题描述】:

我一直在尝试使用 curve_fit() 为我的数据点获得最佳多项式拟合,但我的代码给出了以下错误。有人可以帮助我理解故障所在。非常感谢。

TypeError: 输入类型不支持 ufunc 'bitwise_xor',并且根据强制转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

from scipy.optimize import curve_fit
from scipy.interpolate import *   
def func(x, a, b, c, d):
    return a*x^3 + b*x^2 + c * x + d

Xdata1 = np.array([10, 20, 30, 60])
Ydata1 = np.array([3, 5, 4, 3.5])

plt.plot(Xdata1, Ydata1, 'bo', label='Raw Data')

popt, pcov = curve_fit(func, Xdata1, Ydata1)
a, b, c, d= popt
plt.plot(Xdata1, func(Xdata1, *popt), 'r--', label='fit')

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    您应该使用** 而不是^,后者是位运算符

    【讨论】:

      【解决方案2】:

      正如已经指出的^ 是按位运算符,即按位异或(异或)运算符。

      https://docs.python.org/2/reference/expressions.html#binary-bitwise-operations

      在任何情况下,由于您正在尝试拟合正则多项式,如果您不想处理 scipy.optimize 包中的自定义函数和参数规范,您也可以尝试numpy.polyfit 函数。您可以指定多项式次数并立即获得系数。 它使用最小二乘法。

      在你的情况下会是这样的

      numpy.polyfit(Xdata1,Ydata1,3)

      产生三次拟合多项式的系数

      array([ 0.34166667, -3.55 , 10.25833333, -4.05 ])

      【讨论】:

      • 非常感谢您的及时回复。就像你指出的那样,我使用了 polyfit(),但是,问题是它返回的虚线通过 R^2 = 1 的每个数据点。我有点远离 polyfit(),因为我更看获得一种最能描述数据的平滑线(类似曲线的东西)(尽可能最好的 R 平方)。通过使用curve_fit()而不是polyfit(),我是否走在正确的轨道上?
      • 如果您能够从两个拟合程序中的任何一个获得popt,是的,您非常接近得到您想要的。您只需更改绘制拟合曲线的部分。你得到一条折线,因为你再次使用Xdata1 来绘制拟合曲线。相反,您必须使用跨越相似范围的更密集的数组。鉴于您的Xdata1 值,我会尝试这样的事情:plt.plot(np.arange(0,70,0.5), func(np.arange(0,70,0.5), *popt), 'r--', label='fit')。 (如果这解决了您的问题,请接受答案)
      猜你喜欢
      • 2019-01-23
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2020-06-08
      • 2012-06-07
      • 2019-02-12
      相关资源
      最近更新 更多