Python-曲线拟合(三)

非线性函数拟合

  1. 非线性函数不转化成线性函数
  2. 直接使用 s c i p y . o p t i m i z e scipy.optimize scipy.optimize 下面的 c u r v e curve curve_ f i t ( ) fit() fit()拟合
scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None)

输入参数:
f f f: 拟合函数
x d a t a xdata xdata, y d a t a ydata ydata: 被拟合数据点
p 0 p0 p0: 拟合参数初始值
s i g m a sigma sigma: 数据点 y d a t a ydata ydata的误差
返回值 :
p o p t popt popt: 拟合参数
p c o v pcov pcov: 拟合参数的协方差
矩阵:
参数标准偏差 :

perr = np.diag(pcov)

实例:
发射源的发射强度具有指数形式 I = I 0 e − α t I = I_0e^{-\alpha t} I=I0eαt.现有观测数据如下,试确定 I 0 I_0 I0 α \alpha α.

t i 0.2 0.3 0.4 0.5 0.6 0.7 0.8 I i 3.16 2.38 1.75 1.34 1 0.74 0.56 \begin{array}{|c|l|l|l|l|l|l|l|} \hline \boldsymbol{t}_{\boldsymbol{i}} & 0.2 & 0.3 & 0.4 & 0.5 & 0.6 & 0.7 & 0.8 \\ \hline I_{i} & 3.16 & 2.38 & 1.75 & 1.34 & 1 & 0.74 & 0.56 \\ \hline \end{array} tiIi0.23.160.32.380.41.750.51.340.610.70.740.80.56
Python代码实现:

import numpy as np
from scipy.optimize import curve_fit
x = np.arange(0.2, 0.9, 0.1)
y = np.array([3.16,2.38,1.75,1.34,1,0.74,
0.56])
def func(x, a, b): #定义拟合模型
    return a * np.exp(b * x)
pars, pcov = curve_fit(func, x, y)
print(pars) #拟合参数
print(np.sqrt(np.diag(pcov))) #拟合误差

运行结果:

[ 5.63606121 -2.89059333]
[0.03875286 0.01987778]

置信区间

拟合参数的置信区间:
β 0 ^ = β 0 ± t α 2 ( n − p ) σ β 0 β 1 ^ = β 1 ± t α 2 ( n − p ) σ β 1 \begin{array}{l} \widehat{\beta_{0}}=\beta_{0} \pm t_{\frac{\alpha}{2}}(n-p) \sigma_{\beta_{0}} \\ \widehat{\beta_{1}}=\beta_{1} \pm t_{\frac{\alpha}{2}}(n-p) \sigma_{\beta_{1}} \end{array} β0 =β0±t2α(np)σβ0β1 =β1±t2α(np)σβ1
𝑛: 数据点的个数
𝑝: 拟合参数的个数
σ β 0 \sigma_{\beta_0} σβ0, σ β 1 \sigma_{\beta_1} σβ1, 拟合参数的标准偏差
拟合参数的置信区间(Python代码)

import numpy as np
from scipy.stats.distributions import t
from scipy.optimize import curve_fit
x = np.arange(0.2, 0.9, 0.1)
y = np.array([3.16,2.38,1.75,1.34,1,0.74,
0.56])
def func(x, a, b): #定义拟合模型
    return a * np.exp(b * x)
pars, pcov = curve_fit(func, x, y)
print(pars) #拟合参数
print(np.sqrt(np.diag(pcov))) #拟合误差
n = len(y) # number of data points
p = len(pars) # number of parameters
alpha = 0.05 # 95% confidence interval = 100*(1-alpha)
dof = n - p #自由度
# student-t value for the dof and confidence level
tval = t.ppf(1.0-alpha/2., dof) #t_0.975(n-p)
sigma = np.sqrt(np.diag(pcov)) #标准偏差
for i in range(p):
    print('p{0}: {1:5.3f} [{2:5.3f} {3:5.3f}]'\
          .format(i,pars[i], #参数
                  pars[i]-sigma[i]*tval, #置信下限
                  pars[i]+sigma[i]*tval)) #置信上限

运行结果:

[ 5.63606121 -2.89059333]
[0.03875286 0.01987778]
p0: 5.636 [5.536 5.736]
p1: -2.891 [-2.942 -2.839]
要在Python中使用散点图进行曲线拟合,可以使用SciPy库中的curve_fit函数。首先,我们需要导入所需的库和数据: ```python import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 定义我们要拟合的函数 def func(x, a, b, c): return a * np.sin(b * x) + c # 假设我们有一些数据 x_data = np.linspace(0, 2 * np.pi, 50) y_data = 2.5 * np.sin(1.5 * x_data) + 1.5 + np.random.normal(size=50) ``` 在这里,我们定义了一个名为func的函数,它将被用作我们要拟合的函数。我们还创建了一些假数据,其中x_data是介于0到2π之间的50个等间距数据点,y_data是根据这些x值计算出来的一些带有噪声的y值。 接下来,我们使用curve_fit函数进行拟合: ```python # 使用curve_fit进行拟合 popt, pcov = curve_fit(func, x_data, y_data) # 输出拟合的参数 print(popt) # 绘制原始数据和拟合的曲线 plt.scatter(x_data, y_data) plt.plot(x_data, func(x_data, *popt), 'r') plt.show() ``` 这里的curve_fit函数将我们的数据和func函数作为输入,并返回一个包含拟合参数的数组popt和一个协方差矩阵pcov。我们可以使用popt来绘制拟合的曲线。 最后,我们可以使用Matplotlib库来绘制散点图和拟合的曲线。在这里,我们首先使用plt.scatter函数绘制原始数据的散点图,然后使用plt.plot函数绘制拟合曲线。 运行完整的代码,你将会得到一个包含原始数据和拟合曲线的散点图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X射线双星

希望您继续支持我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值