1. 高斯消元

1. 线性方程

类似于如下的东西

\(\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=b_1\\a_{2,1}x_{1}+a_{2,2}x_2+\dots+a_{2,n}x_n=b_2\\\dots\\a_{n,1}x_1+a_{n,2}x_2+\dots+a_{n,n}x_n=b_n\end{cases}\)

2. 系数矩阵

把系数弄出来变成系数矩阵,如下:

\(\begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \vdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n} \end{bmatrix}\)

3. 增广矩阵

系数矩阵右侧加一列方程等式右边的常数,如下:

\(\begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}&|&b_1\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}&|&b_2\\ \vdots & \vdots & \ddots & \vdots&|&\vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}&|&b_n \end{bmatrix}\)

4. 行阶梯矩阵

非零行的第一个非零元素的列下标随着行数增加而严格递增,全零元素的行在末尾,如下。

\(\begin{bmatrix} c_{1,1} & c_{1,2} & c_{1,3} & \cdots & c_{1,n}&|&d_1\\ 0 & c_{2,2} & c_{2,3} & \cdots & c_{2,n}&|&d_2\\ 0&0&c_{3,3}&\cdots &c_{3,n} &|& d_3\\ \vdots & \vdots &\vdots& \ddots & \vdots&|&\vdots\\ 0 & 0 & 0&\cdots & c_{n,n}&|&d_n \end{bmatrix}\)

将增广矩阵变换为行阶梯矩阵,就可以倒着代回去得到原方程的解。

可以通过如下的变换来操作。

5. 矩阵的行变换(列变换)

  1. 将矩阵的第 \(i\) 行和第 \(j\) 行元素互换
  2. 将矩阵的第 \(i\) 行元素分别乘以 \(val\)
  3. 将矩阵的第 \(i\) 行元素分别乘以 \(val\) 再加到第 \(j\) 行的对应位置

6. 方程组解的判定:

矩阵的行秩:行阶梯矩阵非零行的数量

  1. 有唯一解:增广矩阵的行秩 \(=\) 未知数的数量
  2. 有无数多解:增广矩阵的行秩 \(\lt\) 未知数的数量
  3. 无解:系数矩阵的行秩 \(\not =\) 增广矩阵的行秩

7. 代码实现

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int n;
double a[MAXN][MAXN];
int main()
{
	scanf("%d",&n);
	for(register int i=1;i<=n;i++)
		for(register int j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	for(register int i=1;i<=n;i++)
	{
		int maxn=i;
		for(register int j=i+1;j<=n;j++)//把当前未知数的最大系数放到当前行
			if(abs(a[j][i])>abs(a[maxn][i]))maxn=j;
		for(register int j=1;j<=n+1;j++)
			swap(a[i][j],a[maxn][j]);
		if(fabs(a[i][i])<=0.001)
		{
			puts("No Solution");
			return 0;
		}
		for(register int j=1;j<=n;j++)//将每一行除当前行未知数的系数变成linguistic
		{
			if(i==j)continue;
			double rate=a[j][i]/a[i][i];//需要减去多少
			for(register int k=1;k<=n+1;k++)//再将其他的系数也减掉
				a[j][k]-=a[i][k]*rate;
		}
	}
	for(register int i=1;i<=n;i++)
		printf("%.2lf\n",a[i][n+1]/a[i][i]);
	return 0;
}

原文地址:http://www.cnblogs.com/yzh-error502/p/16884428.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性