【问题标题】:How to code a general Gauss-seidel method如何编写一个通用的 Gauss-seidel 方法
【发布时间】:2018-01-17 11:33:15
【问题描述】:

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

【问题讨论】:

    标签: matlab methods gaussian


    【解决方案1】:

    一些事情:

    • 通过始终使用步骤i 的结果来计算步骤i+1(即使x1(i+1) 在计算x2(i+1) 等时可用),您已经实现了 Jacobi 方法,而不是 Gauss-Seidel。它们非常相似,但 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)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      相关资源
      最近更新 更多