实验四 插值算法的Matlab实现

【作业内容与要求】:对函数
f ( x ) = 1 1 + 9 x 2 f(x) = \frac{1}{1+9x^2} f(x)=1+9x21
进行插值。

  1. 在区间[-1, 1]上求出f(x)的10次Lagrange插值多项式 L 10 ( x ) L_{10}(x) L10(x),并且绘制图像;
  2. 在区间[-1, 1]上求出f(x)的10次一致逼近插值多项式 P 10 ( x ) P_{10}(x) P10(x),并且绘制图像;
  3. 将区间[-1, 1]10等分,进行分段线性插值,求出表达式,并且绘制图像。
  4. 将区间[-1, 1]10等分,进行三次样条插值(参考例4.5),求出表达式,并且绘制图像。

在区间[-1, 1]上求出f(x)的10次Lagrange插值多项式 L 10 ( x ) L_{10}(x) L10(x),并且绘制图像;

matlab代码如下:

% Lagrange1.m
%输入初始数据
clc;
% 插值区间为[-1,1]
x0 = -1:0.2:1;
y0= 1./(1+9*x0.^2);
x=-1:0.01:1;%插值计算点;一共有200个
m=length(x);
yx=zeros(m,1);

for k=1:m%分别对每一点进行插值
    tx=x(k);     %插值点
    n=length(x0);
    s=0;
    %进入迭代计算过程
    for j=1:n
        t=1;
     for i=1:n
         if i~=j
             t=t*(tx-x0(i))/(x0(j)-x0(i));
         end
     end
     s=s+t*y0(j);
    end
    yx(k)=s;
end
%画图显示结果
figure;
plot(x,yx,':m','LineWidth',2);
hold on;
plot(x0,y0,'-r','LineWidth',0.5);
grid on;
% % title('Lagrange插值时的Runge振荡现象');
xlabel('x轴');
ylabel('y轴');
legend('插值曲线','原曲线');

在区间[-1, 1]上求出f(x)的10次一致逼近插值多项式 P 10 ( x ) P_{10}(x) P10(x),并且绘制图像;

与(1)的不同在于先计算切比雪夫多项式 T 11 T_{11} T11的零点作为插值节点

matlab代码如下:

% Lagrange2.m
format long;

k = 1:1:11;
% 计算切比雪夫多项式T(11)的零点
x0 = cos((2*k-1)*pi/22);
y0 = 1./(1+9*x0.^2);
% 以下将切比雪夫多项式T(11)的零点作为插值节点进行Lagrange插值即可

x=-1:0.01:1;%插值计算点;一共有200个
m=length(x);
yx=zeros(m,1);

for k=1:m%分别对每一点进行插值
    tx=x(k);     %插值点
    n=length(x0);
    s=0;
    %进入迭代计算过程
    for j=1:n
        t=1;
     for i=1:n
         if i~=j
             t=t*(tx-x0(i))/(x0(j)-x0(i));
         end
     end
     s=s+t*y0(j);
    end
    yx(k)=s;
end
%画图显示结果
figure;
plot(x,yx,':m','LineWidth',2);
hold on;
plot(x0,y0,'-r','LineWidth',0.5);
grid on;
% % title('Lagrange插值时的Runge振荡现象');
xlabel('x轴');
ylabel('y轴');
legend('插值曲线','原曲线');

format short;

将区间[-1, 1]10等分,进行分段线性插值,求出表达式,并且绘制图像。

matlab代码如下:

%Lagrange3.m
%分段线性插值
%被插函数f(x)=1/(1+9*x^2),在区间[-1,1]上
clear;
clc;
x0 = -1:0.2:1;
y0 = 1./(1+9*x0.^2);

x=-1:0.01:1;%插值计算点;一共有200个
n=length(x0);
yx=zeros(length(x),1);
k=1;
i = 1;
for z=-1.0:0.01:1
    for i=1:n-1
        if (z >= x0(i)) && (z <= x0(i+1))
            yx(k)=(z-x0(i+1))/ (x0(i)-x0(i+1))*y0(i)+ (z-x0(i))/ (x0(i+1)-x0(i))*y0(i+1);
            break
        end
    end
    k= k+1;   
end

%画出分段线性插值以后得到的近似函数
figure;
plot(x,yx,':m','LineWidth',2);
hold on;
xlabel('x轴');
ylabel('y轴');
legend('插值曲线');

将区间[-1, 1]10等分,进行三次样条插值(参考例4.5),求出表达式,并且绘制图像。

依据例4.5,进行三次样条插值时调用系统函数spline

matlab代码如下:

% Lagrange4.m
% 三次样条插值
% 将区间[-1, 1]分为10等份,进行三次样条插值,得到插值后的分段3次样条函数
%在调用spline函数的时候,希望取得100个点
clear;
clc;
x0=-1:0.2:1; %将区间10等份,得11个插值节点
y0=1./(1+9*x0.^2);
x=-1:0.02:1; %在调用spline函数的时候,希望取得100个点上插值后的3次样条函数函数值

%进入迭代计算过程
y=spline(x0,y0,x); %x是向量,y也是向量;得到在100个点上的插值y.
plot(x,y,'r'); %以这100个节点为基础,画出y=1/(1+x^2)3次样条插值后得到的函数图形

hold on;
%end       

title('三次样条插值');
legend('10等份');
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值