高斯消元。

传送门
高斯消元:用模拟的方式来实现对多个方程组的求解。
高斯消元可分为两个步骤:化简和回代

化简:

将方程组组成一个增广矩阵,并将其化为行阶梯矩阵。

int Gauss()
{
    
    
	for(int c = 1; c <= n; c++)
	{
    
    
		int f = c;
		for(int r = c; r <= n; r++)
		{
    
    
			if(fabs(a[f][c]) < fabs(a[r][c]))
			{
    
    
				f = r;
			}
		}
		for(int i = 1; i <= n+1; i++)
		{
    
    
			swap(a[c][i],a[f][i]);
		}

		for(int i = c+1; i <= n+1; i++)
		{
    
    
			if(fabs(a[c][c]) <= eps)
			{
    
    
				cout<<"No Solution";
				return 0;
			}
			a[c][i] = a[c][i]/a[c][c];
		}
		a[c][c] = 1;

		for(int r = c+1; r <= n; r++)
		{
    
    
			for(int i = c+1; i <= n+1; i++)
			{
    
    
				a[r][i] = a[r][i]-a[r][c]*a[c][i];
			}
			a[r][c] = 0;
		}
	}
}

回代:

从下往上将未知数回代:

int solve()
{
    
    
	int f = 0;
	for(int i = 1; i <= n+1; i++)if(a[n][i])f = 1;
	if(!f)return 0;
	for(int i = n; i >= 1; i--)
	{
    
    
		double sum = 0;
		for(int j = i+1; j <= n; j++)
		sum += a[i][j]*ans[j];
		if(fabs(a[i][i]) <= eps)
		return 0;
		ans[i] = (a[i][n+1]-sum)/a[i][i];
	}
	return 1;
}

ac代码:

#include<iostream>
#include<string>
#include<map>
#include<iomanip>
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
#define endl '\n'
using namespace std;
const double eps = 0.0000001;
int n;
double a[110][110];
double ans[110];

int Gauss()
{
    
    
	int free = 0;
	for(int c = 1; c <= n; c++)
	{
    
    
		/*交换*/
		int f = c;
		for(int r = c; r <= n; r++)
		{
    
    
			if(fabs(a[f][c]) < fabs(a[r][c]))
			{
    
    
				f = r;
			}
		}
		
		
		for(int i = 1; i <= n+1; i++)
		{
    
    
			swap(a[c][i],a[f][i]);
		}

		for(int i = c+1; i <= n+1; i++)
		{
    
    
			if(fabs(a[c][c]) <= eps)
			{
    
    
				cout<<"No Solution";
				return 0;
			}
			a[c][i] = a[c][i]/a[c][c];
		}
		a[c][c] = 1;

		for(int r = c+1; r <= n; r++)
		{
    
    
			for(int i = c+1; i <= n+1; i++)
			{
    
    
				a[r][i] = a[r][i]-a[r][c]*a[c][i];
			}
			a[r][c] = 0;
		}
	}
}
int solve()
{
    
    
	int f = 0;
	for(int i = 1; i <= n+1; i++)if(a[n][i])f = 1;
	if(!f)return 0;
	for(int i = n; i >= 1; i--)
	{
    
    
		double sum = 0;
		for(int j = i+1; j <= n; j++)
		sum += a[i][j]*ans[j];
		if(fabs(a[i][i]) <= eps)
		return 0;
		ans[i] = (a[i][n+1]-sum)/a[i][i];
	}
	return 1;
}
int main()
{
    
    
	cin>>n;
	for(int i = 1; i <= n;i++)
	{
    
    
		for(int j = 1; j <= n+1; j++)
		{
    
    
			cin>>a[i][j];
		}
	}
	int f = Guess();
	if(!f)return 0;

	int fl = solve();
	if(!fl)
	{
    
    
		printf("No Solution");
		return 0;
	}
	for(int i = 1; i <= n; i++)
	{
    
    
		printf("%.2lf\n",ans[i]);
	}
	
}

猜你喜欢

转载自blog.csdn.net/p15008340649/article/details/120863613
今日推荐