高斯消元法

news2024/11/25 12:56:19

顾名思义就是我们初中所知的消元方程,用来解方程的,但是如果自己手动去实现的话,还是有一部分难度的,因此我们也会用到线代这门科目,因为这是实现计算自动化的关键步骤

现在这里放上高斯消元的板子(可以用于区分有解,有无数组解和无解的情况)

void Gauss() //高斯消元
{
    for(int i=1;i<=n;i++)
    {
        int maxn=i;
        for(int j=1;j<=n;j++) 
        {
            if(fabs(a[j][j])>eps&&j<i) 
			{
				continue;//若在i前,且的确已对应一项系数,不可用
			}
            if(fabs(a[j][i])>fabs(a[maxn][i]))
            {
                maxn=j;
            }
        }
        if(maxn!=i)
        swap(a[maxn],a[i]);
        if(fabs(a[i][i])<=eps) 
		{
			continue;
		}
		
		double div=a[i][i];
		for(int j=i;j<=n+1;j++)
		{
			a[i][j]/=div;
		}
        for(int j=1;j<=n;j++)
        {
            if(i==j) 
			continue;
            div=a[j][i];
            for(int k=i;k<=n+1;k++)
            {
                a[j][k]-=div*a[i][k];
            }
        }
    }
}

 例题

P3389 【模板】高斯消元法

 

纯板子题甚至不需要区分有无数组解和无解的情况,在上面板子优化代码即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
double a[105][105];
double ans[105];//统计每个数的结果
double flag=1e-7;//用来判断是否会小于0 
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n+1;j++)
		{
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		int r=i;//用来找到最大行
		for(int j=i+1;j<=n;j++)
		{
			if(fabs(a[r][i])<fabs(a[j][i]))
			{
				r=j;
			}
		} 
		if(fabs(a[r][i])<flag)
		{
			cout<<"No Solution\n";
			return 0;
		}
		if(i!=r)
		{
			swap(a[i],a[r]);
		}
		double div=a[i][i];
		for(int j=i;j<=n+1;j++)
		{
			a[i][j]/=div;
		}
		for(int j=i+1;j<=n;j++)
		{
			div=a[j][i];
			for(int k=i;k<=n+1;k++)
			{
				a[j][k]-=div*a[i][k];
			}
		}
	 } 
	 
	ans[n]=a[n][n+1];
	for(int i=n-1;i>=1;i--)
	{
		ans[i]=a[i][n+1];
		for(int j=i+1;j<=n;j++)
		{
			ans[i]-=(a[i][j]*ans[j]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		printf("%.2lf\n",ans[i]);
	}
	return 0;
} 

P2455 [SDOI2006] 线性方程组

就是加了一个需要区分无数组解和无解的情况,这个直接用上面的板子即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
double a[55][55];
double eps=1e-7;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n+1;j++)
		{
			cin>>a[i][j];
		}
	}
	
	//高斯消元法 
	for(int i=1;i<=n;i++)
	{
		int r=i;
		for(int j=1;j<=n;j++)
		{
			if(fabs(a[j][j])>eps&&j<i)
			{
				continue;
			}
			if(fabs(a[j][i])>fabs(a[r][i]))
			{
				r=j;
			}
			if(r!=i)
			{
				swap(a[i],a[r]);
			}
			if(fabs(a[i][i])<=eps) 
		    {
		    	continue;
	    	}
			double div=a[i][i];
			for(int j=i;j<=n+1;j++)
			{
				a[i][j]/=div;
			}
			for(int j=1;j<=n;j++)
			{
				if(i==j)//防止自己行-自己行 
				continue;
				div=a[j][i];
				for(int k=i;k<=n+1;k++)
				{
					a[j][k]-=div*a[i][k];
				}
			}
		}
	}
	
	//特判情况
	int flag=1;
	for(int i=1;i<=n;i++)
	{
		if(fabs(a[i][i])<=eps)
		{
			if(fabs(a[i][n+1])>eps)
			{
				flag=-1;
			}
			else if(flag!=-1)
			{
				flag=0;
			}
		}
	} 
	
	if(flag!=1)
	{
		cout<<flag<<"\n";
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			cout<<"x"<<i<<"=";
			printf("%.2lf\n",fabs(a[i][n+1])<eps?0:a[i][n+1]);
		}
	}
	return 0;
}

 P4035 [JSOI2008] 球形空间产生器

