Noa*_*her 2 python numpy curve-fitting scipy
我正在尝试为“时间”和“伏特”np 数组中的数据创建一条曲线拟合。当我尝试拟合数据时,出现错误“无法估计参数的协方差”。如果我输入其他数据点,它会起作用。我不确定这里可能出了什么问题。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame
time = np.array([100,80,70,60,55,50,45,40,35,30,25,22,20])
volts = np.array([6.28,6.04,5.72,5.32,5.08,4.80,4.44,3.96,3.40,
2.80,2.01,1.40,1.01])
## Defining exp func for curve fit
def func(x, a ,b):
return a * (1 - 2*np.exp(-b * x))
params, extras = curve_fit(func, time, volts)
print(params)
plt.scatter(time, volts)
x_data = np.arange(5,110)
plt.plot(x_data, params[0]*(1-2*np.exp(-params[1]*x_data)))
plt.show()
Run Code Online (Sandbox Code Playgroud)
例如,如果我使用数据:
volts = np.array([2.56, 2.54, 2.52, 2.46, 2.4, 2.38, 2.30, 2.26, 2.18, 2.08, 1.95, 1.80, 1.68, 1.44, 1.22, .9, .46])
time = np.array([])
for i in range(100, 15, -5):
time = np.append(time, i)
Run Code Online (Sandbox Code Playgroud)
然后合身效果很好。
您需要为a和提供现实的起始值。默认情况下(完全愚蠢)对所有参数使用值 1.0,而不发出警告。对于您的数据来说,这是一个非常糟糕的猜测,并且会导致拟合失败。尝试更好的起点,例如bcurve_fit()
params, extras = curve_fit(func, time, volts, [5.0, 0.1])
Run Code Online (Sandbox Code Playgroud)
会工作得更好......