MATLAB之多项式插值
一、算法原理
函数解析式未知,但已知一些列点的函数值。如下表所示,对于n+1个点,我们可以找到一个次数不超过n的插值多项式。
,称f为x的n次插值多项式。
x0 | x1 | x2 | x3 | ...... | xn |
f(x0) | f(x1) | f(x2) | f(x3) | ...... | f(xn) |
将表中的n+1个点带入,即可得到n+1个插值多项式,
an*X0^n+a(n-1)*X0^(n-1)+....+a1*X0+a0=f(x1); |
an*X1^n+a(n-1)*X1^(n-1)+....+a1*X1+a0=f(x1); |
...... |
an*Xn^n+a(n-1)*Xn^(n-1)+....+a1*Xn+a0=f(x1); 在该插值多项式中x,f(x)已知,未知系数为a0 a1 a2...an; 将其写成矩阵形式: x0^n x0^(n-1)......x0^1 1 [an [f(x0) x组成的行列式为范德蒙德行列式 =可写成vander(x0 x1 ... x(n-1) xn) ,系数an...a1 a0 为列矩阵 ,f(x) 为列矩阵 |
二、matlab代码
clc
clear
close
x=[1 2 3 4 5 6]; %一系列插值点
y=[2 5 6 9 14 26];
plot(x,y,'o'); %绘制出散点图
hold on
A=vander(x); %利用范德蒙矩阵生成插值多项式系数矩阵
%[x1^n x1^(n-1)......x1 1 [an
% x2^n x2^(n-1)......x2 1 a(n-1)
% ...... * ...... =y
% ...... ......
% xk^n xk^(n-1)......xk 1] a0]
y=y';
B=[A,y]; %生成增广矩阵
C=rref(B);% 化最简型,解方程组
D=C(:,end);
fprintf('\n 这是一个%d阶的多项式,从高阶到低阶排列!\n',length(y)-1);
x=x(1):0.01:x(end); %绘制拟合曲线
y=polyval(D,x)% 写出拟合曲线方程
plot(x,y) %绘图