Yurchiu's Blog

高斯消元法

Yurchiu 2022-02-26, 22:03:02 398 隐藏左右两栏 展示左右两栏

这里介绍的是高斯-约旦消元法。

相对于传统的高斯消元,约旦消元法的精度更高、代码更简单,没有回带的过程。

约旦消元法大致思路如下:

  1. 选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程。
  2. 将这个方程主元的系数化为 1。
  3. 通过加减消元,消掉其它方程中的这个未知数。
  4. 重复以上步骤,直到把每一行都变成只有一项有系数。

我们用矩阵表示每一项系数以及结果。

代码如下:

#include<bits/stdc++.h>
using namespace std;
namespace _yz
{
	typedef double db;
	const int N=100+10;
	const db eps=0.000001;
	int n; char ERR[]="No Solution";
	db p[N][N];
	void main()
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n+1;j++)
				scanf("%lf",&p[i][j]);
		for(int i=1;i<=n;i++)
		{
			int maxn=i;
			for(int j=i;j<=n;j++)
			{
				if(fabs(p[j][i])<fabs(p[maxn][i]))
					continue;
				maxn=j;
			}
			for(int j=1;j<=n+1;j++)
				swap(p[i][j],p[maxn][j]);
			if(fabs(p[i][i])<=eps)
			{
				printf("%s\n",ERR);
				return;
			}
			//当前的那一列可以不用管,因为对后面的消元没影响 
			for(int j=i+1;j<=n+1;j++)
				p[i][j]/=p[i][i];
			for(int j=1;j<=n;j++)
			{
				if(i==j) continue;
				for(int k=i+1;k<=n+1;k++)
					p[j][k]-=p[j][i]*p[i][k];
			}
		}
		for(int i=1;i<=n;i++) printf("%.2lf\n",p[i][n+1]);
		return;
	}
}
int main()
{
	_yz::main();
	return 0;
}




本文作者:Yurchiu

本文链接:https://yz-hs.github.io/5127f3a117e4/

版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。


By Yurchiu.
其他物件杂物收纳
Hitokoto

Yurchiu 说,除了她以外的人都很强!嘤嘤嘤~~
博客信息
文章数目
158
最近更新
08-18
本站字数
350.6k