高斯消元[模版]

题面描述

n n n个未知数 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3…… x n x_n xn,满足:

a 1 , 1 ∗ x 1 + a 1 , 2 ∗ x 2 + a 1 , 3 ∗ x 3 … … + a 1 , n ∗ x n = b 1 a_{1,1}*x_1+a_{1,2}*x_2+a_{1,3}*x_3……+a_{1,n}*x_n=b_1 a1,1x1+a1,2x2+a1,3x3+a1,nxn=b1
a 2 , 1 ∗ x 1 + a 2 , 2 ∗ x 2 + a 2 , 3 ∗ x 3 … … + a 2 , n ∗ x n = b 2 a_{2,1}*x_1+a_{2,2}*x_2+a_{2,3}*x_3……+a_{2,n}*x_n=b_2 a2,1x1+a2,2x2+a2,3x3+a2,nxn=b2
… … … … … … … … … … … … … … ……………………………………
a n , 1 ∗ x 1 + a n , 2 ∗ x 2 + a n , 3 ∗ x 3 … … + a n , n ∗ x n = b n a_{n,1}*x_1+a_{n,2}*x_2+a_{n,3}*x_3……+a_{n,n}*x_n=b_n an,1x1+an,2x2+an,3x3+an,nxn=bn
x 1 , x 2 , x 3 … … x n x_1,x_2,x_3……x_n x1,x2,x3xn的值。(保证有解)
【输入格式】
第一行给出 n ( 1 &lt; = n &lt; = 100 ) n(1&lt;=n&lt;=100) n(1<=n<=100)
下来 n n n行,每行给出 n + 1 n+1 n+1个实数,分别是 a i , 1 a_{i,1} ai,1~ a i , n a_{i,n} ai,n b i b_i bi
【输出格式】
输出 x 1 , x 2 , x 3 … … x n x_1,x_2,x_3……x_n x1,x2,x3xn的值(相邻两个用一个空格隔开,每个数保留 3 3 3位小数)
【样例输入】
3
2.5 5.0 3.0 32.5
1.0 4.5 2.0 22
4.0 3.5 1.5 26.5
【样例输出】
3.000 2.000 5.000

思路

作为高斯消元法的模版题,主要有两种初中的消元方法,分别是加减消元,以及代入消元
实际步骤:
如图,
∣ 2.5 5.0 3.0 ∣ 32.5 1.0 4.5 2.0 ∣ 22 4.0 3.5 1.5 ∣ 26.5 ∣ \begin{vmatrix} 2.5&amp;5.0&amp;3.0|&amp;32.5 \\1.0&amp;4.5&amp;2.0|&amp;22 \\4.0&amp;3.5&amp;1.5|&amp;26.5\end{vmatrix} 2.51.04.05.04.53.53.02.01.532.52226.5
⇛ \Rrightarrow
∣ 2.5 5.0 3.0 ∣ 32.5 0 2.5 0.8 ∣ 9 0 − 4.5 − 3.3 ∣ − 25.5 ∣ \begin{vmatrix} 2.5&amp;5.0&amp;3.0|&amp;32.5 \\0&amp;2.5&amp;0.8|&amp;9 \\0&amp;-4.5&amp;-3.3|&amp;-25.5\end{vmatrix} 2.5005.02.54.53.00.83.332.5925.5
⇛ \Rrightarrow
∣ 2.5 5.0 3.0 ∣ 32.5 0 2.5 0.8 ∣ 9 0 0 − 1.86 ∣ − 9.3 ∣ \begin{vmatrix} 2.5&amp;5.0&amp;3.0|&amp;32.5 \\0&amp;2.5&amp;0.8|&amp;9 \\0&amp;0&amp;-1.86|&amp;-9.3\end{vmatrix} 2.5005.02.503.00.81.8632.599.3
⇛ \Rrightarrow
x 3 = − 9.3 / ( − 1.86 ) = 5.000 x_3=-9.3/(-1.86)=5.000 x3=9.3/(1.86)=5.000
x 2 = [ 9 − ( 0.8 ∗ x 3 ) ] / 2.5 = 2.000 x_2=[9-(0.8*x_3)]/2.5=2.000 x2=[9(0.8x3)]/2.5=2.000
x 1 = [ 32.5 − 15 − 10 ] / 2.5 = 3.000 x_1=[32.5-15-10]/2.5=3.000 x1=[32.51510]/2.5=3.000

  1. 先从 1 1 1~ n n n枚举每一行,对于 ∀ x , i &lt; x ≤ n \forall x,i&lt;x\le n x,i<xn,削去 x x x i i i列的系数,使系数成为 0 0 0
  2. 观察可以发现,最后一行 n n n只有 x n x_n xn的系数不为0,则可求出 x n x_n xn,进而代入消元。

具体过程见代码。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=110;
double a[N][N];
double f[N];int n;
void gauss()
{
   for(int i=1;i<=n;i++)
   {
   	int r=i;//仅仅只是为了减少精度损失
   	for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[r][i]))r=j;
   	for(int j=1;j<=n+1;j++){double t=a[r][j];a[r][j]=a[i][j];a[i][j]=t;}
   	for(int j=n+1;j>=i;j--)
   	{
   		for(int k=i+1;k<=n;k++)
   			a[k][j]-=a[k][i]/a[i][i]*a[i][j];
   	}
   }
   for(int i=n;i>=1;i--)
   {
   	double t=a[i][n+1];
   	for(int j=i+1;j<=n;j++)
   	{
   		t-=a[i][j]*f[j];
   	}
   	f[i]=t/a[i][i];
   }
}
int main()
{
   scanf("%d",&n);
   for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
   gauss();
   for(int i=1;i<=n;i++)printf("%.3lf ",f[i]);puts("");
   return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值