高斯消元(C++)

高斯消元是线性代数中的重要算法,常用于解决线性方程组。也可以用来求矩阵的逆等问题。

咱们先来回顾一下初等行列变换

1.将某一行乘上一个非零数,解不变

2.交换某两行,解不变

3.将某一行的若干倍加到另一行,解不变 

算法步骤:

1.枚举每一列,找到绝对值最大的一行

2.将该行和第一行交换

3.将该行行首置为一

4.将下面所有行第 i 列置为零

我们来模拟一个样例:

 

 最后我们就得到了阶梯型矩阵了。

但是还没有结束,最后我们还需要将矩阵倒着减一遍就可以了(也叫回带)

洛谷题:https://www.luogu.com.cn/problem/P3389

上代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 110;
const double eps = 1e-6;


int n;
double a[N][N];

int gauss()
{
	int r,c; //行 列 
	
	for(r =0,c=0;c<n;c++)
	{
		int t = r;
		for(int i=r;i<n;i++)//找到绝对值最大的一行
			if(fabs(a[i][c])>fabs(a[t][c]))
				t = i;
	
		if(fabs(a[t][c])<eps)continue;
		
		for(int i=c;i<n+1;i++)swap(a[t][i],a[r][i]);//将该行和第一行交换
		
		for(int i=n;i>=c;i--)a[r][i] /= a[r][c];//将该行行首置为一
		
		for(int i=r+1;i<n;i++)//将下面所有行第 c 列置为零
			if(fabs(a[i][c])>eps)
				for(int j=n;j>=c;j--)
					a[i][j] -= a[r][j] * a[i][c];
		r++;
	}
	
	if(r<n) return 1;
	
	for(int i=n-1;i>=0;i--)//回带,将答案存在a[i][n]中 
		for(int j=i+1;j<n;j++)
			a[i][n] -= a[j][n] * a[i][j]; 
	return 0;
}

int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n+1;j++)
			cin>>a[i][j];
	
	int t = gauss();
	
	if(t==0)for(int i=0;i<n;i++) printf("%.2lf\n",a[i][n]);
	else  puts("No Solution");
	
	
} 

 收工。

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
高斯元算法是一种线性方程组求解方法,可以通过将系数矩阵化为一个上三角矩阵,从而求解出未知数的值。 以下是使用C++实现高斯元算法的示例代码: ```c++ #include <iostream> using namespace std; const int N = 100; int main() { int n; // 系数矩阵的行数(也是列数) double a[N][N], b[N]; // 系数矩阵和常数向量 double ans[N]; // 存储解向量 // 输入系数矩阵和常数向量 cout << "请输入系数矩阵和常数向量:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cin >> a[i][j]; cin >> b[i]; } // 高斯元 for (int k = 0; k < n; k++) // 第k列 { int p = k; for (int i = k; i < n; i++) // 选主元 if (abs(a[i][k]) > abs(a[p][k])) p = i; if (p != k) // 交换第k行和第p行 { for (int j = k; j < n; j++) swap(a[k][j], a[p][j]); swap(b[k], b[p]); } for (int i = k + 1; i < n; i++) // 元 { double f = a[i][k] / a[k][k]; for (int j = k + 1; j < n; j++) a[i][j] -= f * a[k][j]; b[i] -= f * b[k]; } } // 回带求解 for (int i = n - 1; i >= 0; i--) { ans[i] = b[i]; for (int j = i + 1; j < n; j++) ans[i] -= a[i][j] * ans[j]; ans[i] /= a[i][i]; } // 输出解向量 cout << "解向量为:" << endl; for (int i = 0; i < n; i++) cout << ans[i] << " "; return 0; } ``` 在上面的代码中,我们首先输入系数矩阵和常数向量,然后执行高斯元算法,将系数矩阵化为一个上三角矩阵。接着,我们使用回带法求解未知数的值,并将结果输出。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是饿梦啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值