前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算数值分析实验1--使用不同方法实现插值

计算数值分析实验1--使用不同方法实现插值

作者头像
柳神
发布2024-05-30 20:59:08
900
发布2024-05-30 20:59:08
举报
文章被收录于专栏:清羽飞扬

不同方法插值算法实现

已知插值节点序列(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,'-');

总结

本次实验,我们完成了不同方法插值函数的编写,比较了几种插值方法的区别。收获很多,完美

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不同方法插值算法实现
    • 已知插值节点序列(xi , yi),i = 0,1,2,……,n,用 Lagrange 插值多项式L n (x)计算的函数f (x)在点x0的近似值。
      • 已知插值节点序列(xi , yi),i = 0,1,2,…,n,用牛顿(Newton)插值值多项式N (x)n计算的函数f (x)在点0 x的近似值。
        • 用线性函数p(x) = a + bx拟合给定数据(xi , yi),i = 0,1,2,…,m −1。
        • 不同方法插值调用尝试
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档