我被分配了一个任务,我应该在其中编写一个算法,该算法通过重心公式执行多项式插值。公式指出:
p(x) = (SIGMA_(j=0 到 n) w(j)*f(j)/(x - x(j)))/(SIGMA_(j=0 到 n) w(j)/(x - x(j)))
我编写了一个运行良好的算法,并且得到了我想要的多项式输出。然而,这需要使用一些相当长的循环,并且对于大的网格数,将不得不进行许多讨厌的循环操作。因此,如果有人对我如何改进这一点有任何提示,我将不胜感激,这样我就可以避免所有这些循环。
在算法中,x
代表f
我们应该插值的给定点。 w
代表重心权重,在运行算法之前已经计算过。并且grid
是应该进行插值的 linspace:
function p = barycentric_formula(x,f,w,grid)
%Assert x-vectors and f-vectors have same length.
if length(x) ~= length(f)
sprintf('Not equal amounts of x- and y-values. Function is terminated.')
return;
end
n = length(x);
m = length(grid);
p = zeros(1,m);
% Loops for finding polynomial values at grid points. All values are
% calculated by the barycentric formula.
for i = 1:m
var = 0;
sum1 = 0;
sum2 = 0;
for j = 1:n
if grid(i) == x(j)
p(i) = f(j);
var = 1;
else
sum1 = sum1 + (w(j)*f(j))/(grid(i) - x(j));
sum2 = sum2 + (w(j)/(grid(i) - x(j)));
end
end
if var == 0
p(i) = sum1/sum2;
end
end