如何为Gauss-Seidel方法编写Matlab代码,使用户能够输入任意数量的方程式,n和矩阵系数的任何输入? 我这样做了,但这是针对固定数量的方程和已知方程的系数。 我需要一个代码,其中有多个方程式,n和系数值(a11,a12,..)由用户给出。
clear;clc;format('long','g');
i=1;
x2(i)=32; x3(i)=41; x4(i)=12;
error_x1(i)=100;
while error_x1(i) >= 0.01
x1(i+1)=(21-x2(i)+42*x3(i)-9*x4(i))/-2;
x2(i+1)=(-3-4*x1(i)-x3(i)+x4(i))/-12;
x3(i+1)=(-24-2*x1(i)-6*x2(i)-18*x4(i))/-2;
x4(i+1)=(41-21*x1(i)+2*x2(i)-x3(i))/-1;
error_x1(i+1)=abs((x1(i+1)-x1(i))/x1(i+1))*100;
error_x2(i+1)=abs((x2(i+1)-x2(i))/x2(i+1))*100;
error_x3(i+1)=abs((x3(i+1)-x3(i))/x3(i+1))*100;
error_x4(i+1)=abs((x4(i+1)-x4(i))/x4(i+1))*100;
i=i+1;
end
disp(' x1 error(%)');
disp([x1',error_x1'])
disp(' x2 error(%)');
disp([x2',error_x2'])
disp(' x3 error(%)');
disp([x3',error_x3'])
disp(' x4 error(%)');
disp([x4',error_x4'
请...帮助
@DougLipinski,感谢您的帮助和建议。从上面的代码,它已被更改为下面的代码。 基本上就是这样。
while (n<maxit) && (max(err)>tol)
n = n + 1;%no. of iteration
for i = 1:n_eq
x(i) = (b(i) - (A(i,:) * x)) / A(i,i) + x(i);%Gauss-Seidel method
x_old = x;%roots
end
err = abs((x - x_old) ./ x);%checking for error
end
询问用户输入,使用输入命令 例如:
A = input('Give matrix A');
等等。 祝好运。 图片来源:Matteo Carpentieri(萨里大学)
答案 0 :(得分:1)
一些事情:
i
的结果来计算步骤i+1
(即使计算x1(i+1)
等时x2(i+1)
可用),您已实施了雅可比方法,而不是高斯 - 赛德尔。它们非常相似,但是Gauss-Seidel的收敛速度大约是原来的两倍,而且需要更少的内存。x1=...
代替x1(i+1)=...
x1
,x2
,...设置不同的变量,而是将它们全部存储在名为x
的单个变量中。同样,将所有矩阵系数存储在矩阵A
中。然后可以将单个Gauss-Seidel迭代编码为:for i=1:length(x)
I=[1:i-1 i+1:length(x)];
x(i) = ( b(i)-A(i,I)*x(I) )/A(i,i);
end
A
是您的矩阵,b
是右侧。如果您对矩阵和向量运算不满意,请考虑查看一些线性代数和MATLAB聚焦线性代数教程。norm(xnew-xold)/norm(xnew)
。我希望这会有所帮助,但根据您的代码,您似乎无法将算法概念化并将必要的步骤转换为代码。第一步是真正理解你想要逐步做什么,第二步是将其编码为一个有效的程序。