Ошибка размеров матрицы при использовании norm()

Я пытаюсь использовать MATLAB для запуска итерации Ричардсона для вычисления решения линейной системы Ax=b. Я написал функцию для этого, но получил ошибку, когда попытался ее запустить. Ниже приведена моя функция, где x0 — начальная итерация, L — максимальное количество итераций, A — невырожденная матрица nxn, b — вектор длины n, a — вместо альфа-параметра, необходимого для алгоритма, tol — желаемый уровень точности, x — вектор длины n, а k — фактическое количество итераций:

function [x,k]=Richardson(x0,L,A,b,a,tol)
n = size(b);
x1 = x0 + a*(b-A*x0);
Norm = norm(x1-x0)/sqrt(n);
k = 1;
x0 = x1;
while (Norm > tol) && (k < L)
    x1 = x0 + a*(b-A*x0);
    Norm = norm(x1-x0)/sqrt(n);
    k = k + 1;
    x0 = x1;
end
x = x1;

Я попытался запустить эту функцию, используя следующее:

x0=[0;0;0];
L = 10;
A=[1,0,0;0,2,0;0,0,4];
b=[1;1;1];
a=-1;
tol=10.^(-5);

a1=Richardson(x0,L,A,b,a,tol)

Это была ошибка, которую я получил:

Error using  / 
Matrix dimensions must agree.

Error in Richardson (line 4)
Norm = norm(x1-x0)/sqrt(n);

Error in HW8 (line 11)
a1=Richardson(x0,L,A,b,a,tol)

Я не понимаю, как это происходит, потому что x0 и x1 оба являются векторами длины n. Я реализую это неправильно?


person Matt Robbins    schedule 28.03.2018    source источник
comment
Я настоятельно рекомендую изучить отладчик MATLAB. так что вы можете видеть, имеют ли ваши переменные размеры, которые, как вы думаете, они имеют.   -  person excaza    schedule 28.03.2018


Ответы (1)


n = size(b);

В результате получается вектор с двумя значениями (3,1 в вашем случае). Таким образом, вы не можете разделить одно значение на 2 значения. Измените на n = size(b,1) или n=size(b,2), чтобы получить то, что вам нужно (строки или столбцы).

person JLev    schedule 28.03.2018