插值与拟合——插值

插值的引入

在科研或生产实践中,有时只能通过测量得到一个函数在一些离散点处的函数值,而我们想得到在任意点处的函数值,称为插值。
对于一元的情况就是,已知数据点(xi,yi),要求构造函数y=P(x), 使得yi=P(xi)。(P(x)一般是多项式或者是分段多项式函数)
显然,只有数据点精度较高时,插值才有意义。
否则,不需要函数严格经过所有数据点,只要函数尽量靠近所给数据点就可以了

多项式插值的求解

给定n个点(x1,y1), (x2,y2),…(xn,yn),构造一个n-1次多项式
y=P (x),使得P(xi)=yi(假设数据集取自函数y= 1 1 + x 2 \frac{1}{1 + x^2} 1+x21

方法一:通过求解线性方程组
设数据点(xi,yi 是 y=1 ./(1+x.^2),[-5, 5] ,n个等距节点
构造n-1次多项式P(x),使得P(xi)= yi( i =1, … ,n)

P(x)= p(1)*x(n-1) + p(2)*x(n-2) +…+p(n-1)*x + p(n)

根据插值条件P(xi)=yi,i = 1,2,… ,n, 可以得到

p(1)*x(1)(n-1) + p(2)*x(1)(n-2) +…+p(n-1)*x(1) + p(n) = y(1)
p(1)*x(2)(n-1) + p(2)*x(2)(n-2) +…+p(n-1)*x(2) + p(n) = y(2)

p(1)*x(i)(n-1) + p(2)*x(i)(n-2) +…+p(n-1)*x(i) + p(n) = y(i)

p(1)*x(n)(n-1) + p(2)*x(n)(n-2) +…+p(n-1)*x(n) + p(n) = y(n)

写成矩阵的形式:A*p=y
其中,A是系数矩阵,则, p = A \ y 或者 p = inv(A ) * y

p= [ p ( 1 ) p ( 2 ) . . . p ( n ) ] \begin{bmatrix} p(1)\\ p(2)\\...\\p(n)\end{bmatrix} p(1)p(2)...p(n)

y= [ y ( 1 ) y ( 2 ) . . . y ( n ) ] \begin{bmatrix} y(1)\\ y(2)\\...\\y(n)\end{bmatrix} y(1)y(2)...y(n)

A= [ x ( 1 ) n − 1 x ( 1 ) n − 2 . . . x ( 1 ) 1 x ( 2 ) n − 1 x ( 2 ) n − 2 . . . x ( 2 ) 1 . . . . . . x ( n ) n − 1 x ( n ) n − 2 . . . x ( n ) 1 ] \begin{bmatrix} x(1)^{n-1}&x(1)^{n-2}&...&x(1)&1\\ x(2)^{n-1}&x(2)^{n-2}&...&x(2)&1\\...&&...\\x(n)^{n-1}&x(n)^{n-2}&...&x(n)&1\end{bmatrix} x(1)n1x(2)n1...x(n)n1x(1)n2x(2)n2x(n)n2............x(1)x(2)x(n)111

A(:,1)=x.^(n-1)
A(:,2)=x.^(n-2)

A(:,j)=x.^(n-j)

A(:,n)=x


n=11;
%设数据点(xi,yi, y=1 ./1+x.^2),[-5, 5] ,n个等距节点

f0 = @(x) 1 ./ (1+x.^2);
figure
fplot(f0, [-5. 5], 'b-'); %数据集函数
hold on
x=linspace(-5,5,n);
y=f0(x);
plot(x,y,'rd', 'MarkerSize', 10);  %数据点的位置
x = x';
y = y';
A=zeros(n);


%赋初值(两种方法均可)
for i=1:n
    A(: , i) = x.^(n-i);
end
% for i =1:n
%     for j=1:n
%         A(i, j) = x()
%     end
% end

%求解线性方程组, A*p=y
 p = A \ y;
 
%画多项式曲线(下列两种方法均可)
%  x0 = -5: 0.01: 5;
%  y0 = polyval(p, x0);
%  plot(x0, y0, 'b-', 'LineWidth', 3);
 f=@(x) polyval(p, x);
 fplot(f, [-5, 5], 'm--');  %插值曲线的图像
 

求得的曲线如下:
在这里插入图片描述
当我们增大n的取值时,如取n=21,我们可以得到
在这里插入图片描述
可以发现,当 n 的取值增大时,所求得的插值曲线更接近原曲线。

开普勒小行星问题求解

例题:
在这里插入图片描述

分析:
在这里插入图片描述
代码实现,如下

x=[4.5596, 5.0816, 5.5546, 5.9636, 6.2756]';
y=[0.8145, 1.3686, 1.9895, 2.6925, 3.5265]';

A=[x.^2, 2*x.*y, y.^2, 2*x, 2*y];
b=repmat(-1, 5, 1);
pa=A\b;
%椭圆的方程pa(1)*x^2 + pa(2)*x*y + pa(3)*y^2
%                     +2*pa(4)*x+2*pa(5)*y+1=0
%画f(x,y)=0的图形,可以用ezplot或者fimplicit
x0=x;y0=y;
syms x y
f =pa(1)*x^2 + 2*pa(2)*x*y + pa(3)*y^2+...
    2*pa(4)*x+2*pa(5)*y+1;
hold on
h=ezplot(f,[-2,7,-2,7]); %求得的插值曲线(行星运动轨道)
title('小行星运动轨道');
set(h,'Color','r','LineWidth',2)
axis equal

plot(x0,y0,'b+','MarkerSize',10,'LineWidth',3) %数据点的位置
plot(0,0,'ro','MarkerSize',10,'MarkerFaceColor','r') %太阳的位置

画出的图形为:
在这里插入图片描述
一道很有意思的习题

MATLAB 自定义插值函数

一维插值
Matlab中一维插值的函数:interp1

格式:Y1=interp1(X,Y,X1,‘method’)

功能:根据X,Y的值,计算函数在X1处的值
参数说明:
X是由已知的数据点的x坐标构成的向量;
Y是由已知的数据点的y坐标构成的向量;
X1描述欲插值点的x坐标(可以是标量、向量或矩阵);
Y1是一个与X1等长的插值结果。

method是插值方法,可用的方法有:

‘linear’ 默认方法,线性插值。
‘nearest’ 最邻近插值。
‘spline’ 三次样条插值。
‘cubic’ 三次插值,要求x的值等距离。

注1:所有插值方法均要求x是单调的。
注2:X1的取值范围不能超出X的给定范围,否则,会给出“NaN”错误。
注3:样条插值也可以使用函数spline,格式为:

Y1=spline(X,Y,X1)

习题

在这里插入图片描述
解题大致思路,与上面的问题类似,直接使用函数求解即可
代码如下:

T=18:2:30;
LGD=[9.9618 9.9544 9.9468 9.9391 9.9312 9.9232 9.9150];
plot(T,LGD,'r-+')

%要求什么时间,f(t)= lgd(t) = 9.9352
 %方法一. 通过解非线性方程f(t)=lgd(t) = 9.9352
 
 %化成f(t)=lgd(t)-9.9352=0
f=@(t) interp1(T,LGD,t,'spline') - 9.9352;
t0=fzero(f,24.5)

%方法二. 根据观察,d(t)是单调下降的连续函数,所以他的反函数是存在
%即在给定的范围内,t也是lgd的函数

t1=interp1(LGD, T, 9.9352, 'spline')

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_49288154/article/details/122330331