欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多项式拟合一般方程法详细推导

程序员文章站 2022-07-05 19:09:27
...

多项式拟合之一般方程法

之前经常会用到多项式拟合来拟合函数关系,十分好用,得出的表达式使用起来超级方便。在此对多项式拟合原理进行分析。

1 什么是多项式拟合?

y = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n = ∑ i = 0 n a i x i \begin{aligned} y&=a_0+a_1x+a_2x^2+\cdots +a_nx^n\\ &=\sum_{i=0}^{n}{a_ix^i} \end{aligned} y=a0+a1x+a2x2++anxn=i=0naixi

这是多项式拟合的输出表达式。

2 怎样拟合?

考虑输入样本数据如下:
x = [ x 1 , x 2 , . . . , x m ] T y = [ y 1 , y 2 , . . . , y m ] T x=[x_1,x_2,...,x_m]^T\\ y=[y_1,y_2,...,y_m]^T x=[x1,x2,...,xm]Ty=[y1,y2,...,ym]T
构建方程组:
y 1 = a 0 + a 1 x 1 + a 2 x 1 2 + ⋯ + a n x 1 n y 2 = a 0 + a 1 x 2 + a 2 x 2 2 + ⋯ + a n x 2 n ⋮ y m = a 0 + a 1 x m + a 2 x m 2 + ⋯ + a n x m n \begin{aligned} y_1&=a_0+a_1x_1+a_2x_1^2+\cdots +a_nx_1^n\\ y_2&=a_0+a_1x_2+a_2x_2^2+\cdots +a_nx_2^n\\ \vdots\\ y_m&=a_0+a_1x_m+a_2x_m^2+\cdots +a_nx_m^n\\ \end{aligned} y1y2ym=a0+a1x1+a2x12++anx1n=a0+a1x2+a2x22++anx2n=a0+a1xm+a2xm2++anxmn

令:
多项式拟合一般方程法详细推导

多项式拟合一般方程法详细推导

多项式拟合一般方程法详细推导

则上面的方程组可以写为:
A b = f Ab=f Ab=f
拟合过程就是求 b b b的过程

3 求 b b b

现在一个很直观的想法,就是:
A b = f b = A − 1 f \begin{aligned} Ab=f\\ b=A^{-1}f \end{aligned} Ab=fb=A1f
但是,没这么简单。考虑一下矩阵维度
A [ m , n + 1 ] b [ n + 1 , 1 ] = f [ m , 1 ] A_{[m,n+1]}b_{[n+1,1]}=f_{[m,1]} A[m,n+1]b[n+1,1]=f[m,1]
强行规定输入的 x = [ x 1 , x 2 , . . . , x m ] x=[x_1,x_2,...,x_m] x=[x1,x2,...,xm]不能重复,则 A A A的各个列向量都线性无关

  • m = n + 1 m=n+1 m=n+1时, A A A是可逆矩阵,可以直接计算

  • m < n + 1 m<n+1 m<n+1时,方程数少于未知数个数,方程不可解,拟合失败

  • m > n + 1 m>n+1 m>n+1时,怎么算呢?

    正交矩阵

    对于一个矩阵A,如果有 A A T = E AA^T=E AAT=E,则称之为正交矩阵

    QR分解

    将一个矩阵A,分解为一个正交矩阵和一个非奇异上三角阵的过程
    A [ m , n + 1 ] = Q [ m , n + 1 ] R [ n + 1 , n + 1 ] A_{[m,n+1]}=Q_{[m,n+1]}R_{[n+1,n+1]} A[m,n+1]=Q[m,n+1]R[n+1,n+1]
    其中 Q Q Q是正交矩阵, R R R是非奇异上三角阵

    那么,如何进行QR分解呢?

    施密特正交化

    这个请大家自行学习。

    完成QR分解后
    A b = f Q R b = f R b = Q T f b = R − 1 Q t f \begin{aligned} Ab &= f\\ QRb&=f\\ Rb&=Q^Tf\\ b&=R^{-1}Q^tf \end{aligned} AbQRbRbb=f=f=QTf=R1Qtf

matlab测试函数

测试数据
多项式拟合一般方程法详细推导

%% 准备测试数据
x=1:0.1:50;
y=0.001*x.^4+100*rand(size(x));

plot(x,y,'b')
title('测试数据')

拟合与测试

多项式拟合一般方程法详细推导

%% 拟合
n=4;
c = mypolyfit(x',y',n);
%% 测试效果
y1 = mypolyval(c,x');
plot(x,y,'b',x,y1','r')
title('测试拟合效果')

mypolyfit函数

function c = mypolyfit(x,f,n)
A = x.^(0:n);
c = A\f;

mypolyval函数

function y = mypolyval(c,s)
n = length(c)-1;
B = s.^(0:n);
y = B*c;