用c语言求解n阶线性矩阵方程组,用C语言求解N阶线性矩阵方程Axb简单解法.docx
用C語言求解N階線性矩陣方程Axb簡單解法
用C語言求解N階線性矩陣方程Ax=b的簡單解法一、描述問題:題目:求解線性方程組Ax=b,寫成函數。其中,A為n×n的N階矩陣,x為需要求解的n元未知數組成的未知矩陣,b為n個常數組成的常數矩陣。即運行程序時的具體實例為:轉化為矩陣形式(為檢驗程序的可靠性,特意選取初對角線元素為0的矩陣方程組)即為:二、分析問題并找出解決問題的步驟:由高等代數知識可知,解高階線性方程組有逆矩陣求解法、增廣矩陣求解法等,而在計算機C語言中,有高斯列主消元法、LU分解法、雅克比迭代法等解法。為了與所學的高等代數知識相一致,選擇使用“高斯簡單迭代消元法”,與高等代數中的“增廣矩陣求解法”相一致。以下簡述高斯消元法的原理:算法基本原理:首先,為了能夠求解N階線性方程組(N由用戶輸入),所以需要定義一個大于N維的數組a[dim+1][dim+1](dim為設定的最大維數,防止計算量溢出),當用戶輸入的階數N超過設定值時提示重啟程序重新輸入。進而,要判斷方程組是否有解,無解提示重啟程序重新輸入,有解的話要判斷是有無數不定解還是只有唯一一組解,在計算中,只有當原方程組有且只有一組解時算法才有意義,而運用高等代數的知識,只有當系數矩陣對應的行列式 |A|≠0 時,原方程組才有唯一解,所以輸入系數矩陣后要計算該系數矩陣的行列式 |A|(定義了getresult(n)函數計算),當行列式 |A|=0 時同樣應提示重啟程序重新輸入, |A|≠0 時原方程組必然有且僅有唯一一組解。判斷出方程組有且僅有唯一一組解后,開始將系數矩陣和常數矩陣(合并即為增廣矩陣)進行初等行變換(以?a11?為基元開始,將第j列上j行以下的所有元素化為0),使系數矩陣轉化為上三角矩陣。這里要考慮到一種特殊情況,即交換到第j-1列后,第j行第j列元素?ajj=0?,那此時不能再以?ajj?為基元。當變換到第j列時,從j行j列的元素?ajj?以下的各元素中選取第一個不為0的元素,通過第三類初等行變換即交換兩行將其交換到?ajj?的位置上,然后再進行消元過程。交換系數矩陣中的兩行,相當于兩個方程的位置交換了。再由高斯消元法,將第j列元素除?ajj?外第j行以下的其他元素通過第二種初等行變換化為0,這樣,就能使系數矩陣通過這樣的行變換化為一個上三角矩陣,即,當系數矩陣A進行初等行變換時,常數矩陣也要進行對應的初等行變換,即此時?那么有接下來,進行“反代”,由?可求出??,再往上代入??即可求出??以此類推,即可從?xn推到?xn-1?,再推到xn-2?直至?x1?。至此,未知矩陣x的所有元素就全部求出,即求出了原方程組有且僅有的唯一一組解。基本原理示意圖:三、編寫程序#include#include#include#define dim 10? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?//定義最大的維數10,為防止計算值溢出double a[dim+1][dim+1],b[dim+1],x[dim+1];? ?//定義雙精度數組double temp;double getarray(int n);? ?? ?? ?? ?? ?? ?? ?//定義輸入矩陣元素的函數double showarray(int n);? ?? ?? ?? ?? ?? ???//定義輸出化簡系數矩陣過程的函數intn,i,j,k,p,q;double main(){? ?printf("請輸入系數矩陣的階數n(n<10):");scanf("%d",&n);? ? /*判斷矩陣階數是否超過界定值*/? ? if(n>dim)? ? {? ?? ???printf("錯誤:元數超過初設定的值%d,請重啟程序重新輸入\n",dim);? ?? ???exit(0);? ? }? ? /*輸入系數矩陣和常數矩陣(即增廣矩陣)的元素*/? ? getarray(n);? ??? ? /*使對角線上的主元素不為0*/? ? for(j=1;j<=n-1;j++)? ? {? ?? ???if(a[j][j]==0)? ?? ?? ?? ?for(i=j+1;i<=n;i++)? ?? ?? ?? ?{? ?? ?? ?? ?? ? if(a[i][j]!=0)? ?? ?? ?? ?? ? {? ?? ?? ?? ?? ?? ???/*交換增廣矩陣的第i行與第j行的所有元素*/? ?? ?? ?? ?? ?? ???for(k=1;k<=n;k++)? ?? ?? ?? ?? ?? ???{? ?? ?? ?? ?? ?? ?? ?? ?a[i][k]+=a[j][k];? ?? ?? ?? ?? ?? ?? ?? ?a[j][k]=a[i][k]-a[j][k]
總結
以上是生活随笔為你收集整理的用c语言求解n阶线性矩阵方程组,用C语言求解N阶线性矩阵方程Axb简单解法.docx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中头结点不为零怎么写,C语言不带表
- 下一篇: c语言十六进制的输出与站位,运算符与格式