本次採用全主元求解線性方程組,比上次的列主元消去法更加的精確,上次列主元只是選出列中最大的那個數,這次選出行、列中最大的那個數當作主元,無疑增加了可靠性。
本次的演算法是完全不同的演算法,本次考慮了很多東西,節省了很多空間。輸入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。考完了才知道有高斯消元這個神奇的東西,於是就去簡單了解了一下。高斯消元法是線性代數規劃中的乙個演算法,可用來為線性方程組求解,還可以求出矩陣的秩,以及求出可逆方陣的逆...