matlab 关于break的问题写了一个关于Gauss-Seidel iteration的东西,题目说要用到break,看说明只知道是跳出当前for loop,于是这样写了.A是4*4的矩阵,b是4*1的矩阵.A*x =b:error = 10.^(-8);k = 0;xk = zeros(4,1);r = ones
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/09 09:56:52
matlab 关于break的问题写了一个关于Gauss-Seidel iteration的东西,题目说要用到break,看说明只知道是跳出当前for loop,于是这样写了.A是4*4的矩阵,b是4*1的矩阵.A*x =b:error = 10.^(-8);k = 0;xk = zeros(4,1);r = ones
matlab 关于break的问题
写了一个关于Gauss-Seidel iteration的东西,题目说要用到break,看说明只知道是跳出当前for loop,于是这样写了.A是4*4的矩阵,b是4*1的矩阵.A*x =b:
error = 10.^(-8);
k = 0;
xk = zeros(4,1);
r = ones(4,1);
sum1 = 0;
sum2 = 0;
xadd = zeros(4,1);
while (k < 1001) && norm(r,2) >= (error * norm(b,2))
for i = 1:4
for j1 = 1:(i-1)
if i==1,break,end
sum1 = sum1 + A(i,j1)*xadd(j1,1);
end
for j2 = (i+1):4
if i==4,break,end
sum2 = sum2 + A(i,j2)*xk(j2,1);
end
xadd(i,1) = 1\A(i,i)*(b(i,1)-sum1-sum2);
end
xk = xadd;
r = b - A*xadd;
k = k + 1;
end
在workspace里j1是3(为什么不是4?),j2是空白(【】),其他数据看要么是NAN要么就很奇怪.是不是break用错了?还是有其他问题?
matlab 关于break的问题写了一个关于Gauss-Seidel iteration的东西,题目说要用到break,看说明只知道是跳出当前for loop,于是这样写了.A是4*4的矩阵,b是4*1的矩阵.A*x =b:error = 10.^(-8);k = 0;xk = zeros(4,1);r = ones
1、你这完全不是用MATLAB写Gauss-Seidel迭代程序的套路啊,给你两个别人写的程序供参考:
gaussSeidel.m
function [v,sN,vChain]=gaussSeidel(A,b,x0,errorBound,maxSp)
%Gauss-Seidel迭代法求解线性方程组
%A-系数矩阵 b-右端向量 x0-初始迭代点 errorBound-近似精度 maxSp-最大迭代次数
%v-近似解 sN-迭代次数 vChain-迭代过程的所有值
step=0;
error=inf;
s=size(A);
D=zeros(s(1));
vChain=zeros(15,3);%最多能记录15次迭代次数
k=1;
fx0=x0;
for i=1:s(1)
D(i,i)=A(i,i);
end;
L=-tril(A,-1);
U=-triu(A,1);
while error>=errorBound & step<maxSp
x0=inv(D)*(L+U)*x0+inv(D)*b;
vChain(k,:)=x0';
k=k+1;
error=norm(x0-fx0);
fx0=x0;
step=step+1;
end
v=x0;
sN=step;
gauseidel.m
function [y,n]=gauseidel(A,b,x0,eps)
% Gauss-Serdel迭代法的MATLAB函数文件gauseidel.m如下:
if nargin==3
eps=1.0e-6;
elseif nargin<3
error
return
end
D=diag(diag(A)); %求A的对角矩阵
L=-tril(A,-1); %求A的下三角阵
U=-triu(A,1); %求A的上三角阵
G=(D-L)\U;
f=(D-L)\b;
y=G*x0+f;
n=1; %迭代次数
while norm(y-x0)>=eps
x0=y;
y=G*x0+f;
n=n+1;
end
调用实例:
>> A=[10,-1,0;-1,10,-2;0,-2,10];
>> b=[9,7,6]';
>> x=gauseidel(A,b,[0,0,0]',1.0e-6)
x =
0.99579
0.95789
0.79158
>> x=gaussSeidel(A,b,x0,0.00001,11)
x =
0.99579
0.95789
0.79158
>> x=A\b
x =
0.99579
0.95789
0.79158
其中最后一个x=A\b是求解线性方程组的最正宗的解法.
2、关于你说的为什么最后变量是那些值的问题,楼上的回答应该比较清楚了.
补充一下你追问的内容:那个break是在for j2 = (i+1):4循环体里面,而那个循环如楼上所说,根本就不会执行,也就谈不上什么退出循环了.
3、我再考虑一下,按照你的思路写程序的话,应该怎么改(也就是尽量保留你的程序框架).