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