数学建模:插值与拟合—拟合问题的python求解

目录

*
1.polyfit 进行多项式拟合
2.curve_fit

Python 的多个模块中,有很多函数或方法可以拟合未知参数。例如 NumPy 库中的多项式拟合函数 polyfit;scipy.optimize 模块中的函数 leastsq,curve_fit 都可以进行拟合。本文介绍 polyfit 和 curve_fit 的使用方法。

1.polyfit 进行多项式拟合

numpy.polyfit 的基本用法为

import numpy as np
p=np.polyfit(x, y, n)
yhat=np.polyval(p,x0)

例1 对表中的数据进行二次多项式拟合。并求 x = 0.25 , 0.35 x=0.25, 0.35 x =0 .2 5 ,0 .3 5 时, y y y 的预测值。
x i x_i x i ​

00.10.20.30.40.50.60.70.80.91.0
y i y_i y i ​

-0.4471.9783.286.167.087.347.669.569.489.3011.2

求解的Python程序为

import numpy as np
import matplotlib.pyplot as plt
x0=np.arange(0, 1.1, 0.1)
y0=np.array([-0.447, 1.978, 3.28, 6.16, 7.08, 7.34, 7.66, 9.56, 9.48, 9.30, 11.2])
p=np.polyfit(x0, y0, 2)
print("拟合二次多项式的从高次幂到低次幂系数分别为:",p)
yhat=np.polyval(p,[0.25, 0.35])
print("预测值分别为:", yhat)
plt.rc('font',size=16)
plt.plot(x0, y0, '*', x0, np.polyval(p, x0), '-')
plt.show()

运行结果为

拟合二次多项式的从高次幂到低次幂系数分别为: [-9.81083916 20.12929371 -0.03167133]
预测值分别为: [4.38747465 5.81175367]

所以拟合的二次多项式为 y = − 9.8108 x 2 + 20.1293 x − 0.0317 y = – 9.8108{x^2} + 20.1293x – 0.0317 y =−9 .8 1 0 8 x 2 +2 0 .1 2 9 3 x −0 .0 3 1 7 ; x = 0.25 , 0.35 x = 0.25,\;0.35 x =0 .2 5 ,0 .3 5 时, y y y 的预测值分别为 4.3875, 5.8118。

2.curve_fit

scipy.optimize.curve_fit 的调用格式为:

from scipy.optimize import curve_fit
popt, pcov = curve_fit(func, xdata, ydata)

其中 func 是拟合的函数,xdata 是自变量的观测值,ydata 是函数的观测值,返回值 popt 是拟合的参数,pcov 是参数的协方差矩阵。

续例1 用 curve_fit 函数拟合二次多项式,并求预测值。

求解的 Python 程序为

import numpy as np
from scipy.optimize import curve_fit
y=lambda x, a, b, c: a*x**2+b*x+c
x0=np.arange(0, 1.1, 0.1)
y0=np.array([-0.447, 1.978, 3.28, 6.16, 7.08, 7.34, 7.66, 9.56, 9.48, 9.30, 11.2])
popt, pcov=curve_fit(y, x0, y0)
print("拟合的参数值为:", popt)
print("预测值分别为:", y(np.array([0.25, 0.35]), *popt))

运行结果为

拟合二次多项式的从高次幂到低次幂系数分别为: [-9.81083916 20.12929371 -0.03167133]
预测值分别为: [4.38747465 5.81175367]

所以拟合的二次多项式为 y = − 9.8108 x 2 + 20.1293 x − 0.0317 y = – 9.8108{x^2} + 20.1293x – 0.0317 y =−9 .8 1 0 8 x 2 +2 0 .1 2 9 3 x −0 .0 3 1 7 ; x = 0.25 , 0.35 x = 0.25,\;0.35 x =0 .2 5 ,0 .3 5 时, y y y 的预测值分别为 4.3875, 5.8118。

例2 用表中 x 1 , x 2 , y {x_1},{x_2},y x 1 ​,x 2 ​,y 的观测值拟合函数 z = a e b x + c y 2 z = a{e^{bx}} + c{y^2}z =a e b x +c y 2 。
x x x

62674259
y y y

49538582
z z z

52197433

求解的 Python 程序如下

import numpy as np
from scipy.optimize import curve_fit
x0=np.array([6, 2, 6, 7, 4, 2, 5, 9])
y0=np.array([4, 9, 5, 3, 8, 5, 8, 2])
z0=np.array([5, 2, 1, 9, 7, 4, 3, 3])
xy0=np.vstack((x0, y0))

def Pfun(t, a, b, c):
    return a*np.exp(b*t[0])+c*t[1]**2
popt, pcov=curve_fit(Pfun, xy0, z0)
print("a, b, c的拟合值为: ", popt)

运行结果为

a, b, c的拟合值为:  [ 5.08907305e+00 -2.58248004e-03 -2.14509683e-02]

例3 利用模拟数据拟合曲面 z = e − ( x − μ 1 ) 2 + ( y − μ 2 ) 2 2 σ 2 , z = {e^{ – \;\frac{{{{(x – {\mu _1})}^2} + {{(y – {\mu _2})}^2}}}{{2{\sigma ^2}}}}},z =e −2 σ2 (x −μ1 ​)2 +(y −μ2 ​)2 ​, 并画出拟合曲面的图形。

我们利用函数 z = e − ( x − μ 1 ) 2 + ( y − μ 2 ) 2 2 σ 2 , z = {e^{ – \;\frac{{{{(x – {\mu _1})}^2} + {{(y – {\mu _2})}^2}}}{{2{\sigma ^2}}}}},z =e −2 σ2 (x −μ1 ​)2 +(y −μ2 ​)2 ​, 其中 μ 1 = 1 {\mu _1} = 1 μ1 ​=1 , μ 2 = 2 {\mu _2} = 2 μ2 ​=2 , σ = 3 \sigma = 3 σ=3 ,生成加噪声的模拟数据,利用模拟数据拟合参数 μ 1 {\mu _1}μ1 ​, ${\mu _2}, σ \sigma σ ,最后画出拟合曲面的图形。

Python 程序如下

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
m=200; n=300
x=np.linspace(-6, 6, m)
y=np.linspace(-8, 8, n)
x2, y2 = np.meshgrid(x, y)
x3=np.reshape(x2, (1,-1))
y3=np.reshape(y2, (1,-1))
xy=np.vstack((x3,y3))
def Pfun(t, m1, m2, s):
    return np.exp(-((t[0]-m1)**2+(t[1]-m2)**2)/(2*s**2))
z=Pfun(xy, 1, 2, 3)
zr=z+0.2*np.random.normal(size=z.shape)
popt, pcov=curve_fit(Pfun, xy, zr)
print("三个参数的拟合值分别为:",popt)
zn=Pfun(xy, *popt)
zn2=np.reshape(zn, x2.shape)
plt.rc('font',size=16)
ax=plt.axes(projection='3d')
ax.plot_surface(x2, y2, zn2,cmap='gist_rainbow')
plt.show()

运行结果为

三个参数的拟合值分别为: [0.99986549 2.00183698 2.99883453]

数学建模:插值与拟合—拟合问题的python求解

Original: https://blog.csdn.net/qq_55851911/article/details/124424785
Author: Charle4Leclerc
Title: 数学建模:插值与拟合—拟合问题的python求解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601161/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球