拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)

题目一:

1.用表1-1中的世界人口统计数值估计1980年的人口
表 1-1:

人口
1960 3 039 585 530
1970 3 707 475 887
1990 5 281 653 820
2000 6 079 603 571

要求采用Lagrange插值:
(a) 采用经过1970和1990年估计值的直线;
(b) 经过1960年、1970年以及1990年估计值的抛物线;
© 经过全部4个数据点的三次曲线。

拉格朗日插值:

1.原理拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第1张图片
图1 Lagrange插值法计算的程序框图:
拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第2张图片
2.matlab代码:
要求采用Lagrange插值:

function p = LagrangePoly(xi,yi)
    syms t;
    p = 0;
    n = length(xi);
    for i = 1:n
        v = 1;
        for j = 1:n
            if i ~= j
                v = v * (t - xi(j))/(xi(i) - xi(j));
            end
        end
        p = p + v * yi(i);
    end
    p = simplify(p);
end

(a)采用经过1970和1990年估计值的直线:

x=[1970,1990];
y=[3707475887,5281653820];
xi=1980;
poly=LagrangePoly(x,y);
yi=subs(poly,'t',xi);
plot(x,y,'o',xi,yi,'*');

运行结果:
拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第3张图片
(b)经过1960年、1970年以及1990年估计值的抛物线:

x=[1960,1970,1990];
y=[3039585530,3707475887,5281653820];
xi=1980;
poly=LagrangePoly(x,y)
yi=subs(poly,'t',xi)
plot(x,y,'o',xi,yi,'*')

运行结果:
拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第4张图片
(c)经过全部4个数据点的三次曲线:

x=[1960,1970,1990,2000];
y=[3039585530,3707475887,5281653820,6079603571];
xi=1980;
poly=LagrangePoly(x,y);
yi=subs(poly,'t',xi);
plot(x,y,'o',xi,yi,'*')

运行结果:
拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第5张图片

题目二:

世界石油产量以每天百万桶计,如表1-2所示。估计2010年的石油产量(备注:不需要2010年的真实石油产量,目的分析高次插值的局限性)。要求采用Newton插值。
(a) 采用线性插值;
(b) 采用经过全部数据点的9次多项式。
表1-2:

桶/天(×10^6) 桶/天(×10^6)
1994 67.052 1999 72.063
1995 68.008 2000 74.669
1996 69.803 2001 74.487
1997 72.024 2002 74.065
1998 73.400 2003 76.777

牛顿法:

1.原理:
拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第6张图片
2.matlab代码:
要求采用Newton插值:

function c = newtoninterp(xi,yi)
    n = length(xi);
    for i = 1:n
        for j = 1:n
            t(i,j) = 0;
        end
    end
    for j = 1:n
        t(j,1) = yi(j);
    end
    for i = 2:n
        for j = i:n
            t(j,i) = (t(j,i -1) - t(j - 1,i - 1))/(xi(j) - xi(j - i + 1));
        end
    end
    for i = 1:n
        c(i) = t(i,i);
    end
end
拉格朗日:
function v = Lagrange(x,y,u)
n = length(x);
v = zeros(size(u));
for k = 1:n
    w = ones(size(u));
    for j = [1:k-1 k+1:n]
        w = (u - x(j))./(x(k) - x(j)).*w;
    end
    v = v + w * y(k);
end
end

(a)采用线性插值:

x=[1994,2003];
y=[67052000,76777000];
xi=2010;
poly=newtoninterp(x,y)
yi=subs(poly,'t',xi)
plot(x,y,'o',xi,yi,'*')

运行结果:

拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第7张图片
(b)采用经过全部数据点的9次多项式:

x=1994:1:2003;
xi=2004:1:2010;
y=[67.052,68.008,69.803,72.024,73.400,72.063,74.669,74.487,74.065,76.777];
yi=Lagrange(x,y,xi)
plot(x,y,'o',xi,yi,'*')

运行结果:
拉格朗日插值和牛顿插值原理及使用(代码环境:matlab)_第8张图片

你可能感兴趣的:(拉格朗日插值和牛顿插值原理及使用(代码环境:matlab))