Matlab实现线性插值、抛物插值、牛顿插值、拉格朗日插值、分段抛物插值、分段线性插值

目录

 

线性插值 

原理

流程图

 代码

 抛物插值

原理

流程图

 代码

 拉格朗日插值

代码

牛顿插值

原理

代码

分段线性插值

代码


线性插值 

原理

流程图

 单个点的线性插值代码

X=[0.2 0.4];
Y=[21 25];
x=0.7;
x0=X(1)
y0=Y(1);
x1=X(2);
y1=Y(2);


L0=(x-x1)/(x0-x1);
L1=(x-x0)/(x1-x0);
y=y0*L0+y1*L1;

多个点的线性插值代码

time = [1 3 8 12 15 20 24];
tem = [8 9 16 23 22 18 10];
time_i = 1:0.01:24;
tem_i = self_interp1(time,tem,time_i,'linear');
plot(time,tem,'o',time_i,tem_i);

%自己写一个interp1类似功能的接口
%在这个接口中参数x需要从大到小排列,y随意
function [yi]=self_interp1(x,y,xi,method)
% 初始化yi,给它xi对应的列
col_xi = size(xi,2);
yi = zeros(1,col_xi);
% 检测使用的插值方法 这里期望的是'linear'
if strcmp(method,'linear')
    % 找到每个xi在x序列中的位置
    col_x = size(x,2);
    for i = 1:col_xi,
        for j = 1:col_x-1, 
            % 假如需要计算插值公式
            if x(j+1) > xi(i), 
                yi(i) = y(j)+(y(j+1)-y(j))/(x(j+1)-x(j))*(xi(i)-x(j));
                break;
            end
            % 假如插值处的数据已经测得了,就直接把值给它,节约计算资源
            if x(j) == xi(i),
                yi(i) = y(j);
                break;
            end
        end
        % 以上没有把最后一个数据点考虑进去,需要加上
        yi(col_xi) = y(col_x);
    end
else
    error('插值方法请选择(linear)\n');
end
end

 抛物插值

原理

流程图

 代码

X=[0.2 0.4 0.6];
Y=[21 25 23];
x0=X(1);
x1=X(2);
x2=X(3);
y0=Y(1);
y1=Y(2);
y2=Y(3);
x=0.7;

L0=(x-x1)*(x-x2)/(x0-x1)/(x0-x2);
L1=(x-x0)*(x-x2)/(x1-x0)/(x1-x2);
L2=(x-x0)*(x-x1)/(x2-x0)/(x2-x1);

y=y0*L0+y1*L1+y2*L2

 拉格朗日插值

代码

x=[0.2 0.4 0.6 0.8];
y=[21 25 23 20];
yh=lagrange(x,y,0.7)

function yh=lagrange (x,y,xh)
    n = length(x);
    m = length(xh);
    yh = zeros(1,m); 
    c1 = ones(n-1,1);
    c2 = ones(1,m);
    for i=1:n
      xp = x([1:i-1 i+1:n]);
      yh = yh + y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2));
    end
end

牛顿插值

原理

 

代码

xi=[1 4 9];
yi=[1 2 3];
x=7;
p= Newton_fun(x,xi,yi)


function p= Newton_fun(x,xi,yi)
n=length(xi);
f=zeros(n,n);

% 对差商表第一列赋值
for k=1:n      
    f(k)=yi(k);
end
% 求差商表
for i=2:n       % 差商表从0阶开始;但是矩阵是从1维开始存储!!!!!!
    for k=i:n
        f(k,i)=(f(k,i-1)-f(k-1,i-1))/(xi(k)-xi(k+1-i));  
    end
end
disp('差商表如下:');
disp(f);

%求插值多项式
p=0;          
for k=2:n
    t=1;
    for j=1:k-1
        t=t*(x-xi(j));
        disp(t)
    end
    p=f(k,k)*t+p;
    disp(p)
end
p=f(1,1)+p;

end

分段线性插值

原理

 

代码

x = [1 3 8 12 15 20 24];
y = [8 9 16 23 22 18 10];

yy=fdxx(x,y,7)

function yy=fdxx(x,y,xx)
    n=size(x,2);
    for i=1:n-1
        if x(i)<xx&&xx<x(i+1)
            L1=(xx-x(i+1))/(x(i)-x(i+1));
            L2=(xx-x(i))/(x(i+1)-x(i));
            yy=L1*y(i)+L2*y(i+1);
            break;
        elseif x(i)==xx
             yy=y(i);      
        end
    end
    
