如何编写一般的Gauss-seidel方法

时间:2014-03-30 01:41:03

标签: matlab methods gaussian

如何为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(萨里大学)

1 个答案:

答案 0 :(得分:1)

一些事情:

  • 始终使用步骤i的结果来计算步骤i+1(即使计算x1(i+1)等时x2(i+1)可用),您已实施了雅可比方法,而不是高斯 - 赛德尔。它们非常相似,但是Gauss-Seidel的收敛速度大约是原来的两倍,而且需要更少的内存。
  • 除非您真的想要(即使用x1=...代替x1(i+1)=...
  • ,否则没有理由存储您的所有中间结果和错误
  • MATLAB代表 MATrix LABoratory ,学习尽可能使用数组,矩阵和向量。这是您问题的关键方面。不是为x1x2,...设置不同的变量,而是将它们全部存储在名为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)

我希望这会有所帮助,但根据您的代码,您似乎无法将算法概念化并将必要的步骤转换为代码。第一步是真正理解你想要逐步做什么,第二步是将其编码为一个有效的程序。