如何解决在python中使用scipy进行曲线拟合以查找校正参数不能将序列乘以'numpy.float64'类型的非整数
我正在尝试将函数 h = a0L(1-a1L**(-w1) 拟合到我的图中,并找到参数 a0、a1 和 w1。我想不通找出它为什么不起作用。我不断收到错误消息:无法将序列乘以“numpy.float64”类型的非整数。这是我的代码片段:
L = [8,16,32,64,128,256]
Average_height = [12.973731636721096,26.52865044449718,53.85333875018466,108.90761725203599,219.30647736483996,428.833120246036]
def correction(L,a0,a1,w1):
return a0*L*(1-a1*L**(-w1))
popt,pcov = curve_fit(correction,L,Average_height,bounds =([0,-10],[10,10,10]))
a0,w1 = popt
print((a0,w1))
plt.plot(L,correction(L,*popt),'r-')
plt.show()
解决方法
正如 hpaulj 已经提到的,你应该使用 numpy 数组。还有一个杂散的逗号一定是打字错误,否则,您将拥有不同数量的 x 和 y 值。最后,您通常不能将 Python 幂函数 **
与 numpy 数组一起使用 - 为此有专用的 numpy 函数 np.power。相应地更改代码会导致:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
L = np.asarray([8,16,32,64,128,256])
Average_height = np.asarray([12.973731636721096,26.52865044449718,53.85333875018466,108.90761725203599,219.30647736483996,428.833120246036])
def correction(L,a0,a1,w1):
return a0*L*(1-a1* np.power(L,-w1))
popt,pcov = curve_fit(correction,L,Average_height,bounds =([0,-10],[10,10,10]))
print(*popt)
#1.6836463115082618 9.999999999965157 2.717334174156468
plt.scatter(L,label="Data")
plt.plot(L,correction(L,*popt),'r-',label="fit")
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。