end

分段抛物插值

原理

代码

x = [1 3 8 12 15 20 24];
y = [8 9 16 23 22 18 10];
y=fenduanpaowu(x,y,7)

function y=fenduanpaowu(xi,yi,x)
    n=size(xi,2);
    if x<xi(2)
        L1=(x-xi(1))*(x-xi(3))/(xi(1)-xi(2))/(xi(1)-xi(3));
        L2=(x-xi(1))*(x-xi(3))/(xi(2)-xi(1))/(xi(2)-xi(3));
        L3=(x-xi(1))*(x-xi(2))/(xi(3)-xi(1))/(xi(3)-xi(2));
        y=L1*yi(1)+L2*yi(2)+L3*yi(3);
    elseif x>xi(end-1)
        L1=(x-xi(end-1))*(x-xi(end))/(xi(end-2)-xi(end-1))/(xi(end-2)-xi(end));
        L2=(x-xi(end-2))*(x-xi(end))/(xi(end-1)-xi(end-2))/(xi(end-1)-xi(end));
        L3=(x-xi(end-2))*(x-xi(end-1))/(xi(end)-xi(end-2))/(xi(end)-xi(end-1));
        y=L1*yi(1)+L2*yi(2)+L3*yi(3);
   else
        for k=2:n-1
            if xi(k+1)>x  
                if abs(x-xi(k))<abs(x-xi(k+1))
                    i=k-1;
                    
                else
                    i=k;
                end
                L1=(x-xi(i+1))*(x-xi(i+2))/(xi(i)-xi(i+1))/(xi(i)-xi(i+2));
                L2=(x-xi(i))*(x-xi(i+2))/(xi(i+1)-xi(i))/(xi(i+1)-xi(i+2));
                L3=(x-xi(i))*(x-xi(i+1))/(xi(i+2)-xi(i))/(xi(i+2)-xi(i+1));
                y=L1*yi(i)+L2*yi(i+1)+L3*yi(i+2);
            end
        end
   end
    
end

  • 48
    点赞
  • 368
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我来回答你的问题。 1. 分段线性插值 分段线性插值的思路是将一条曲线分成若干个小线段,每个小线段近似为一条直线,然后再将这些小线段拼接起来。在 MATLAB 中,可以使用 interp1 函数实现分段线性插值。具体用法如下: ```matlab % 定义原始数据点 x = [1, 2, 3, 4, 5]; y = [2, 4, 3, 1, 2]; % 定义插值点 xi = 1:0.1:5; % 在 x 轴上取 0.1 个单位间隔的点 % 进行分段线性插值 yi = interp1(x, y, xi, 'linear'); % 绘制原始曲线和插值曲线 plot(x, y, 'o', xi, yi, '-') ``` 2. 分段抛物插值 分段抛物插值的思路是将一条曲线分成若干个小线段,每个小线段近似为一个二次函数,然后再将这些二次函数拼接起来。在 MATLAB 中,可以使用 spline 函数实现分段抛物插值。具体用法如下: ```matlab % 定义原始数据点 x = [1, 2, 3, 4, 5]; y = [2, 4, 3, 1, 2]; % 定义插值点 xi = 1:0.1:5; % 在 x 轴上取 0.1 个单位间隔的点 % 进行分段抛物插值 yi = spline(x, y, xi); % 绘制原始曲线和插值曲线 plot(x, y, 'o', xi, yi, '-') ``` 3. 四次牛顿差值近似计算 四次牛顿差值的思路是将一组数据点拟合成一个四次多项式,然后使用这个多项式来近似计算插值点的函数值。在 MATLAB 中,可以使用 polyfit 和 polyval 函数实现四次牛顿差值近似计算。具体用法如下: ```matlab % 定义原始数据点 x = [1, 2, 3, 4, 5]; y = [2, 4, 3, 1, 2]; % 定义插值点 xi = 1:0.1:5; % 在 x 轴上取 0.1 个单位间隔的点 % 进行四次牛顿差值近似计算 p = polyfit(x, y, 4); % 拟合成一个四次多项式 yi = polyval(p, xi); % 绘制原始曲线和插值曲线 plot(x, y, 'o', xi, yi, '-') ``` 希望这些代码可以帮助你实现分段线性插值分段抛物插值和四次牛顿差值近似计算。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千禧皓月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值