matlab的雅可比迭代法,给我矩阵的维数一定要一致

matlab的雅可比迭代法,给我矩阵的维数一定要一致,matlab,matrix,Matlab,Matrix,下面是我执行jacobi迭代以求解Ax=b的代码。 我在矩阵A=[4-11;4-81;-2-15]和b=[7-21 15]上尝试这个代码。 x是一个初值为1x3的向量。这些尺寸不对吗?它给出了计算代码中的错误:r=b-x*A 和M\(x*N+b) 我错过了什么?!?我该如何解决这个问题?请帮忙 function [x, error, iter, flag] = jacobi(A, x, b, maxiter, tol) %implement jacobi iterations %[x, err

下面是我执行jacobi迭代以求解Ax=b的代码。 我在矩阵
A=[4-11;4-81;-2-15]
b=[7-21 15]
上尝试这个代码。 x是一个初值为1x3的向量。这些尺寸不对吗?它给出了计算代码中的错误:
r=b-x*A
M\(x*N+b)

我错过了什么?!?我该如何解决这个问题?请帮忙

function [x, error, iter, flag] = jacobi(A, x, b, maxiter, tol)

%implement jacobi iterations
%[x, error, iter, flag] = jacobi(A, x, b, maxiter, tol)
%jacobi.m solves the linear system Ax=b using the Jacobi iteration
%
%
%INPUT A       the matrix of the system Ax=b
%      x       the first guess vector Ax=b
%      b       the vector in the system
%      maxiter the maximum number of iteration to perform
%      tol     the tolerance
%
%OUTPUT x      the solution vector
%       error  error norm
%       niter  the number of iterations it took
%       flag   indicates whether a solution was found. 0 means there was a
%              solution and 1 means there was not a solution
iter = 0;
flag = 0;

bnrm2 = norm(b);
if (bnrm2 == 0)
     bnrm2 = 1.0; 
end

r = b - x*A;
error = norm(r) / bnrm2;
if (error<tol) 
    return; 
end

[m,n] = size(A);

M = diag(diag(A));
N = diag(diag(A)) - A;

for iter = 1:maxiter,
    oldx = x;
    x = M\(x*N + b);

    error = norm(x - oldx) / norm(x);
    if (error <= tol)
        break;
    end
end
if (error > tol) 
     flag = 1; 
end
function[x,error,iter,flag]=jacobi(A,x,b,maxiter,tol)
%实现jacobi迭代
%[x,error,iter,flag]=jacobi(A,x,b,maxiter,tol)
%jacobi.m使用jacobi迭代求解线性系统Ax=b
%
%
%输入A系统的矩阵Ax=b
%x第一猜测向量Ax=b
%b系统中的向量
%maxiter要执行的最大迭代次数
%公差
%
%输出x解向量
%误差范数
%niter它所花费的迭代次数
%标志指示是否找到解决方案。0表示有一个
%解决方案和1表示没有解决方案
iter=0;
flag=0;
bnrm2=标准值(b);
如果(bnrm2==0)
bnrm2=1.0;
结束
r=b-x*A;
误差=标准(r)/bnrm2;

如果(错误,因为,在代码中,你正在解决我将称之为(不确定它是否正确,因为我从未这样做过)的左乘法问题,那么从某种意义上说,矩阵的运算符和顺序是相反的

如果您使用残差
r=b-A*x
解决问题
A*x=b
(即
x
b
是列向量),您将执行右向量乘和左矩阵除。因此,循环中的更新行将是

x = M \ (N*x + b);
x = (x*N + b) / M;
相反,如果您正在用残差
r=b-x*A
解决问题
x*A=b
(即
x
b
是行向量),您将执行左向量乘法和右矩阵除法。因此,循环中的更新行将是

x = M \ (N*x + b);
x = (x*N + b) / M;
请注意,
\
解析为函数,
/
解析为。乘法没有函数区别


您当前的更新程序似乎混合了这两者,这对于维度匹配来说是个坏消息。

因为,在代码中,您正在解决我将要调用的问题(不确定是否正确,因为我从来没有这样做过)左乘法问题,从某种意义上说,矩阵的运算符和顺序是相反的

如果您使用残差
r=b-A*x
解决问题
A*x=b
(即
x
b
是列向量),您将执行右向量乘和左矩阵除。因此,循环中的更新行将是

x = M \ (N*x + b);
x = (x*N + b) / M;
相反,如果您正在用残差
r=b-x*A
解决问题
x*A=b
(即
x
b
是行向量),您将执行左向量乘法和右矩阵除法。因此,循环中的更新行将是

x = M \ (N*x + b);
x = (x*N + b) / M;
请注意,
\
解析为函数,
/
解析为。乘法没有函数区别

您当前的更新程序似乎混合了这两种情况,这对于维度匹配来说是个坏消息