曲线拟合的最小二乘法(多项式拟合、任意拟合一元函数、函数逼近、python/matlab)

本文详细介绍了如何使用Matlab和Python进行曲线拟合,包括多项式拟合方法、自定义函数拟合,并通过实例展示1990-1996年乡镇企业利润预测。探讨了用简单函数逼近复杂函数的理论,以H=Span{1,x²,x⁴}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 曲线拟合的理论在数值分析中由详细介绍

多项式拟合方法

  • a = polyfit(x0, y0, m) x0,y0为要拟合的数据,m为拟合多项式的次数,输出的a为次数从高到低的系数
  • y = polyval(a, x) 多项式在x处的值

例1

  • 某乡镇企业1990-1996 年的生产利润如下表

image.png
试预测1997 年和1998 年的利润。

matlab两种方法求解

x0=[1990  1991  1992  1993  1994  1995  1996];
y0=[70   122   144   152   174   196   202];
%plot(x0,y0,'*') #先做出散点图,由散点图可知拟合线性函数

%拟合多项式的方法
a=polyfit(x0,y0,1)
y1=polyval(a,x0)

%拟合任意一元函数的方法
syms x %定义变量t
f=fittype('a1*x + a0','independent','x','coefficients',{'a1','a0'})%自定义拟合函数,可以是知数函数等
cfun=fit(x0',y0',f) %根据自定义的函数拟合x,y;注意:x,y必须是列向量
y1=cfun(x0);

%作图
plot(x0,y1,x0,y0,'r*')

>>> y97=polyval(a,1997)
>>> y98=polyval(a,1998)

>>> y97=cfun(1997)
>>> y98=cfun(1998)

image.png

python两种方法求解

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit#拟合

x0 = np.array([1990, 1991, 1992, 1993, 1994, 1995, 1996])
y0 = np.array([70, 122, 144, 152, 174, 196, 202])

#拟合多项式
coefficients= np.polyfit(x0, y0, 1)#拟合一次函数得到的系数
p1=np.poly1d(coefficients)#合成的一次多项式
y1=p1(x0)#拟合的y值

#拟合任意一元函数的方法
fun = lambda x, a0, a1: a1*x + a0 #自定义函数,可以是指数函数等别的类型函数
a,pcov=curve_fit(fun, x0, y0)#a是最小二乘法得到的系数,pcov是参数的估计协方差
y1=fun(x0,a[0],a[1])

#作图
plt.figure()
plt.plot(x0, y0, '*', label='original values')
plt.plot(x0, y1, 'r--', label='poly_fit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc="lower right")
plt.title('Poly Fitting (y={:.3f}x+{:.3f})'.format(a1, a0))#格式化输出

>>> p1(1997)
233.42857142858702
>>> p1(1998)
253.92857142858702

>>> fun(1997,a0,a1)
233.42857142858702
>>> fun(1998,a0,a1)
253.92857142858702

image.png

matlab图形窗口的多项式拟合

plot(x,y,'r’)—>工具—>基本拟合*
image.png

matlab强大的拟合工具箱Curve Fitting

函数逼近

  • 用一个简单的函数逼近较为复杂的连续函数
  • 选择一组基{rk(x),k=1,...,m}\{r_k(x),k=1,...,m \}{rk(x),k=1,...,m}构造f(x)=a1r1(x)+...+amrm(x)f(x)=a_1r_1(x)+...+a_mr_m(x)f(x)=a1r1(x)+...+amrm(x)来逼近y(x)y(x)y(x),使得J=∫ab[f(x)−y(x)]2dxJ=\int_a^b[f(x)-y(x)]^2dxJ=ab[f(x)y(x)]2dx最小,利用极值的充分必要条件得下列等式

[(r1,r1)…(r1,rm)⋮⋮⋮(rm,r1)…(rm,rm)]\left[ \begin{array}{ccc} (r_1,r_1)&\ldots&(r_1,r_m)\\ \vdots&\vdots&\vdots\\ (r_m,r_1)&\ldots&(r_m,r_m) \end{array} \right](r1,r1)(rm,r1)(r1,rm)(rm,rm)[a1⋮am]\left[ \begin{array}{c} a_1\\ \vdots\\ a_m \end{array} \right]a1am=[(y,r1)⋮(y,rm)]\left[ \begin{array}{c} (y,r_1)\\ \vdots\\ (y,r_m) \end{array} \right](y,r1)(y,rm)

例2

  • f(x)=cosx,x∈[−π2,π2]f(x)=cosx,x\in[-\frac{\pi}{2},\frac{\pi}{2}]f(x)=cosx,x[2π,2π]H=Span{1,x2,x4}H=Span\{1,x^2,x^4\}H=Span{1,x2,x4}中的最佳平方逼近多项式。

matlab求解

syms x
base=[1,x^2,x^4];
y1=base.'*base 
% a'对a的每个元素取共轭,然后再转置;  a.'只对a转置
y2=cos(x)*base.'
r1=int(y1,-pi/2,pi/2)%int积分
r2=int(y2,-pi/2,pi/2)
a=r1\r2%/(向右倒称为右除) 右除    AB=C    A=C/B
       %\(向左倒称为左除) 左除    AB=C    B=A\C
xishu1=double(a)
xishu2=vpa(a,6) %设置精度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_961876584

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值