MATLAB运用——多项式插值

简介: MATLAB运用——多项式插值

实验1-误差传播与算法稳定性

问题提出

考虑一个简单的由积分定义的序列

image.png

实验内容

由递推关系式(2)可以得到积分序列image.png的两种算法。

image.png

实验要求

从程序观察两种算法的稳定性,再从理论验证。

程序

function f2
%编写算法1和算法2的运行程序,得出序列值和误差
%绘图比较两种算法
Step=str2num(char(inputdlg('输入迭代步数n,要求n大于等于1','步数')));
if Step<1
    errordlg('输入迭代步数n,要求n大于等于1');
    return
end
Sd=str2num(char(inputdlg('输入有效数字','有效数字')));
format long;
%用库函数integral计算
for n=1:Step
    fun=@(x)x.^n.*exp(x-1);
    func(n)=integral(fun,0,1);
end
%算法一
digits(Sd);
func1(1)=vpa(1/exp(1));
for n=2:Step
    func1(n)=vpa(1-n*func1(n-1));
end
err1=abs(func1-func);
%算法二
digits(Sd);
func2(Step)=0;
for n=Step:-1:2
    func2(n-1)=vpa((1-func2(n)/n));
end
err2=abs(func2-func);
clf
subplot(1,2,1)
plot([1:Step],func,'b-');
hold on
plot([1:Step],func1,'g-');
grid on
hold on
plot([1:Step],func2,'r--');
xlabel('n');ylabel('En');
text(2,func1(2),'func1');text(4,func2(4),'func2');text(1,func2(1),'func');
subplot(1,2,2)
plot([1:Step],err1,'-');
grid on
hold on
plot([1:Step],err2,'r--');
text(2,err1(2),'err1');text(4,err2(4),'err2');
xlabel('n');ylabel('Err');

运行程序

当迭代步数为10,有效数字为7时

当迭代步数为50,有效数字为7时

可见,迭代次数比较小时,算法一的误差波动比较大。当迭代次数比较大时,算法一的误差会越大。相比下,算法二更为稳定。

理论

image.png

明显可见,当n越大,算法一的误差越大,而相反算法二的误差越小。


实验2-多项式插值的震荡和样条插值的收敛


问题提出

考虑在一个固定区间上用插值逼近一个函数,显然Lagrange插值中使用的节点越多,插值多项式的次数越高。那么,当插值多项式的次数增加时,插值多项式是否也更加逼近函数呢?下面给出一个例子模拟Runge震荡现象。同时也对比样条插值的收敛情况。


实验内容

设区间[-5,5]上函数

image.png

在区间上做等距划分,分点为

image.png

则拉格朗日多项式为

image.png

实验要求

(1)选择不断增大的分点数数目,画出原函数f ( x ),插值多项式函数image.png及3次样条插值函数在[-5,5]上的图像

(2)选择其他函数,例如定义在区间[-5,5]上的函数

image.png

(3)样条插值最早产生于工业部门,考虑如下问题,某汽车制造商用3次样条插值设计车门的曲线,其中一段的数据如下所示

f09399aa26cd9117f8239509e3130f97_20210518153820238.png

程序

(1)

function f2
%选择不同的函数和多项式次数,输出原函数、拉格朗日插值函数和三次样条插值函数的图像。
n=str2num(char(inputdlg('输入插值多项式的次数N:')));
Nb=char(inputdlg('请选择函数,f(x)、g(x)、h(x)分别对应f、g、h'));
switch Nb
    case 'f'
        func=@(x)1./(1+25*x.^2);
    case 'h'
        func=@(x)x./(1+x.^4);
    case 'g'
        func=@(x)atan(x);
end      
if n<1
    errordlg('插值多项式的次数输入错误');
    return;
end
x0=linspace(-5,5,n+1);
y0=feval(func,x0);
x=-5:0.1:5;
%拉格朗日插值
Lg=lagrange(x0,y0,x);
%样条插值插值
Sp=interp1(x0,y0,x,'spline');
%作图
clf;
subplot(1,2,1);
fplot(func,[-5,5],'r-');
hold on;
plot(x,Lg,'b--');
xlabel('x');ylabel('y');title('拉格朗日插值');
subplot(1,2,2);
fplot(func,[-5,5],'r-');
hold on;
plot(x,Sp,'b--');
xlabel('x');ylabel('y');title('样条插值');
function Lg=lagrange(x0,y0,x)
%x0为节点的x坐标
%y0为节点的y坐标
%x为插值点的x坐标
if (nargin==3)%当输入参数为3个时,输出对应的插值
    n=length(x0);
    m=length(x);
    for i=1:m
        l=0;
        for k=1:n
            s=1;
            for j=1:n
                if k~=j
                    s=s*(x(i)-x0(j))/(x0(k)-x0(j));
                end
            end
            l=l+s*y0(k);
        end
        Lg(i)=l;
    end
elseif (nargin==2)%当输入参数为2个时,输出插值多项式
    syms x;
    n=length(x0);
    l=0;
    for k=1:n
        s=1;
        for j=1:n
            if k~=j
                s=s*(x-x0(j))/(x0(k)-x0(j));
            end
        end
        Lg=l+s*y0(k);
        Lg=collect(Lg);
        Lg = vpa(Lg,6);
    end
end

(2)


x0=0:10;
y0=[0.8,0.0,0.79,1.53,2.19,2.71,3.03,3.27,2.89,3.06,3.19,3.29,0.2];
x=0:0.1:10;
cs=spline(x0,y0);%当端点斜率已知时,可以用两个额外元素指定值向量 y(一个元素在起点,一个元素在终点)以定义端点斜率。
y=ppval(cs,x);%ppval计算在插值区间中各点上的样条拟合。
plot(x,y)

运行程序

(1)选择函数f(x)

显然可见,当多项式次数越高,拉格朗日插值函数在区间两段发生明显的偏离,而使用三次样条插值函数则会无限逼近原函数。

(2)

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

目录
相关文章
|
6月前
|
机器学习/深度学习 算法 数据挖掘
【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法
【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法
163 0
|
6月前
matlab使用样条插值重采样估计INR数据研究
matlab使用样条插值重采样估计INR数据研究
|
6月前
|
编解码 算法 计算机视觉
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
|
6月前
|
索引
matlab快速入门(读取数据并绘制散点图和拉格朗日插值
matlab快速入门(读取数据并绘制散点图和拉格朗日插值
59 0
|
6月前
|
算法
MATLAB | 插值算法 | 一维interpl插值法 | 附数据和出图代码 | 直接上手
MATLAB | 插值算法 | 一维interpl插值法 | 附数据和出图代码 | 直接上手
221 0
|
6月前
|
算法
MATLAB | 插值算法 | 二维griddata插值法 | 附数据和出图代码 | 直接上手
MATLAB | 插值算法 | 二维griddata插值法 | 附数据和出图代码 | 直接上手
473 0
|
6月前
|
算法
MATLAB | 插值算法 | 一维Lagrange插值法 | 附数据和出图代码 | 直接上手
MATLAB | 插值算法 | 一维Lagrange插值法 | 附数据和出图代码 | 直接上手
194 0
|
6月前
|
存储 Serverless 定位技术
基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析
基于MATLAB的全局多项式插值法(趋势面法)与逆距离加权(IDW)法插值与结果分析
|
6月前
|
算法
【MATLAB】史上最全的5种数据插值算法全家桶
【MATLAB】史上最全的5种数据插值算法全家桶
103 0
|
3月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
199 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码