2014-03-30 28 views
2

如何編寫Gauss-Seidel方法的Matlab代碼,使用戶能夠輸入任意數量的等式,n和矩陣係數的任何輸入? 我這樣做了,但這是爲了固定數量的方程和已知的方程係數。 我需要一個代碼,其中方程數n和用戶給出的係數值(a11,a12,...)。如何編碼一般Gauss-seidel方法

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'); 

等。 祝你好運。 信用:利瑪竇Carpentieri(薩里UNI)

回答

1

有幾件事情:

  • 通過使用總是在步驟i結果(計算x2(i+1)等時,即使x1(i+1)可用)來計算步i+1你」已經實施了Jacobi方法,而不是Gauss-Seidel。它們非常相似,但Gauss-Seidel收斂速度快一倍,所需內存也較少。
  • 沒有理由來存儲所有中間結果和錯誤的,除非你真的想(即使用的x1=...代替x1(i+1)=...
  • MATLAB代表矩陣實驗室,學會盡可能使用數組,矩陣和向量。這是你問題的關鍵方面,而不是像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
    w這裏A是你的矩陣,b是右邊。如果對矩陣和向量運算不滿意,可考慮查看一些線性代數和MATLAB集中線性代數教程。
  • 僅基於解決方案的單個組件檢查錯誤通常不是一個好主意。你應該真的使用錯誤規範,如norm(xnew-xold)/norm(xnew)

我希望這會有所幫助,但根據您的代碼,您似乎無法將算法概念化並將必要的步驟轉化爲代碼。第一步是要真正理解你想要做的一步一步的基礎上,第二步是編碼作爲一個功能程序。