#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...