在python中使用scipy进行曲线拟合以找到校正参数(不能将序列与'numpy.float64'类型的NONIT相乘)

2024-05-16 08:17:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将函数h=a0L(1-a1L**(-w1)拟合到我的图形中,并找到参数a0、a1和w1。我不明白为什么它不起作用。我不断遇到错误:无法将序列与“numpy.float64”类型的非int相乘。下面是我的代码片段:

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,0,-10], [10,10,10]))
a0, a1, w1 = popt
print((a0, a1, w1)) 
plt.plot(L, correction(L, *popt), 'r-')
plt.show()

Tags: 函数图形参数a1错误plt序列a0
1条回答
网友
1楼 · 发布于 2024-05-16 08:17:16

正如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,0,-10], [10,10,10]))
print(*popt) 
#1.6836463115082618 9.999999999965157 2.717334174156468
plt.scatter(L, Average_height, label="Data")
plt.plot(L, correction(L, *popt), 'r-', label="fit")
plt.show()

输出 enter image description here

相关问题 更多 >