Matlab中的无限while循环,计数器不';t出口回路
我在写一个高斯-赛德尔方法的函数,它求解一个线性方程组,形式为Ax=b,x是我们正在寻找的未知量。 我的函数中的while循环有问题,它似乎无限运行。我似乎不明白为什么 这是我用来创建系数矩阵A和列向量x和b的函数,当然,它们的行数都相同。这个没问题Matlab中的无限while循环,计数器不';t出口回路,matlab,Matlab,我在写一个高斯-赛德尔方法的函数,它求解一个线性方程组,形式为Ax=b,x是我们正在寻找的未知量。 我的函数中的while循环有问题,它似乎无限运行。我似乎不明白为什么 这是我用来创建系数矩阵A和列向量x和b的函数,当然,它们的行数都相同。这个没问题 function [A, b, x0] = test_system(n) u = ones(n, 1); A = spdiags([u 4*u u], [-1 0 1], n, n); b = zeros(n, 1); b(1) = 3; b
function [A, b, x0] = test_system(n)
u = ones(n, 1);
A = spdiags([u 4*u u], [-1 0 1], n, n);
b = zeros(n, 1);
b(1) = 3;
b(2 : 2 : end-2) = -2;
b(3 : 2 : end-1) = 2;
b(end) = -3;
x0 = ones(n, 1);
这是我解决系统的功能。为了以防万一,我已经包括了所有这些,但我相信真正的问题是在执行函数时无限运行的while循环的最末端。柜台也没有脱离它。我真的看不出它有什么问题。有什么线索吗?
温柔点,我是Matlab的新手:)
函数[x]=Gausseidel(A,b,x0,tol)
%GaussSeidel迭代法的实现
%用于求解线性方程组Ax=b
%投入:
%A:系数矩阵
%b:常数的列向量
%x0:未知向量的设置(使用1的向量)
%tol:结果必须在正确答案的“tol”范围内。
%产出:
%x:未知
%检查A是否为矩阵
if~(ismatrix(A))
错误(“A不是矩阵”);
终止
%检查A是否为正方形
[m,n]=尺寸(A);
如果m~=n
错误(‘矩阵A不是正方形’);
终止
%检查b是否为列向量
if~(iscolumn(b))
错误('b不是列向量');
终止
%检查x0是否为列向量
if~(iscolumn(x0))
错误('x0不是列向量');
终止
%检查A、b和x0的尺寸是否一致
[罗华可乐]=尺码(A);
[rowb,colb]=尺寸(b);
[rowx0,colx0]=尺寸(x0);
如果~isequal(可乐,rowb)| ~isequal(rowb,rowx0)
错误(“A、b和xo的矩阵尺寸不一致”);
终止
%检查A和b是否有真实的条目
如果~isreal(A)| ~isreal(b)
错误('矩阵A或向量b没有实数项');
终止
%检查所提供的公差是否为正
如果是tol行(求和)
警告(“矩阵A不是严格对角占优的”);
终止
L=万亿(A,-1);
U=triu(A,+1);
D=诊断(诊断(A));
x=x0;
M1=库存(D)。*L;
M2=库存(D)。*U;
M3=D\b;
k=0;%迭代计数器
disp(大小(M1));
disp(尺寸(M2));
disp(尺寸(M3));
disp(大小(x));
while(norm(A*x-b)>tol)
对于i=1:n
x(i)=-M1(i,:)*x-M2(i,:)*x+M3(i,:);
终止
k=k+1;
如果(k>=10e4)
错误(“执行的迭代次数过多”);
终止
终止
结束%结束函数
我没有50%的声誉,所以我不能对此发表评论 如果(k>=10e4)这一行,我认为这并不是你想象的那样<代码>10e4为100000,
1e4
为10000。这就是你认为你的计数器不工作的原因。Matlab仍然在运行,因为它比你想象的运行得更远。我也遇到了knedlsepp已经指出的相同问题。编码讨论
编码错误的来源是使用元素操作,而不是矩阵和矩阵向量操作。
这些操作生成零矩阵,因此没有任何进展。
M
矩阵应定义为
M1 = inv(D)*L; % Note that D\L is more efficient
M2 = inv(D)*U; % Note that D\U is more efficient
M3 = D\b;
执行更新的迭代器应该是
x(i) = - M1(i,:)*x - M2(i,:)*x + M3(i,:);
方法探讨 我还认为值得一提的是,代码目前正在实现,因为更新程序具有表单 而一个更新有一个表单
.对我来说,它不会通过For循环。行“x(i)=-M1(i,:).*x-M2(i,:).*x+M3(i,:);”有问题,尺寸不匹配。也许你的意思是“*”而不是“*”。顺便说一句,“M3=D\b;”这行看起来有点奇怪。如果可以使用“\”操作符,那么编写线性解算器的最佳方法是“x=a\b”。我宁愿用“M3=b./diag(A)”来代替。非常感谢!你是对的,问题在于M1和M2的计算。此外,我还检查了代码是否确实实现了jacobi方法,但是我们的老师在课堂上给了我们一个伪代码,所以我只编写了他在那里写的代码。我猜他被这些方法搞混了。再次感谢!令人惊叹的如果你能给我这个答案,这样我就能得到代表,我会非常感激。
x(i) = - M1(i,:)*x - M2(i,:)*x + M3(i,:);