2013-05-07 55 views
1

我已經做了高斯 - 賽德爾方法,它正在爲所有的輸入,除了下面的公式編程:高斯賽德爾方法不工作的特定的輸入

1.876 x1+2.985 x2-11.620 x3=-0.972 

    12.214 x1+2.367 x2 +3.672 x3=7.814 

    2.412 x1+9.879 x2 +1.564 x3 =4.890 

當我與該輸入運行,有「浮點溢出」是一個運行時錯誤它工作正常,如果我使用整數input.My代碼如下:

//高斯 - 賽德爾迭代

#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#define e 0.001 

void main() { 

int i,j,n,count; 
double a[10][10],x[10]; 
double sum,temp,error,big; 

printf("Enter the number of equations: "); 
scanf("%d",&n) ; 
printf("Enter the co-efficients of the equations: \n"); 

    for(i=0;i<n;i++) { 
     for(j=0;j<n+1;j++) { 
      printf("a[%d][%d]= ",i,j); 
      scanf("%lf",&a[i][j]); 
     } 
    } 

    for(i=0;i<n;i++) 
     x[i]=0; 

    count=1; 

    do { 
     big=0; 
     for(i=0;i<n;i++) { 
      sum=0; 

      for(j=0;j<n;j++) { 
       if(j!=i) { 
        sum = sum+a[i][j]*x[j]; 
       } 
      } 

      temp = (a[i][n]-sum)/a[i][i]; 
      error = fabs((x[i]-temp)/temp); 

      if(error>big) { 
       big=error; 
      } 

      x[i]=temp; 
      printf("%d\tx[%d] =%lf",count,i,x[i]); 
     } 

     printf("\n"); 
     count++; 

    }while(big>=e); 

    printf("\n\nconverges to solution"); 

    for(i=0;i<n;i++) { 
     printf("\nx[%d]=%lf",i,x[i]); 
    } 
    getch(); 
}//end 

我找不到WHA t將被修改。

+0

你試過調試過嗎?你看到的很可能是由於除以0而導致的錯誤。 – 2013-05-07 13:18:21

+0

由於目前格式化,所以不可能使這個代碼的首部或尾部。我建議你整理它並通過@IvayloStrandjev建議的調試器來運行它。 – Vicky 2013-05-07 13:24:56

+0

對不起,我想我剛纔給的答案是胡說,讓我再想一想。 – James 2013-05-07 14:06:38

回答

1

雖然它可以適用於任何矩陣與在對角線上的非零元素,收斂僅當矩陣或者是對角佔優,或者對稱和正定的保證。

如其陳述in the wikipedia article

您的示例矩陣並非如此,所以它不應該成爲一個太大的驚喜,因爲該方法不會收斂。

如果重新排列方程,最後移到第一個方程(當時係數矩陣變成對角佔優),它迅速收斂到近似解

x[0]=0.500006 
x[1]=0.333334 
x[2]=0.250001 

(確切的解決方案是(1/2, 1/3, 1/4))。

什麼情況是:

  1. 輪:

    • 第一,x[0]得到負值(​​)
    • 接下來,第二行的總和被否定,x[1]然後,爲了補償太大的值x[1],x[2]也得到一個負值。
  2. 輪:

    • 總和x[1]*a[0][1] + x[2]*a[0][2]是肯定的,因爲這兩個x[2]a[0][2]是負的,並且x[1]a[0][1]都是正的。因此x[0]得到一個更小的負值比在第一輪中,
    • 然後x[0]*a[1][0] + x[2]*a[1][2]是否定的,並且x[1]值越大,以補償,
    • 然後x[2]值變得更小的負值,以補償
  3. 以及更多輪次:請參閱第2輪。

過了一段時間,你會得到infinities和NaNs。

+0

非常感謝Daniel Fischer ......詳細的答案真的很有幫助 – user71067 2013-05-08 02:52:22

+0

@ user71067,如果它對你有幫助,那麼請把它標記爲「接受」(點擊評分下面的綠色複選標記作爲答案) – Vicky 2013-05-09 09:03:45