4

我试图在matlab中制作这样的功能 在此处输入图像描述

但是,它必须是l_kwheres的数组k from 1 to n

在代码中:x- 一些向量(数组),z- 标量;in codew是 frac 的上半部分,g下半部分。

function out_l =  l_k(z, x)
%вычисления массива l_k для числа z
%x - узлы интерполяции
%z - значение для которог овычисляем значение полинома
n = size(x);
w = 1;
g = 1;
out_l = zeros(n);

for k = 1:n

    for j = 1:n
    %вычислим w
        for i=1:n
            if((i ~= k) && (i ~= j))
                w = w * (z - x(i));
            end
        end
    %вычислим g
        for i=1:n
            if(i ~= k)
                g = g * (x(k) - x(i));
            end
        end

    end
    out_l(k) =  (w/g);  
end
end

问题是 - 当涉及到这个循环时,它只是在第一次检查 if 语句后退出!穿什么?

 %вычислим w
            for i=1:n
                if((i ~= k) && (i ~= j))
                    w = w * (z - x(i));
                end
            end
        %вычислим g
            for i=1:n
                if(i ~= k)
                    g = g * (x(k) - x(i));
                end
            end
4

2 回答 2

1

如果您想要(返回维度的行向量,而不是标量)中的元素数量,则该行n = size(x);没有意义。试试吧。nsizen=numel(x);

稍后编辑:我还看到您像这样分配输出数据:out_l = zeros(n);,但您应该知道它会创建一个 nxn 矩阵,而不是您可能期望的数组。尝试out_l = zeros(1,n);改变。

还有另一个建议:如有疑问,请尽可能多地使用 F1 键。:-) Matlab 集成帮助非常擅长解释 Matlab 的东西。

于 2013-04-14T15:05:50.997 回答
1

Matlab 具有执行插值的嵌入式函数,例如interp1;(我可以在您的公式中识别拉格朗日插值函数)。

如果您想拥有自己的代码来评估拉格朗日插值函数,您应该考虑使用向量并避免循环,以使您的代码更快。

考虑以下:

x_n = 0:.3:1; % # interpolation nodes

k = 3;        % # we want for instance the function which is equal to 1 at 3rd node  

z = .5;       % # we want to evaluate the interpolant at z=.5


x_n_l = x_n;
x_n_l(k) = [];   % # we need all the nodes but the k-th

l_k = prod( z - x_n_l )/prod( x_n(k) - x_n_l ) % # this is your value

当然,您可以将代码包装在一个不错的函数中。

于 2013-04-14T15:30:04.070 回答