高斯消元是一種解方程的很巧妙的方法,核心是把方程轉換成矩陣形式,然后再通過加減消元,求出值后再回帶,就解出了這個方程,這里我就不贅述了。
我一般用高斯-約旦消元法,這種方法是直接轉換成單位矩陣求解,減少回帶次數,提高精確度,實現方式如下:
下方是一個方程
把它轉換成矩陣形式就是:
我們可以這樣對其進行變換:
在第一行找到第一個元素,向下尋找有沒有絕對值更大的,如果有就交換。
對於之后的如法炮制即可。
最后,我們就可以得到這樣一個矩陣:很顯然,在左邊是單位矩陣的情況下,右邊即為原方程的解。
需要注意的是,如果在轉換的時候主元系數為0,這種就是無解(右邊為非零數)或無窮多解(右邊為零),如下為無窮多解:
可以發現,消元已經已經無法進行了。
所以,算法的思路已經出來了,接下來根據思路模擬就行了。
核心代碼如下:
const double eps=1e-6;
void Guass-Jordan(){ int r;double tmp; for(int i=1;i<=n;++i){ r=i; for(int j=i+1;j<=n;++j) if(fabs(a[r][i])<fabs(a[j][i])) r=j; if(r!=i) swap(a[r],a[i]); if(fabs(a[i][i])<eps){ p=0; return; } for(int j=1;j<=n;++j) if(j!=i){ tmp=a[j][i]/a[i][i]; a[j][i]=0; for(int k=j+1;k<=n+1;++k) a[j][k]-=a[i][k]*tmp; } } for(int i=1;i<=n;++i)a[i][n+1]/=a[i][i]; return; }
恩,這就是我學了幾天沒學懂的東西
轉載請注明地址,謝謝。