【问题标题】:Why doesn't Scipy's curve_fit give the correct result for the following problem(s)?为什么 Scipy 的 curve_fit 不能为以下问题给出正确的结果?
【发布时间】:2020-08-24 06:27:21
【问题描述】:

代码:

from scipy.optimize import curve_fit
import numpy as np
from numpy import *


def func(x, a, b): 
    return ff(x,a,b) 


ff= lambda x,a,b: eval("1/(a*x+b)")

xdata = [1 ,2, 4, 6, 8, 10]
ydata = [0.22, 0.1, 0.06, 0.04, 0.03, 0.024]

popt, pcov = curve_fit(func, xdata, ydata)
print('\n', '[a b] for the best fit =    ', popt,'\n')

当它运行时它会给出

 [a b] for the best fit =     [ 4.62673137 -0.04794652]

同时根据我的科学计算器(或手动求解),答案应该是:

 [a b] for the best fit =     [ 0.9232 4.05396]

我反复测试了该程序,这不是它没有提供正确结果的唯一示例。

【问题讨论】:

    标签: python scipy least-squares scipy-optimize


    【解决方案1】:

    我已经检查了你的计算:

    import matplotlib.pyplot as plt
    plt.scatter(xdata, ydata)
    plt.scatter(xdata, func(np.array(xdata), 4.62673137, -0.04794652), c='r')
    plt.scatter(xdata, func(np.array(xdata), 0.9232, 4.05396), c='g')
    plt.show()
    

    发现curve_fit() 给出了很好的拟合参数。问题在于您的其他解决方案。

    建议:

    不要使用from X import *。在某些情况下,它使代码极难管理。

    如果您不需要,请不要使用eval()。在这种情况下:

    def func(x, a, b):
        return 1. / (a * x + b)
    

    更短更清晰。

    【讨论】:

    • 这确实很奇怪,这里的拟合不是通过最小二乘法完成的吗?我将函数线性化,然后求解矩阵得到这个解,在我的步骤中找不到任何错误。
    • 另外感谢您的建议,我知道第二个,我只是在发布之前修改了代码(它应该接收输入,这就是我使用它的原因)。跨度>
    • 我猜您使用的近似值超出了有效范围。该图显示curve_fit() 工作正常。
    • 我同意它提供了更好的拟合,但我不认为这是从最小二乘法获得的,令我困惑的是,对于我所做的大多数其他测试,我们都同意我们的解决方案。
    猜你喜欢
    • 2016-04-22
    • 2017-02-21
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多