高斯消元的变式,推一下就出公式了,很简单,明天讲解为什么

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
double a[15][15];
double mp[15][15];
double eps=1e-7;

void Gauss() //高斯消元
{
    for(int i=1;i<=n;i++)
    {
        int maxn=i;
        for(int j=1;j<=n;j++) 
        {
            if(fabs(a[j][j])>eps&&j<i) 
			{
				continue;//若在i前,且的确已对应一项系数,不可用
			}
            if(fabs(a[j][i])>fabs(a[maxn][i]))
            {
                maxn=j;
            }
        }
        if(maxn!=i)
        swap(a[maxn],a[i]);
        if(fabs(a[i][i])<=eps) 
		{
			continue;
		}
		
		double div=a[i][i];
		for(int j=i;j<=n+1;j++)
		{
			a[i][j]/=div;
		}
        for(int j=1;j<=n;j++)
        {
            if(i==j) 
			continue;
            div=a[j][i];
            for(int k=i;k<=n+1;k++)
            {
                a[j][k]-=div*a[i][k];
            }
        }
    }
}

signed main()
{
	cin>>n;
	for(int i=1;i<=n+1;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>mp[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int k=1;k<=n;k++)
		{
			a[i][k]=mp[i+1][k]-mp[i][k];
			a[i][n+1]+=(mp[i+1][k]*mp[i+1][k]-mp[i][k]*mp[i][k])/2;
		}
	}
	Gauss();
	for(int i=1;i<=n;i++)
	{
		printf("%.3lf ",fabs(a[i][n+1])<=eps?0:a[i][n+1]);
	}
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正点原子阿尔法ARM开发板-IMX6ULL(四)——汇编LED驱动实验-下

文章目录 一、驱动编写1.1 配置GPIO的电气属性1.2 配置GPIO的功能&#xff08;GDIR寄存器&#xff09;1.3 设置输出&#xff08;DR寄存器&#xff09;1.4 最终代码 二、编译程序2.1 编译程序2.2 链接文件2.3 格式转换成BIN文件2.4 反汇编 三、烧写bin到SD卡中并运行3.1 准备工作…

中介者模式mediator

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/mediator 减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。

数据结构:树与二叉树(2)

1、线索二叉树 1.1线索二叉树的定义 &#xff08;1&#xff09;线索二叉树有啥用&#xff1f; 普通二叉树的节点包含左孩子和右孩子的信息&#xff0c;但并没有直接存储关于“直接前驱”和“直接后继”的信息&#xff0c;结点的前驱和后继只能在遍历过程中获得。 因此这里引…

Springboot中mybatis的使用

一.创建Springboot项目并加载依赖 1.利用IDEA创建SpringBoot项目&#xff0c;并勾选必须依赖&#xff0c;步骤如下&#xff08;IDEA版本为2024版&#xff09; 注意&#xff1a; 1.首先更换镜像源&#xff0c;否则加载配置环境比较慢&#xff0c;网上搜阿里的镜像源就行。 2…

关于在vue2中使用el-tree的记录

此文章会持续更新在使用el-tree过程中应用到的功能... 先看此效果&#xff1a; html&#xff1a; <el-tree :data"data" :props"defaultProps" node-click"handleNodeClick">//自定义节点内容<span slot-scope"{ data }"&g…

Leetcode面试经典150题-135.分发糖果

解法都在代码里&#xff0c;不懂就留言或者私信 阿里字节都考过 class Solution {/**对于每个孩子来说&#xff0c;我们试一下从左边开始它应该分几个糖果&#xff0c;然后看一下从右边开始它应该分几个糖果然后左右取最大值&#xff0c;每个位置求和就是我们要的答案 */publ…

【解决keil不能跳转函数声明的问题】

第一步&#xff1a;将魔术棒中的output选项里Browase Information功能打开 第二步&#xff1a;重新编译整个工程 第三步&#xff1a;跳转测试

Java项目: 基于SpringBoot+mybatis+maven实现的IT技术交流和分享平台(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven实现的IT技术交流和分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…

【笔记】2.1 石英类原料

2.1.1 石英类原料的种类 石英&#xff1a;结晶矿物。 &#xff08;1&#xff09;石英砂&#xff08;硅砂&#xff09; 石英石、长石在水、二氧化碳、温度作用下风化分解由水流冲击沉积而形成。 主要成分为&#xff0c;质地纯净的硅砂为白色&#xff0c;其中若含有少量杂质&…

SpringCloud集成MybatisPlus,实现MySQL多数据源配置

引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version> </dependency><dependency><groupId>com.alibaba</groupId><art…

Apache DataFusion查询引擎简介

01 简介 DataFusion是一个查询引擎&#xff0c;其本身不具备存储数据的能力。正因为不依赖底层存储的格式&#xff0c;使其成为了一个灵活可扩展的查询引擎。它原生支持了查询CSV&#xff0c;Parquet&#xff0c;Avro&#xff0c;Json等存储格式&#xff0c;也支持了本地&#…

TCP通信实现

前言 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于流的通信协议。它是互联网协议栈&#xff08;TCP/IP&#xff09;中的核心协议之一&#xff0c;主要用于保证在计算机网络中可靠地传输数据。 TCP通信的基…

面向物联网基础的智能农业环境的节能边缘-雾-云计算架构

这篇论文的标题是《Energy-Efficient Edge-Fog-Cloud Architecture for IoT-Based Smart Agriculture Environment》&#xff0c;作者是Hatem A. Alharbi和Mohammad Aldossary&#xff0c;发表在IEEE Access期刊上。论文的主要内容可以概括为以下几个部分&#xff1a; 摘要&am…

【JVM 工具命令】JAVA程序线上问题诊断,JVM工具命令的使用,jstat, jstack,jmap命令的使用

【JVM 工具命令】JAVA程序线上问题诊断&#xff0c;JVM工具命令的使用&#xff0c;jstat&#xff0c; jstack&#xff0c;jmap命令的使用 1. JVM监控工具&#xff1a; Jstat命令 通过这个命令查询java程序&#xff0c;gc的情况 jstat -gcutil {pid} 5000 12 5000 表示5000…

JavaWeb【day12】--(SpringBootWeb登录认证)

案例-登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。 最终我们…

Mysql高级篇(中)—— 索引优化

Mysql高级篇&#xff08;中&#xff09;—— 索引优化 一、索引分析案例案例 1&#xff1a;单表查询案例 2&#xff1a;两表连接查询案例 3&#xff1a;三表连接查询 二、避免索引失效常见索引失效场景简述场景 1场景 2场景 3场景 4场景 5场景 6 三、索引优化文字版示例版 一、…

每日OJ_牛客_数组中出现次数超过一半的数字

目录 牛客_数组中出现次数超过一半的数字 解析代码1 解析代码2 牛客_数组中出现次数超过一半的数字 数组中出现次数超过一半的数字__牛客网 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。例如输入一个长度为…

瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导

本文OpenHarmony标准系统应用兼容性测试指导&#xff0c;适用鸿蒙系统软件开发测试的新手入门学习课程。设备为触觉智能的瑞芯微RK3566开发板&#xff0c;型号Purple Pi OH。是Laval官方社区主荐的一款鸿蒙开发主板。支持Openharmony、安卓Android、Linux的Debian、Ubuntu系统。…

实战项目01-icon图标修改

修改项目图标 引入图片资源&#xff0c;放入指定目录&#xff0c;覆盖掉之前图片即可 目录&#xff1a;entry > src > main > resources > base > media 图片&#xff1a;startIcon.png foreground.png background.png 修改项目标题 需要修改 EntryAbilit…

Deploying Spring Boot Apps Tips

Java PaaS providers chatter command Efficient deployments See also spring-boot-reference.pdf https://docs.spring.io/spring-framework/reference/integration/checkpoint-restore.html