Несогласованные аргументы полинома Лагранжа (октава)

Я работаю над октавой, не уверен, что она будет работать в 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, если я попытаюсь оценить, например, лагранж (3,x0,y0) в конкретная точка, функция работает правильно и нет проблем с ней, проблема в том, что вы используете больший вектор для х,

Итак, мой вопрос: есть ли способ, которым я могу изменить функцию, чтобы она работала с большим вектором x, или есть способ, которым я могу построить функцию, не используя больший вектор непосредственно в функции?

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 он используется не так часто, как в некоторых других языках, возможно потому, что размещение двух операндов рядом делает ошибки в выборе двоичной операции более очевидными.

Другие вопросы по тегам