高斯消元模板

2021-07-11 06:06:11 字數 1347 閱讀 5073

#include #include #include #include #include #include #include #include typedef long long ll ;

const int n = 1008 ;

//高斯消元模板

const double eps = 1e-12;

double aug[n][n]; //增廣矩陣

bool free_x[n]; //判斷是否是不確定的變元

double x[n]; //解集

int sign(double x)

/**返回值:

-1 無解

0 有且僅有乙個解

>=1 有多個解,根據free_x判斷哪些是不確定的解

*/int gauss(int equ , int var)

if(max_r != row) //將該行與當前行交換

if(sign(aug[row][col])==0) //當前列row行以下全為0(包括row行)

for(i = row+1; i < equ; i++)

}for(i = row; i < equ; i++) //col=n存在0...0,a的情況,無解

if(row < var) //存在0...0,0的情況,有多個解,自由變元個數為n-row個

if(free_num > 1) continue; //該行中的不確定的變元的個數超過1個,無法求解,它們仍然為不確定的變元

//只有乙個不確定的變元free_index,可以求解出該變元,且該變元是確定的

double tmp = aug[i][var];

for(j = 0; j < var; j++)

x[free_index] = tmp/aug[i][free_index];

free_x[free_index] = false;

}return var-row;

}//有且僅有乙個解,嚴格的上三角矩陣(n==m)

for(i = var-1; i >= 0; i--)

return 0;

}//模板結束

double fix(double x)

int main()

aug[i][i] = 1.0 ;

aug[i][(i+1)%n ] = -0.5 ;

aug[i][(i-1+n)%n ] = -0.5 ;

aug[i][n] = 1.0 ;

}gauss(n,n) ;

printf("%.4lf\n" , fix(x[0]) ) ;

}return 0 ;

}

高斯消元模板

用迭代的辦法打會簡潔一些。有些精度上的細節需要注意。多次消元要清空use和cho陣列。實數高斯消元 int use maxn cho maxn void solve equation int n,int m break fd i,n,1 if cho i 自由元的個數就是cho為0的個數 無解的話去...

高斯消元模板

y,z.x,y,z.x,y,z.可以得到乙個上三角矩陣。這時已經可以直接讀出最後乙個方程的解了,再回代到上面的方程就行了。具體實現 對於x ixi xi,找到xixi xi係數最大的乙個方程,以減少精度誤差。然後,把該方程的xixi xi係數轉化為1,帶入後面所有方程消元。考慮倒著往回進行代入消元,...

高斯消元模板

高斯消元 const int n 20 const double eps 1e 7 double a n n x n double c n n m表示行數,n表示列數 下標從0開始儲存,常數列不算進列數 返回值 1表示無解,0表示唯一解,大於0表示無窮解,並返回自由變元的個數 int gauss i...