MatLab(3)

拉格朗日插值

function[y] = Lagrange(x)
a = [25 40 50 60];
b = [95 75 63 54];
n = 4;
sum = 0;
for k = 1:n
    pro = 1;
    for i = 1:n
        if i ~= k
            pro = pro * (x - a(i))/(a(k) - a(i));
        end
    end
    sum = sum + b(k) * pro;
end
y = sum;
end

 

牛顿插值法

function[y] = Newton(x)
n = 10;
T = zeros(n,n);
a = zeros(1,n);
b = [67.052 68.008 69.803 72.024 73.400 72.063 74.669 74.487 74.065 76.777];
a(1) = 1994;
for i = 2:n
    a(i) = a(i - 1) + 1;
end
for i = 1:n
    T(i,1) = b(i);
end
for i = 2:n
    for j = 2:i
        T(i,j) = (T(i-1,j-1) - T(i,j-1))/(a(i - j + 1) - a(i));
    end
end
sum = b(1);
pro = ones(n - 1);
pro(1) = x - a(1);
for i = 2:n-1
    pro(i) = pro(i - 1) * (x - a(i));
end
for i = 2:n
    sum = sum + T(i,i) * pro(i - 1);
end
y = sum;
m = [a x];
n = [b sum];
end

三次插条

x=[0,1,2,3];
y=[3,5,4,1];
y0=1;
yn=1;

M=spline_2(x,y,y0,yn);
disp(M);
M=[y0;M;yn];


x1=0:0.1:3;
s=zeros(size(x1,2),1);
a=[];
b=[];
for j=1:size(x1,2)
    for i=1:(size(x,2)-1)       
        if x(i)<=x1(j)&&x1(j)<=x(i+1)
             p1=M(i)*(x(i+1)-x1(j))^3/(6*(x(i+1)-x(i)));
             p2=M(i+1)*(x1(j)-x(i))^3/(6*(x(i+1)-x(i)));
             p3=(y(i)-M(i)*(x(i+1)-x(i))^2/6)*(x(i+1)-x1(j))/(x(i+1)-x(i));
             p4=(y(i+1)-M(i+1)*(x(i+1)-x(i))^2/6)*(x1(j)-x(i))/(x(i+1)-x(i));
            s(j,1)=p1+p2+p3+p4;
            a=[a x1(j)];
            b=[b s(j)];
        end
    end
end
hold on
grid on
plot(a,b);


function M=spline_2(X,Y,y0,yn)
n=length(X); 
A=zeros(n,n);
A(:,1)=Y';
D=zeros(n-2,n-2);
d=zeros(n-2,1);

for  j=2:n
    for i=j:n
        A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1));
    end
end

%求h_i
for i=1:n-1
    h(i)=X(i+1)-X(i);
end

%求mu_i,lamda_i
for i=2:n-2
    mu(i)=h(i)/(h(i)+h(i+1));
    lamda(i-1)=h(i)/(h(i-1)+h(i));
    D(i-1,i)=lamda(i-1);
    D(i,i-1)=mu(i);
end
 
%求d_i
for i=1:n-2
     D(i,i)=2;
     if (i==1)
         d(i,1)=(6/(h(i+1)+h(i)))*(A(i+2,2)-A(i+1,2))-h(i)/(h(i)+h(i+1))*y0;
     elseif (i==(n-2))
         d(i,1)=(6/(h(i+1)+h(i)))*(A(i+2,2)-A(i+1,2))-(1-h(i)/(h(i)+h(i+1)))*yn;
     else
         d(i,1)=(6/(h(i+1)+h(i)))*(A(i+2,2)-A(i+1,2));
     end             
end
M=D\d;
end


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值