【数学建模笔记 09-2】数学建模的拟合

09-2. 拟合

定义

拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小。

最小二乘拟合

已知一组点 ( x i , y i ) , i = 1 , 2 , … , n (x_i,y_i),i=1,2,\dots,n (xi,yi),i=1,2,,n​, x i x_i xi​ 互不相同,寻求一个函数 y = f ( x ) y=f(x) y=f(x)​,使 f ( x ) f(x) f(x) 在某种准则下与所有数据点最为接近。


δ i = f ( x i ) − y i , i = 1 , 2 , … , n \delta_i=f(x_i)-y_i,i=1,2,\dots,n δi=f(xi)yi,i=1,2,,n
为拟合函数 f ( x ) f(x) f(x) x i x_i xi​​ 点的偏差,可以采用偏差平方和最小作为判定准则,即让
J = ∑ i = 1 n ( f ( x i ) − y i ) 2 J=\sum_{i=1}^n(f(x_i)-y_i)^2 J=i=1n(f(xi)yi)2
达到最小值。这一原则称最小二乘原则。

线性拟合


f ( x ) = a 1 r 1 ( x ) + a 2 r 2 ( x ) + ⋯ + a m r m ( x ) , f(x)=a_1r_1(x)+a_2r_2(x)+\dots+a_mr_m(x), f(x)=a1r1(x)+a2r2(x)++amrm(x),
其中 r k ( x ) r_k(x) rk(x) 是事先选定的一组线性无关的函数, a k a_k ak 是待定系数。


J ( a 1 , … , a m ) = ∑ i = 1 n [ f ( x i ) − y i ] 2 , J(a_1,\dots,a_m)=\sum_{i=1}^n[f(x_i)-y_i]^2, J(a1,,am)=i=1n[f(xi)yi]2,
为求 a 1 , … , a m a_1,\dots,a_m a1,,am 使 J J J 最小,令
∂ J ∂ a k = 0 , k = 1 , … , m , \frac{\partial J}{\partial a_k}=0,k=1,\dots,m, akJ=0,k=1,,m,
得线性方程组
∑ i = 1 n r j ( x i ) [ ∑ k = 1 m a k r k ( x i ) − y i ] = 0 , \sum_{i=1}^nr_j(x_i)[\sum_{k=1}^ma_kr_k(x_i)-y_i]=0, i=1nrj(xi)[k=1makrk(xi)yi]=0,

∑ k = 1 m a k [ ∑ i = 1 n r j ( x i ) r k ( x i ) ] = ∑ i = 1 n r j ( x i ) y i , \sum_{k=1}^ma_k[\sum_{i=1}^nr_j(x_i)r_k(x_i)]=\sum_{i=1}^nr_j(x_i)y_i, k=1mak[i=1nrj(xi)rk(xi)]=i=1nrj(xi)yi,

j = 1 , … , m . j=1,\dots,m. j=1,,m.


R = ( r 1 ( x 1 ) … r m ( x 1 ) ⋮ ⋱ ⋮ r 1 ( x n ) … r m ( x n ) ) , R=\begin{pmatrix} r_1(x_1)&\dots&r_m(x_1)\\ \vdots&\ddots&\vdots\\ r_1(x_n)&\dots&r_m(x_n)\\ \end{pmatrix}, R=r1(x1)r1(xn)rm(x1)rm(xn),

A = ( a 1 , … , a m ) T , Y = ( y 1 , … , y n ) T . A=(a_1,\dots,a_m)^T,Y=(y_1,\dots,y_n)^T. A=(a1,,am)T,Y=(y1,,yn)T.

则方程组可表示为
R T R A = R T Y , R^TRA=R^TY, RTRA=RTY,
该方程组有唯一解,求解即可。

例子

y = a 0 + a 1 x + a 2 x 2 y=a_0+a_1x+a_2x^2 y=a0+a1x+a2x2 拟合 ( 1 , 4 ) , ( 2 , 10 ) , ( 3 , 18 ) , ( 4 , 26 ) (1,4),(2,10),(3,18),(4,26) (1,4),(2,10),(3,18),(4,26)

r 0 ( x ) = 1 , r 1 ( x ) = x , r 2 ( x ) = x 2 r_0(x)=1,r_1(x)=x,r_2(x)=x^2 r0(x)=1,r1(x)=x,r2(x)=x2,故
R = ( 1 1 1 1 2 4 1 3 9 1 4 16 ) , R=\begin{pmatrix} 1&1&1\\ 1&2&4\\ 1&3&9\\ 1&4&16\\ \end{pmatrix}, R=1111123414916,

Y = ( 4 , 10 , 18 , 26 ) T . Y=(4,10,18,26)^T. Y=(4,10,18,26)T.


R T R A = R T Y R^TRA=R^TY RTRA=RTY

( 4 10 30 10 30 100 30 100 354 ) ( a 0 a 1 a 2 ) = ( 58 182 622 ) \begin{pmatrix} 4& 10& 30\\ 10& 30& 100\\ 30& 100& 354 \end{pmatrix} \begin{pmatrix} a_0\\ a_1\\ a_2 \end{pmatrix} =\begin{pmatrix} 58\\ 182\\ 622 \end{pmatrix} 41030103010030100354a0a1a2=58182622
求解线性方程组得
a 0 = − 3 2 , a 1 = 49 10 , a 2 = 1 2 . a_0=-\frac32,a_1=\frac{49}{10},a_2=\frac12. a0=23,a1=1049,a2=21.

f ( x ) = − 3 2 + 49 10 x + 1 2 x 2 . f(x)=-\frac32+\frac{49}{10}x+\frac12x^2. f(x)=23+1049x+21x2.

非线性拟合

对于给定的 r k ( x ) r_k(x) rk(x),如果拟合函数不能以其线性组合的形式出现,则 f ( x ) f(x) f(x)​ 为非线性函数。对于非线性函数的极小化问题,可用非线性优化方法求解。

Python 代码

使用 numpy 包进行一次、二次、三次多项式拟合上例,代码如下:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# @ author: Koorye
# @ date: 2021-7-26
# @ function: 使用 numpy 包进行最小二乘拟合

# %%

import matplotlib.pyplot as plt
import numpy as np

# %%

# 源数据
x = np.array([1, 2, 3, 4])
y = np.array([4, 10, 18, 26])

# 多项式拟合
z1 = np.polyfit(x, y, 1)
z2 = np.polyfit(x, y, 2)
z3 = np.polyfit(x, y, 3)

p1 = np.poly1d(z1)
p2 = np.poly1d(z2)
p3 = np.poly1d(z3)

# %%

print('p1 =\n', p1)
print('p2 =\n', p2)
print('p3 =\n', p3)

# %%


x1 = np.linspace(-2, 7, 100)
y1 = p1(x1)
y2 = p2(x1)
y3 = p3(x1)
plt.scatter(x, y)
plt.plot(x1, y1, label='linear')
plt.plot(x1, y2, label='quadratic')
plt.plot(x1, y3, label='cubic')
plt.legend()

输出如下:

p1 =
  
7.4 x - 4
p2 =
      2
0.5 x + 4.9 x - 1.5
p3 =
          3     2
-0.3333 x + 3 x - 0.6667 x + 2

有一次多项式 7.4 x − 4 7.4x-4 7.4x4,二次多项式 0.5 x 2 + 4.9 x − 1.5 0.5x^2+4.9x-1.5 0.5x2+4.9x1.5,三次多项式 − 0.3333 x 3 + 3 x 2 − 0.6667 x + 2 -0.3333x^3+3x^2-0.6667x+2 0.3333x3+3x20.6667x+2,曲线如图所示。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值