我试图在matlab中创建这样的功能
它必须是l_k
的数组k
from 1 to n
但是。
在代码中:x
- 一些向量(数组),z
- 标量;在代码w
中是压裂的上半部分,而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
答案 0 :(得分:1)
如果您希望n = size(x);
(n
中的元素数量返回维度的行向量而不是标量,则行size
没有意义。请改为n=numel(x);
。
稍后编辑:我也看到你像这样分配输出数据:out_l = zeros(n);
,但你应该知道它会创建一个nxn矩阵,而不是你想象的数组。请尝试out_l = zeros(1,n);
进行更改。
另一个建议是:如有疑问,请尽可能经常使用F1键。 :-) Matlab集成的帮助非常擅长解释Matlab的东西。
答案 1 :(得分: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
当然,您可以将代码包装在一个很好的函数中。