繁体   English   中英

拉格朗日插值法

Lagrange interpolation method

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我使用卷积和for循环(for循环太多)来使用Lagrange's method计算插值,这是主要代码:

function[p] = lagrange_interpolation(X,Y)
L = zeros(n);
p = zeros(1,n);


% computing L matrice, so that each row i holds the polynom L_i
% Now we compute li(x) for i=0....n  ,and we build the polynomial 

for k=1:n
    multiplier = 1;
    outputConv = ones(1,1);
    for index = 1:n
        if(index ~= k && X(index) ~= X(k))
            outputConv = conv(outputConv,[1,-X(index)]);
            multiplier = multiplier * ((X(k) - X(index))^-1);
        end
    end
    polynimialSize = length(outputConv);
    for index = 1:polynimialSize
        L(k,n - index + 1) = outputConv(polynimialSize - index + 1);
    end
    L(k,:) = multiplier .* L(k,:);
end

% continues 


end

对于用于计算l_i(x)循环而言,这些太多了(这是在最后一次计算P_n(x) = Sigma of y_i * l_i(x)之前完成的)。

有什么建议可以使其更加正式吗?

谢谢

2 个回复

是的,几个建议(在版本1的下方来实现): if回路可以结合for它上面(只是使index跳过k经由类似jr(jr~=j)下面); polynomialSize总是等于length(outputConv) ,它总是等于n (因为您有n个数据点,第(n-1)th具有n系数的多项式),所以最后的for循环和下一行也可以用简单的L(k,:) = multiplier * outputConv;

因此,我在http://en.wikipedia.org/wiki/Lagrange_polynomial上复制了该示例(并采用了它们的jm表示法,但对我来说j1:nm1:nm~=j ),因此初始化了看起来像

clear; clc;
X=[-9 -4 -1 7]; %example taken from http://en.wikipedia.org/wiki/Lagrange_polynomial
Y=[ 5  2 -2 9];
n=length(X); %Lagrange basis polinomials are (n-1)th order, have n coefficients
lj = zeros(1,n); %storage for numerator of Lagrange basis polyns - each w/ n coeff
Lj = zeros(n); %matrix of Lagrange basis polyns coeffs (lj(x))
L  = zeros(1,n); %the Lagrange polynomial coefficients (L(x))

那么v 1.0看起来像

jr=1:n; %j-range: 1<=j<=n
for j=jr %my j is your k
    multiplier = 1;
    outputConv = 1; %numerator of lj(x)
    mr=jr(jr~=j); %m-range: 1<=m<=n, m~=j
    for m = mr %my m is your index
        outputConv = conv(outputConv,[1 -X(m)]);
        multiplier = multiplier * ((X(j) - X(m))^-1);
    end
    Lj(j,:) = multiplier * outputConv; %jth Lagrange basis polinomial lj(x)
end
L = Y*Lj; %coefficients of Lagrange polinomial L(x)

如果您意识到l_j(x)的分子只是具有特定根的多项式,则可以进一步简化该函数,因为在matlab- poly中有一个不错的命令。 类似地,分母就是在X(j)处polyval因为存在polyval 因此,v 1.9:

jr=1:n; %j-range: 1<=j<=n
for j=jr
    mr=jr(jr~=j); %m-range: 1<=m<=n, m~=j
    lj=poly(X(mr)); %numerator of lj(x)
    mult=1/polyval(lj,X(j)); %denominator of lj(x)
    Lj(j,:) = mult * lj; %jth Lagrange basis polinomial lj(x)
end
L = Y*Lj; %coefficients of Lagrange polinomial L(x)

为什么是1.9版而不是2.0版? 好吧,可能有一种方法可以摆脱最后一个for循环,并全部写成一行,但是我现在想不起来-这是v 2.0的必备条件:)

而且,作为甜点,如果您想获得与维基百科相同的图片:

figure(1);clf
x=-10:.1:10;
hold on
plot(x,polyval(Y(1)*Lj(1,:),x),'r','linewidth',2)
plot(x,polyval(Y(2)*Lj(2,:),x),'b','linewidth',2)
plot(x,polyval(Y(3)*Lj(3,:),x),'g','linewidth',2)
plot(x,polyval(Y(4)*Lj(4,:),x),'y','linewidth',2)
plot(x,polyval(L,x),'k','linewidth',2)
plot(X,Y,'ro','linewidth',2,'markersize',10)
hold off
xlim([-10 10])
ylim([-10 10])
set(gca,'XTick',-10:10)
set(gca,'YTick',-10:10)
grid on

产生

标度基函数及其和

享受并随时重用/改进

尝试:

X=0:1/20:1; Y=cos(X) and create L and apply polyval(L,1). 
polyval(L,1)=0.917483227909543
cos(1)=0.540302305868140

为什么会有巨大的差异?

2 获取拉格朗日插值的多项式表示

我如何表示不完整的数学函数? 我需要做类似(x - constant) 等等。 我正在尝试制作一个程序来进行拉格朗日插值(在某些点上找到一个函数),因此我需要从一组已知值中创建一个我可以看到的函数(打印出来的东西)。 对不起,如果造成混淆。 ...

2014-09-23 20:29:41 2 101   f#
4 用Python拉格朗日插值-无法打印

这是我必须解决的问题: 编写程序以评估和绘制u(x)= 1 /(1 + x ^ 2)的Lagrange插值Iu(x)(对于介于-5和5之间的x)。对5,7,9,11,13执行此操作, 15点插值(5、7、9等数据点在-5和5之间,包括-5和5)。 您的结果应同时显示函数和内插。 到 ...

7 Fortran中拉格朗日插值的结果不正确

我编写了一个Fortran程序来计算两个数据集的Lagrange插值:x,G。 我无法正确评估定义的功能。 请查看我做错了什么,因为程序运行时,fxn的数字根本不准确(请参阅前两个程序(Matlab代码)以查看实际结果)。 它们由作者提供,是我试图在Fortran上模仿的内容: ...

2017-06-16 03:48:21 0 290   fortran
8 如何使用拉格朗日插值对图像进行上采样

我有一个作业,我需要使用一些插值方法对图像进行上采样。 我必须自己编写插值方法的代码,我认为我不能使用任何特殊的函数来为我神奇地做到这一点。 所以首先这里是我的主要内容: 这是我的拉格朗日插值方法的代码: 在这里困扰我的是我不知道如何将这两个部分结合起来。 更具体地说,我不确定应该如何将函数 ...

9 使用 NLsolve.jl 的拉格朗日乘数法

我想最小化距离函数||dz - z|| 在g(z) = 0的约束下。 我想用拉格朗日乘数来解决这个问题。 然后我使用NLsolve.jl来求解我最终得到的非线性方程。 但我总是以Zero: [NaN, NaN, NaN, NaN]结束Zero: [NaN, NaN, NaN, NaN]和Conv ...

2020-10-02 13:08:51 2 126   julia
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM