#最小二乘拟合出来是一条直线
import numpy as np
from scipy.optimize import curve_fit
#
x_data=np.array([0,1,2,3,4,5,6,7,8])
y_data=np.array([0.483,0.479,0.452,0.418,0.371,0.342,0.319,0.311,0.309])
z_data=np.array([1.50E+07,1.70E+07,2.00E+07,2.50E+07,3.00E+07,3.30E+07,3.50E+07,3.70E+07,3.70E+07])
#定义多元函数
def func(x,C0,M0,K1,K2):
return C0*(1-np.exp(-K1*M0*np.exp(K2*x)))
#利用最小二乘法拟合实验数据,找到最佳参数
popt,pcov=curve_fit(func,x_data,y_data,bounds=([0,0,0,0],[1,np.inf,1,np.inf]),p0=[0.4,1e7,0.3,0.7])
C0,M0,K1,K2=popt
#输出参数值
print("C0=",C0)
print("M0=",M0)
print("K1=",K1)
print("K2=",K2)
#使用模型绘制曲线
x=np.linspace(0,8,100)
y_fit=func(x,C0,M0,K1,K2)
import matplotlib.pyplot as plt
plt.scatter(x_data,y_data,label='实验数据')
plt.plot(x,y_fit,'r-',label='拟合曲线')
plt.xlabel('天数')
plt.ylabel('浓度')
plt.legend()
plt.show()
码字不易,有用望采纳答案参考Chatgpt解答
你的代码已经很接近拟合一条直线了,因为你的模型函数是非线性的。如果你想拟合一条直线,可以将模型函数更改为一次线性函数。在这种情况下,你只需要拟合斜率和截距即可。
以下是修改后的代码:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 实验数据
x_data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
y_data = np.array([0.483, 0.479, 0.452, 0.418, 0.371, 0.342, 0.319, 0.311, 0.309])
# 定义线性函数
def linear_func(x, a, b):
return a * x + b
# 利用最小二乘法拟合实验数据,找到最佳参数
popt, pcov = curve_fit(linear_func, x_data, y_data)
a, b = popt
# 输出参数值
print("斜率 a =", a)
print("截距 b =", b)
# 使用模型绘制曲线
x = np.linspace(0, 8, 100)
y_fit = linear_func(x, a, b)
plt.scatter(x_data, y_data, label='实验数据')
plt.plot(x, y_fit, 'r-', label='拟合曲线')
plt.xlabel('天数')
plt.ylabel('浓度')
plt.legend()
plt.show()
这样修改后,你将得到一条直线作为拟合结果。请运行以上代码并查看结果。