[問題] 程式問題

看板C_and_CPP作者 (jason77623)時間16年前 (2010/01/14 03:34), 編輯推噓2(205)
留言7則, 2人參與, 最新討論串1/1
遇到的問題:我寫了一個有關運算反矩陣的程式碼 單獨使用這個程式碼的時候是沒問題的 跑出來的解果都與matlab跑出來一樣 可是當我把這一批程式碼放到另外一個我要使用的運算群裡 跑出來的反矩陣卻是錯的 這2個程式碼長的完全一模一樣 可是結果卻差很多 有問題的code:以下是我反矩陣的程式碼(DEV C++) for(int i=0;i<6;i++){ //先假設N的反矩陣是單位矩陣 for(int j=0;j<6;j++){ if(i==j){IN[i][j]=1;} else IN[i][j]=0; } } for(int i=0;i<6;i++){ //產生下三角出來 if(N[i][i]==0){ //將此行往下移 double tmp1; //暫存 double tmp2; for(int j=0;j<6;j++){ tmp1=N[i][j]; tmp2=IN[i][j]; for(int q=i;q<5;q++){ N[q][j]=N[q+1][j]; IN[q][j]=IN[q+1][j]; } N[5][j]=tmp1; IN[5][j]=tmp2; } } for(int l=1;l+i<6;l++){ if (N[i+l][i]==0){continue;} else { double k; k=(N[i+l][i]/N[i][i]); for(int j=5;j>=0;j--){ IN[i+l][j]=(k*IN[i][j]-IN[i+l][j]); N[i+l][j]=(k*N[i][j]-N[i+l][j]); } } } } for(int i=5;i>=0;i--){ //產生上三角出來 for(int l=1;i-l>=0;l++){ if (N[i][i]==0 || N[i-l][i]==0){continue;} else { double k; k=(N[i-l][i]/N[i][i]); for(int j=0;j<6;j++){ IN[i-l][j]=(k*IN[i][j]-IN[i-l][j]); N[i-l][j]=(k*N[i][j]-N[i-l][j]); } } } } for(int i=0;i<6;i++){ //約分,化成單位矩陣 double k; k=N[i][i]; for(int j=0;j<6;j++){ IN[i][j]=(IN[i][j]/k); N[i][j]=(N[i][j]/k); } } 請大家幫我看一下可能是什麼問題 我找到眼睛快脫窗了@.@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.198.231

01/14 03:38, , 1F
運算的東西一樣嗎? 把實際運算的矩陣自己丟一次試試看?
01/14 03:38, 1F

01/14 03:39, , 2F
另外要注意高斯消去法可能會有數值穩定性的問題
01/14 03:39, 2F

01/14 03:47, , 3F
嗯~運算的矩陣是一樣的!!
01/14 03:47, 3F

01/14 03:48, , 4F
數值穩定有辦法解決嗎? 這也是困然我很久的問題說= =a
01/14 03:48, 4F

01/14 03:50, , 5F
我看過的做法是過程中適當的調換列使除數小一點
01/14 03:50, 5F

01/14 03:50, , 6F
這樣除出來的數字比較大比較不容易出現問題...
01/14 03:50, 6F

01/14 03:54, , 7F
這個解果的不同有可能是記憶體空間的問題嗎?
01/14 03:54, 7F
文章代碼(AID): #1BJY1JGi (C_and_CPP)