2013-10-19 119 views
-1

你好,我正在嘗試在c中對三角對角矩陣做一個反函數,但是我的代碼給了我一個段錯誤。代碼是三對角矩陣求逆C

/* Inverse of a n by n matrix */ 
#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 

double J[3][3]; 

double phi(i, n) 
{ 
double p; 
if(i==n) 
{ 
    return 1; 
} 
else if(i==n-1) 
{ 
    return J[i][i]; 
} 
else 
{ 
    p=J[i][i]*phi(i+1,n)-J[i][i+1]*J[i+1][i]*phi(i+2,n); 
} 
return p; 
} 

double theta(i,n) 
{ 
double p; 
if(i==-1) 
{ 
    return 1; 
} 
else if(i==0) 
{ 
    return J[i][i]; 
} 
else 
{ 
    p=J[i][i]*theta(i-1,n)-J[i-1][i]*J[i][i-1]*theta(i-2,n); 
} 
return p; 
} 

void main(void) 
{ 
double T[3][3]; 
int n=3; 
int i, j, a, b; 
J[0][0]=1; 
J[0][1]=1; 
J[0][2]=0; 
J[1][0]=2; 
J[1][1]=2; 
J[1][2]=2; 
J[2][0]=0; 
J[2][1]=2; 
J[2][2]=2; 
for(i=0; i<n;i++); 
{ 
    for(j=0; j<n;j++) 
    { 
    b=j; 
    a=i; 
    if(i<j) 
    { 
     T[i][j]=pow(-1, i+j); 
     for(a; a<b; a++) 
     { 
      T[i][j]*=J[a][a+1]; 
     } 
     T[i][j]*=theta(i-1,n)*phi(j+1)/theta(n-1,n); 
    } 
    else if(i==j) 
    { 
     if(i==0) 
     { 
      T[i][j]=0; 
     } 
     else 
     { 
      T[i][j]=theta(i-1,n)*phi(j+1,n)/theta(n-1,n); 
     } 
    } 
    else 
    { 
     T[i][j]=pow(-1, i+j); 
     for(b; b<i; b++) 
     { 
      T[i][j]*=J[a][b]; 
     } 
     T[i][j]*=theta(j-1, n)*phi(i+1,n)/theta(n-1, n); 
    } 
    } 
} 

for(i=0;i<n;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     printf("%lf\n", T[i][j]); 
    } 
} 
} 

在那裏的J矩陣只是一個示例矩陣,我將這個代碼實現到另一個調用此函數的矩陣。

+0

歡迎來到SO。沒有可測試的代碼。輸入功能代碼,可以通過樣本輸入來檢查它在哪個區段出現故障。儘管可能的原因是你的循環索引正在向外移動數組 – fayyazkl

回答

0

首先,您應該用double phi(int i, int n)替換您的功能簽名double phi(i, n)。 theta函數也是一樣。此外,在你的代碼,你寫了這行: T[i][j]*=theta(i-1,n)*phi(j+1)/theta(n-1,n); 您的PHI功能應該採取2個參數,所以也許你想這樣的:

T[i][j]*=theta(i-1,n)*phi(j+1, n)/theta(n-1,n); 

我也建議你使用T[i][j]=pow((double)(-1), (double)(i+j));。 你可以看到signatures of pow here

+0

這個問題被標記爲'C',你的建議是'C++'。 –