Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中的无限while循环,计数器不';t出口回路_Matlab - Fatal编程技术网

Matlab中的无限while循环,计数器不';t出口回路

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

我在写一个高斯-赛德尔方法的函数,它求解一个线性方程组,形式为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(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,:);