matlab的雅可比迭代法,给我矩阵的维数一定要一致
下面是我执行jacobi迭代以求解Ax=b的代码。 我在矩阵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
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;
请注意,\
解析为函数,/
解析为。乘法没有函数区别
您当前的更新程序似乎混合了这两种情况,这对于维度匹配来说是个坏消息