高斯约旦消元法

用来求解n元一次线性方程组

核心思想:

把方程组塞到一个矩阵里得到一个nn+1的矩阵,第i行表示第i个方程,Mat[i][j]表示第i个方程中xj的系数 Mat[i][n+1]为一个常数,即等号右面的常数

xi的系数都集中于第i行(对角线上),xi为当前选择的主元,然后用方程i把其他方程中的xi都消掉,可得到每行都是kixi=y的矩阵,显然xi=y/ki

void work(){
     n=read();
     for(int i=1;i<=n;++i){
		 for(int j=1;j<=n+1;++j){
			 Mat[i][j]=read();
		 }
	 }
	 for(int i=1;i<=n;++i){//枚举项xi
	     double maxx=Mat[i][i];
		 int tmp=i;
		 //x1--xi-1 的系数都在方程i上,其他方程该项系数为0,如果用方程1--i-1来消元会引入x1--xi-1,所以从i开始找
		 for(int j=i+1;j<=n;++j){//选出该列最大系数可以保证误差最小
			 if(fabs(Mat[j][i])>fabs(maxx)){
                maxx=Mat[j][i];tmp=j;
			 }
		 }
         for(int j=1;j<=n+1;++j){
			 swap(Mat[i][j],Mat[tmp][j]);//把方程i和方程tmp整个交换,使得系数集中在对角线上
		 }
		 if(Mat[i][i]==0){//多解
			 puts("No Solution");return;
		 }
		 //把除了Mat[i][i] 其他方程xi的系数都消掉
		 for(int j=1;j<=n;++j){
			 if(j==i)continue;
			 double x=Mat[j][i]/Mat[i][i];
			 for(int k=i+1;k<=n+1;++k){
				 Mat[j][k]-=Mat[i][k]*x;
			 }
		 }
	 }
	 for(int i=1;i<=n;++i){
         double ans=Mat[i][n+1]/Mat[i][i];
		 printf("%.2lf\n",ans);
	 }
}
posted @   Chano_sb  阅读(72)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示