我 尝试 在 python 中 拟合 数据 , 以 获得 最 佳 拟合 的 系数 。
我 需要 拟合 的 方程 是 :
Vs = a * ( qt ^ b ) * ( fs ^ c ) * ( ov ^ d )
这里 我 有 qt , fs 和 ov 的 数据 , 需要 得到 a , b , c , d 的 值 。
我 使用 的 代码 是 :
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
qt = [10867.073, 8074.986, 2208.366, 3066.566, 2945.326, 4795.766, 2249.813, 2018.3]
fs = [229.6, 17.4, 5.3, 0.1, 0.1, 0.1, 0.1, 0.1]
ov = [19.159, 29.054, 37.620, 44.854, 51.721, 58.755, 65.622, 72.492]
Vs = [149.787, 125.3962, 133.927, 110.047, 149.787, 137.809, 201.506, 154.925]
d = [1.018, 1.518, 2.0179, 2.517, 3.017, 3.517, 4.018, 4.52]
def func(a, b, c, d):
return a*qt**b*fs**c*ov**d
popt, pcov = curve_fit(func, Vs, d)
print(popt[0], popt[1], popt[2])
plt.plot(Vs, d, 'ro',label="Original Data")
plt.plot(Vs, func(Vs,*popt), label="Fitted Curve")
plt.gca().invert_yaxis()
plt.show()
中 的 每 一 个
它 会 产生 以下 输出 ( 有效 数字 由 我 剪切 ) :
-0.1413381 -0.3553966 之间 的 关系
我 希望 得到 一些 更 像 下面 的 数据 , 它 适合 , 但 它 还 没有 做 得 很 完美 ( 注意 下面 的 一 个 只是 一 个 例子 , 是 不 正确 的 ) 。
语言
1条答案
按热度按时间kx7yvsdv1#
主要的问题是结果的图形表示。所绘制的内容没有意义:即使有完美的数据和完美的拟合,这些点也会显得非常分散。这是误导。
最好画出(计算得出的Vs)除以(数据得出的Vs),并与1进行比较,如果拟合完美,则1应为准确值。
请注意,您的问题是对数标度的简单线性回归。
ln(Vs)= A + B * ln(qt)+ c * ln(fs)+ d * ln(ov)
线性回归直接给出A,B,c,d和a = exp(A)。