首页 > 其他分享 >高斯-约旦消元法详解

高斯-约旦消元法详解

时间:2023-01-27 18:48:10浏览次数:42  
标签:begin frac int 详解 约旦 end array 元法

注:本文章假设读者已经学会基础的高斯消元法

引入

高斯约旦消元法是高斯消元法的一种,一般用于求解线性方程组。

对于一个线性方程组

\[ \begin{cases} x + 3y + 4z = 5\\ x + 4y + 7z = 3\\ 9x + 3y + 2z = 2 \end{cases}\]

我们可以将其写成一个增广矩阵的形式

\[\left[\begin{array}{ccc|c} 1 & 3 & 4 & 5\\ 1 & 4 & 7 & 3\\ 9 & 3 & 2 & 2\\ \end{array}\right]\]

我们知道,高斯消元是将增广矩阵等号左边部分化成一个阶梯化矩阵。这样可以轻易求出最后一个未知数的值,再回代入上一个方程,最终计算出每一个未知数的值。

而高斯约旦消元法没有回代的过程,而是旨在将非对角线上的系数都化为 \(0\)。

步骤

1. 寻找主元,并将主元所在行放在未操作行的第一个。

对于这个矩阵,第一步先找到第一列最大值作为主元,如图应该为 \(9\)。

\[\left[\begin{array}{ccc|c} 1 & 3 & 4 & 5\\ 1 & 4 & 7 & 3\\ 9 & 3 & 2 & 2\\ \end{array}\right]\]

换位之后该图变化为

\[\left[\begin{array}{ccc|c} 9 & 3 & 2 & 2\\ 1 & 4 & 7 & 3\\ 1 & 3 & 4 & 5\\ \end{array}\right]\]

2.进行消元

将第一列除当前行以外的行都进行消元(包括已操作过的行)。
消去第一列化为

\[\left[\begin{array}{ccc|c} 9 & 3 & 2 & 2\\ 0 & \frac{11}{3} & \frac{61}{9} & \frac{25}{9}\\ 0 & \frac{8}{3} & \frac{34}{9} & \frac{43}{9}\\ \end{array}\right]\]

第一二步轮流操作,直到形成对角线。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define MAXN 105

using namespace std;

int n;
double a[MAXN][MAXN];

void swap_line(int x,int y)
{ // 将两行交换 
	for(int i = 1;i <= n+1; i++)
		swap(a[x][i],a[y][i]);
	
	return ;
}

int find(int top/*top代表列数*/)// 寻找当前列的主元,返回主元所在行 
{
	// 寻找这一列中最大的系数为主元  
	int maxn = top;
	for(int i = top+1;i <= n; i++)
	{
		if( fabs(a[i][top]) > fabs(a[maxn][top]) )
			maxn = i;
	}
	return maxn;
}

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]);
	}
	
	for(int i = 1;i <= n; i++)
	{
		int _main = find(i);// 这里 _main 表示的是主元所在行  
		swap_line(i,_main);
		if( a[i][i] == 0 )
		{// 一列全是 0 则表示方程组无解  
			printf("No Solution\n");
			return 0;
		}
		
		for(int j = 1;j <= n; j++)
		{// 消元的过程  
			if( i != j )
			{
				double tmp = a[j][i]/a[i][i];
				for(int k = i;k <= n+1;k++)
					a[j][k] -= a[i][k]*tmp;
			}
		}
	}
	
	for(int i = 1;i <= n; i++)
	{// 要除以该项系数  
		a[i][n+1] /= a[i][i];
	}
	
	for(int i = 1;i <= n; i++)
	{
		printf("%.2lf\n",a[i][n+1]);
	}
	
	return 0;
} 

标签:begin,frac,int,详解,约旦,end,array,元法
From: https://www.cnblogs.com/baijian0212/p/17068962.html

相关文章

  • 高斯-约旦消元法详解
    注:本文章假设读者已经学会基础的高斯消元法引入高斯约旦消元法是高斯消元法的一种,一般用于求解线性方程组。对于一个线性方程组\[\begin{cases}x+3y+4z=5\\x......
  • 腾讯出品小程序自动化测试框架【Minium】系列(四)API详解(上)
    写在前面不知道是不是因为之前出过书的原因,在写教程之类的文章,会潜意识有自带目录和章节的感觉在里面,有点说不出的感觉吧。上篇文章我们介绍了关于元素定位的使用方法,这......
  • Github开源项目详解--Mall(一)
    前言跟着视频学了那么多技术,有没有自己尝试过做一个开源项目呢?下面让我们一步一步分析这个最火的前后端分离项目项目地址:​​https://github.com/YuyanCai/mall​​从0开始......
  • Spring Bean生命周期——从源码角度详解Spring Bean的生命周期(上)
    文章目录​​写在前面​​​​一、SpringBean元信息配置阶段​​​​1、使用xml方式配置BeanDefinition​​​​代码实例​​​​2、使用Properties资源配置BeanDefiniti......
  • 腾讯出品小程序自动化测试框架【Minium】系列(三)元素定位详解
    写在前面昨天转发这篇文章时,看到群里有朋友这样说:这么卷吗?这个框架官方已经不维护了。姑且不说卷不卷的问题,要是能卷明白,别说还真不错;不维护又怎样?我想学习,想会,分享给......
  • 【云原生kubernetes】k8s中pod使用详解
    一、前言在之前k8s组件一篇中,我们谈到了pod这个组件,了解到pod是k8s中资源管理的最小单位,可以说Pod是整个k8s对外提供服务的最基础的个体,有必要对Pod做深入的学习和探究。二......
  • 【Javaweb】Servlet八 | 请求转发的代码实现【详解】
    请求的转发什么是请求的转发?请求转发是指,服务器收到请求时,从一次资源转到另一个资源的操作叫做请求转发。 部分代码//获取请求的参数(办事的材料)查看......
  • ThinkPHP函数详解:cache方法
    cache方法是3.0版本开始新增的缓存管理方法。注意:3.1.2版本后因cache方法并入原S方法,所以cache方法不再建议使用,用S方法即可。cache用于缓存设置、获取、删除操作用......
  • JSP六个动作详解...
    JSP中6个动作为:1.Include、 2.Forward、3.UseBean、 4.GetProperty、 5.SetProperty、6.Plugin。一、Include指令<jsp:include>标签表示包含一个静态的或者动态的文件......
  • python WSGI框架详解(转载)
    thonWSGI框架详解pythonWSGI框架详解 WSGI 几个关于WSGI相关的概念WSGI:全称是WebServerGatewayInterface,WSGI不是服务器,python模块,框架,API或者任何软件,......