不同方法插值算法实现
已知插值节点序列(xi , yi),i = 0,1,2,……,n,用 Lagrange 插值多项式L n (x)计算的函数f (x)在点x0的近似值。
代码语言:javascript复制function b = lagrange( x,y,x0 )
%实现拉格朗日插值汉书值的求解
% 此处显示详细说明
n = length(x);%总插值个数
D = x0;
p = 0.0;
for k=1:n
t = 1.0;
for i = 1:n
if i~=k
t = t * (D-x(i))/(x(k)-x(i));
end
end
p = p t*y(k);
end
b = p;
%plot(D,p);
end
已知插值节点序列(xi , yi),i = 0,1,2,…,n,用牛顿(Newton)插值值多项式N (x)n计算的函数f (x)在点0 x的近似值。
代码语言:javascript复制function ooo = newton( x,y,x0 )
%牛顿插值法
%此处显示详细说明
n=length(x);
f=zeros(n,n);
shangcha = zeros(n,n);
shangcha(1) = y(1);
for i=1:n%先把Y的数存起来~
f(i) = y(i);
end
%现在开始求解差商
for i=1:n
for k = 1:n-i
f(k) = (f(k 1)-f(k))/(x(k i)-x(k));
end
shangcha(i 1) = f(1);
end
%现在开始计算牛顿插值
x_x0=1;
F=0;
for i=1:n
F=F shangcha(i)*x_x0;
x_x0=x_x0*(x0-x(i));
end
ooo = F;
end
用线性函数p(x) = a bx拟合给定数据(xi , yi),i = 0,1,2,…,m −1。
代码语言:javascript复制function ooo = linearfitting( x,y )
%实现线性拟合
% 此处显示详细说明
n = length(x);
xk=0;
yk=0;
xkyk=0;
xk2=0;
for i=1:n
xk=xk x(i);
yk=yk y(i);
xk2=xk2 x(i)^2;
xkyk=xkyk x(i)*y(i);
end
syms a b;
eq1 = yk == n*a xk*b;
eq2 = xkyk == xk*a xk2*b;
s = solve(eq1,eq2,[a,b]);
ooo(1)=double(s.a);
ooo(2)=double(s.b);
end
不同方法插值调用尝试
代码语言:javascript复制%插值实例:main
n = input('插值等分为几块?');
X = -10:(10/n):10;%前后面是上下限,中间是步长,matlab会自动将从下限到上限的中间值按照步长进行划分并添加到数组里
%这里我们只研究从-10到10的函数
m = length(X);
Y = zeros(1,m);%创建全零数组,长度和X保持一致
syms x;%这里是定义了一个可以修改的局部变量,也就是自变量
f(x) = x^3 3^x-2*x;%这个是手动规定的函数
for i = 1:m
Y(i) = f(X(i));
end
x0 = input('n请输入你想要计算的插值');
ylagr=lagrange(X,Y,x0);
fprintf('你所想要得到的拉格朗日插值结果为:');
disp(ylagr);
ynewt=newton(X,Y,x0);
fprintf('你所想要得到的牛顿插值结果为:');
disp(ynewt);
plot(X,Y,'-',x0,ylagr,'o',x0,ynewt,'x');
ylim([-10,10]);
fprintf('下面是线性拟合内容:');
x = [2,4,4.6,5,5.2,5.6,6,6.6,7];
y = [5,3.5,2.7,2.4,2.5,2,1.5,1.2,1.2];
plot(x,y,'.');
hold on;
ab = linearfitting(x,y);
a = ab(1);
b = ab(2);
linex(1) = -10;
linex(2) = 10;
liney(1) = a b*linex(1);
liney(2) = a b*linex(2);
plot(linex,liney,'-');
总结
本次实验,我们完成了不同方法插值函数的编写,比较了几种插值方法的区别。收获很多,完美