全主元高斯消去法求解線性方程組

2021-07-24 22:56:30 字數 1786 閱讀 4109

本次採用全主元求解線性方程組,比上次的列主元消去法更加的精確,上次列主元只是選出列中最大的那個數,這次選出行、列中最大的那個數當作主元,無疑增加了可靠性。

本次的演算法是完全不同的演算法,本次考慮了很多東西,節省了很多空間。輸入n*n階矩陣,和n階向量,本次演算法會改變輸入矩陣和輸出矩陣的值,意味著消元的過程直接是立地消元,該演算法節省了很多空間。唯一的空間消耗是動態分配了n維陣列,存放交換的行的值。並且本演算法改善了判斷的過程,如果係數矩陣奇異,就不能解,就返回值返回-1,如果能解,就返回1。可以根據返回值來判斷能否解。其次

,如果還有待改善的話,

1.我認為可以用丟擲異常來代替處理不能解的情況

2.可以看到,我用來存放交換的行的動態陣列與col的定義是重的,可以刪去col,但是對於col這個只佔4個位元組的記憶體,影響不大,用來反而能增加程式可讀性。

下面貼**:

//全選主元高斯消去法求解實係數線性方程組

#include

#include

using

namespace

std;

const

int n=4; //定義矩陣的階數

//交換元素

void swap(double& a, double& b )

//由於矩陣運算會有乘除法,所以不能用int陣列儲存數,選擇double

int rgauss(double a[n][n], double b[n])

}//判斷是否奇異,非奇異可以繼續執行

if (max = 0) l = 0;

else

}//如果奇異就返回-1,代表失敗,並釋放記憶體

if (l == 0)

//消元過程

double s;

for (j = k + 1; j < n; j++)

}// 如果最後乙個元素是0,則方程組無解。

if (0 == a[n - 1][n - 1])

//回帶求解過程

b[n - 1] = b[n - 1] / a[n - 1][n - 1];

cout

<< "b[n-1] "

<< b[n-1] << endl;

for (i = n - 2; i >= 0; i--)

b[i] = (b[i] - sum) / a[i][i];

cout

<< "sum= "

<< sum;

cout

<< endl;

}//恢復解的正常次序

int xx;

ex[n - 1] = n - 1;

for (k = n - 1; k >= 0; k--)

}delete ex; //釋放記憶體

return

1; //返回成功的值

}int main()

; double b[4] = ;

//結果是1.04058,0.987051,0.93504,0.881282

//double a[3][3] = ;

//double b[3] = ;

//測試結果是-1,3,-1;

if(rgauss(a, b) != -1) //判斷是否能解,能解就輸出

else

cout

<< "can't use this way"

<< endl;

return

0;}

求解線性方程組 全主元消去法

求解線性方程組 全主元消去法。源 用c 實現 這裡採用的是數值分析裡的演算法。在vc6.0下編譯通過,經測試沒大問題。求解線性方程組 全主元消去法 include using namespace std 二維陣列動態分配模板 template t allocation2d int m,int n r...

求解線性方程組 高斯消去法

源 用c 實現 這裡採用的是數值分析裡的演算法 在vc6.0下編譯通過,經測試沒大問題。求解線性方程組 高斯消去法 include using namespace std 二維陣列動態分配模板 template t allocation2d int m,int n return a int main...

高斯消元求解線性方程組

蒟蒻 nanjo qi 前天考了一次試 第一題就華麗麗地爆零了。解一次方程組我會啊,但是解一千個有百來八十個未知數的 棄了棄了orz。考完了才知道有高斯消元這個神奇的東西,於是就去簡單了解了一下。高斯消元法是線性代數規劃中的乙個演算法,可用來為線性方程組求解,還可以求出矩陣的秩,以及求出可逆方陣的逆...