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