答案 0 :(得分:3)
看起来优化器陷入局部最小值,或者可能只是目标函数的一个非常平坦的区域。通过调整curve_fit
使用的参数的初始猜测,可以找到更好的拟合。例如,我使用p0=[1, 1, 1, 2.0]
(默认值为[1,1,1,1])得到了合理的拟合度:
以下是我使用过的脚本的修改版本:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, a, b, c, d):
return a + b*x - c*np.exp(-d*x)
xdata = np.array([0.03447378, 0.06894757, 0.10342136, 0.13789514, 0.17236893,
0.20684271, 0.24131649, 0.27579028, 0.31026407, 0.34473785,
0.37921163, 0.41368542, 0.44815921, 0.48263299])
ydata = np.array([ 2.5844 , 2.87449, 3.01929, 3.10584, 3.18305, 3.24166,
3.28897, 3.32979, 3.35957, 3.39193, 3.41662, 3.43956,
3.45644, 3.47135])
p0 = [1, 1, 1, 2.0]
popt, pcov = curve_fit(func, xdata, ydata, p0=p0)
print(popt)
plt.figure()
plt.plot(xdata, ydata, 'ko', label="Original Noised Data")
plt.plot(xdata, func(xdata, *popt), 'r-', label="Fitted Curve")
plt.legend(loc='best')
plt.show()
打印输出为:
[ 3.13903988 0.71827903 0.97047248 15.40936232]
答案 1 :(得分:0)
请尝试更具体地解决您遇到的问题。
我注意到的两件事会阻止您的代码按原样运行:
curve_fit()
调用),行尾有一个额外的右副词xdata
是一个python列表,所以一旦你尝试将它与func
中的参数相乘,它就不会起作用,即将它变成一个numpy数组
xdata = np.array(xdata)
如果你解决了这两个问题,那么适合应该有效。
编辑:沃伦当然是对的 - 修复上述问题仍然会让你开始做错了。