不一致的参数拉格朗日多项式(八度)

Nonconformant arguments lagrange polynomial (octave)

我在八度音阶上工作,不确定它是否会在 matlab 中 运行,我试图做一个简单的拉格朗日多项式来绘制点、函数和拉格朗日近似值,所以我做了以下操作,

clear all
clc

function [y] = lagrange(x, x0, y0)

   n = size(x0,1);
   y = 0;

    for i=1:n
        p = 1;
        for j=1:n

            if j == i   % avoiding division by 0
                continue;
            endif;

            p *= (x-x0(j)) / (x0(i)-x0(j));

        endfor;

        y += y0(i) * p;
    endfor;
endfunction;

x=[0:0.1:5];

x0=[2;2.75;4];
y0=[1/2;1/2.75;1/4];

y=lagrange(x,x0,y0);

我有以下问题,"operator *: nonconformant arguments (op1 is 1x41, op2 is 1x41)" 只有在 x 中使用向量时才会出现,如果我尝试在特定点评估例如 lagrange(3,x0,y0),函数工作正常,没有问题,问题是当你对 x 使用更大的向量时,

所以我的问题是,有没有一种方法可以修改函数,使其可以使用更大的向量 x,或者有一种方法可以在不直接在函数中使用更大向量的情况下绘制函数?

p *= (x-x0(j)) / (x0(i)-x0(j));

表示

p = p * (x-x0(j)) / (x0(i)-x0(j));

这个*表示矩阵乘法,不能将两个矩阵(1, 41)和(1, 41)相乘:内维不匹配

你需要的是逐元素乘法,

p = p .* (x-x0(j)) / (x0(i)-x0(j));

(有关差异的解释,请参阅 docs)。

可以写成

p .*= (x-x0(j)) / (x0(i)-x0(j));

但我建议避免这种收缩;在 Matlab/Octave 中,它不像在其他一些语言中那样被广泛使用,可能是因为将两个操作数并排放置会使二元运算选择中的错误更加明显。