1

我在 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);

我遇到了以下问题,“运算符 *:不一致的参数(op1 是 1x41,op2 是 1x41)”仅在使用 x 中的向量时出现,如果我尝试评估例如 lagrange(3,x0,y0) in一个特定的点,该函数可以正常工作并且没有问题,问题是当您对 x 使用更大的向量时,

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

4

1 回答 1

1

线

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));

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

它可以写成

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

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

于 2017-03-22T21:36:54.057 回答