浅谈高斯消元的实现和简单应用

一、高斯消元的原理

对于n元的m个线性方程组成的方程组,我们将其以矩阵的形式记录下来:

a11 a12 a13 ...... a1n b1
a21 a22 a23 ...... a2n b2
...
...
...
an1 an2 an3 ...... ann bn

然后进行初等行列变换,尝试构造出一个上三角矩阵,逐步使系数不为零的项减少;

等最后只剩下一个系数不为零时,进行回代,逐步求出已知解。(详解过程咨询小学老师)

二、高斯消元的实现

老老实实的回代代码参见其他人的博客,这里介绍一种比较毒瘤的不回代暴力消元法:

1.Process

对于每个方程,按照一定的规则(后话)挑选一个主元,记录该主元对应第几个方程,然后用初等行列变换消去其他所有该元的系数;

最后我们得到的是一个每行只有一个数不为零,每列只有一个数不为零的鬼畜矩阵(自己脑补)

此时令ans向量对应的数字出去该行的非零系数,即为对应该元的解。

2.Code

设a数组为已经记录系数的数组(格式见上方),那么a应该是n行n+1列的,最后一列代表方程的常数项;

设w数组记录每个方程的主元是第几项,v数组记录答案;

当多解时输出“Multiple solutions”,无解时输出”No solution”;


double a[max_n][max_n+1],v[max_n];int w[max_n]; void gauss(){double eps=1e-6;for(int i=1;i<=n;++i){    //Enumerate the equation;int p=0;                //Record the position of the largest number; double mx=0;        //Recording the largest number;for(int j=1;j<=n;++j)if(fabs(a[i][j])-eps>mx){mx=fabs(a[i][j]);p=j;    //fabs() returns the absolute value of float; }if(!p){if(fabs(a[i][n+1]<eps))printf("Multiple solutions");else printf("No solution");return; }w[i]=p;for(int j=1;j<=n;++j)if(i!=j){       //other equationsdouble t=a[j][p]/a[i][p];for(int k=1;k<=n+1;++k)    //n+1 is importanta[j][k]-=a[i][k]*t;}}for(int i=1;i<=n;++i) v[w[i]]=a[i][n+1]/a[i][w[i]];
} 

3.notice

(1)精度的设置

众所周知浮点数是有精度丢失的,在高斯消元中,精度的选择要依题目而定,精度过低会导致系数较小的数被误认为系数为零,而精度过高也有可能会导致误差大于精度,导致本应该系数消为0的项误认为系数不为零,所以精度的选择是很哲学的问题,要注意。

推荐范围:1e-4到1e-10

(2)主元的选取原则

接着(1)说,我们知道,用浮点数是有精度丢失的,那么让一个较大的数除以一个极小的数误差自然大的可想而知,所以我们想得到在精度允许的条件下系数最大的主元,所以对于每个方程,我们都应该选择最大系数的元作为主元。

(3)在模2意义下的高斯消元

使用bitset优化运行时间,详见相关应用中第三个例题的讲解;

三、相关应用

这里给出高斯消元的几道基础题目,难度适合初学者。

1.[Luogu P3389]【模板】高斯消元

Description

给定一个线性方程组,对其求解

输入格式:
第一行,一个正整数 n
第二至 n+1行,每行 n+1个整数,为 a1,a2⋯an和 b,代表一组方程。

输出格式:
共n行,每行一个数,第 i行为 xi(保留2位小数)
如果不存在唯一解,在第一行输出"No Solution".

Solution

如上所述。

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;const int max_n=110;
double a[max_n][max_n+1],v[max_n];
int n,w[max_n]; inline int rd(){int x=0;bool f=0;char c=getchar();while(!isdigit(c)){if(c=='-') f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}void gauss(){double eps=1e-6;for(int i=1;i<=n;++i){//enumerate the equation;int p=0;          //Record the position of the largest number; double mx=0;      //Recording the largest number;for(int j=1;j<=n;++j)if(fabs(a[i][j])-eps>mx){mx=fabs(a[i][j]);p=j;//fabs() returns the absolute value of float; }if(!p){printf("No Solution");return; }w[i]=p;for(int j=1;j<=n;++j)if(i!=j){       //other equationsdouble t=a[j][p]/a[i][p];for(int k=1;k<=n+1;++k)//n+1 is importanta[j][k]-=a[i][k]*t;}}for(int i=1;i<=n;++i) v[w[i]]=a[i][n+1]/a[i][w[i]];for(int i=1;i<=n;++i) printf("%.2lf\n",v[i]);
}int main(){n=rd();for(int i=1;i<=n;++i)for(int j=1;j<=n+1;++j)a[i][j]=rd();gauss();return 0; 
}

2.[BZOJ 1013][JSOI 2008] 球形空间产生器sphere

详解参考我的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8982341.html

转载于:https://www.cnblogs.com/COLIN-LIGHTNING/p/8981923.html

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

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

相关文章

java知识体系 servlet_03-Servlet 体系结构知识梳理

一、Servlet体系结构Java Web应用是基于Servlet规范运行&#xff0c;Servlet顶层类的关联如下图&#xff1a;从图可看出&#xff0c;Servlet规范基本围绕这几个类运行&#xff0c;其中&#xff0c;与Servlet主动关联的有3个类&#xff0c;分别是ServletRequest、ServletRespons…

SQL批量提交修改业务

把你需要批量提交修改的东西在内存中修改完毕 然后执行以下代码 SqlConnection conn new SqlConnection(ConnectionString);SqlDataAdapter sda new SqlDataAdapter("select Id,RankSummary,RankOfCn,Classify from u_College;", conn); //这里的SQL语句可以是查询…

testlink自带java api_java如何连接testlink

1.下载相关的jar包2.获取到testlink的url和key&#xff0c;注意&#xff1a;url不是testlink的连接地址&#xff0c;是连接地址/lib/api/xmlrpc.php3.测试是否连接成功public static void main(String args[]) {String url "http://test.tl.gmsd.lan/lib/api/xmlrpc.php&…

ubuntu解压缩zip/tar/tar.gz/tar.bz2

ubuntu解压缩zip/tar/tar.gz/tar.bz2ZIPzip可能是目前使用得最多的文档压缩格式。它最大的优点就是在不同的操作系统平台&#xff0c;比如Linux&#xff0c; Windows以及Mac OS&#xff0c;上使用。缺点就是支持的压缩率不是很高&#xff0c;而tar.gz和tar.gz2在压缩率方面做得…

lr背景虚化_lr背景虚化_怎样拍出背景模糊的照片

除了锐化之外&#xff0c;要获得独特的&#xff0c;令人难忘的图像&#xff0c;还可以使用其他方法&#xff0c;例如&#xff0c;相反的效果-单个细节的模糊。这样的方法将使人们有可能专注于整个构图的中心人物&#xff0c;为图片增加情感色彩&#xff0c;动作&#xff0c;并为…

MySql Delimiter

Delimiter 重新定义结束符&#xff0c;delimiter 默认情况下是 分号 &#xff08;;&#xff09; &#xff0c;即默认情况下&#xff0c;Mysql解释器&#xff0c;遇到分号&#xff0c;则执行该命令。 但在mysql可视化图形客户端编辑命令时&#xff0c;当编辑的sql语句存在多行命…

在线五子棋JAVA网络编程_实验五 Java网络编程及安全

一、实验内容1&#xff0e;掌握Socket程序的编写&#xff1b;2&#xff0e;掌握密码技术的使用&#xff1b;3&#xff0e;设计安全传输系统。二、实验步骤1. 基于Java Socket实现安全传输2. 基于TCP实现客户端和服务器&#xff0c;结对编程一人负责客户端&#xff0c;一人负责服…

Python学习之==文件操作

1、打开文件的模式 1 r&#xff0c;只读模式&#xff08;默认&#xff09;【不可写&#xff1b;文件不存在&#xff0c;会报错】 2 w&#xff0c;只写模式【不可读&#xff1b;不存在则创建&#xff1b;存在则删除内容】 3 a&#xff0c;追加模式【不可读&#xff1b;不存在则创…

java多线程创建runnable_Java线程池和runnables创建runnables

有很多方法可以做你想要的 . 您需要小心&#xff0c;不要最终创建太多线程 .以下是一个示例&#xff0c;您可以使用ExecutorCompletionService提高效率&#xff0c;也可以使用Runnable .import java.util.ArrayList;import java.util.List;import java.util.Random;import java…

CF某gym G

题目大意&#xff1a;给定n个点&#xff0c;求一条直线最多能经过几个点(n<1000) 做法&#xff1a;大暴力。。。枚举每一个点作为直线的端点&#xff0c;然后求出剩下n-1个点和它的斜率&#xff0c;斜率相同的说明可以同时在一条直线上 #include<bits/stdc.h> #define…

java嵌入式开发neo4j_java-嵌入式Neo4j实际如何工作?

我是neo4j的新手,根据我到目前为止所做的阅读,似乎有两种方法可以使用Neo4j REST和Embedded与neo4j进行交互.我有点困惑的是,“嵌入式”选项是否仅使您能够使用本机Neo4j API操纵数据存储,还是可以嵌入Neo4j并将其与Java应用程序打包,如果可以的话,我该怎么做&#xff1f;解决方…

rnn中文语音识别java_语音识别算法阅读之RNN-T-2018

论文&#xff1a;EXPLORING ARCHITECTURES, DATA AND UNITS FOR STREAMING END-TO-END SPEECH RECOGNITION WITH RNN-TRANSDUCER,2018CTC的一个问题在于&#xff0c;其假设当前帧的输出与历史输出之间的条件独立性&#xff1b;RNN-T引入预测网络来弥补CTC这种条件独立性假设带来…

java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和

首先让我们将这个问题简化为整数而不是实数,否则我们将无法获得快速优化算法.例如,让我们将所有数字乘以100,然后将其四舍五入为下一个整数.所以说我们有项目大小x1,…,xn和目标大小Y.我们想要最小化该值k1 x1 … kn xn – Y在这种条件下(1) ki is a non-positive integer fo…

Mybatis 系列2-配置文件

【Mybatis 系列10-结合源码解析mybatis 执行流程】 【Mybatis 系列9-强大的动态sql 语句】 【Mybatis 系列8-结合源码解析select、resultMap的用法】 【Mybatis 系列7-结合源码解析核心CRUD配置及用法】 【Mybatis 系列6-结合源码解析节点配置objectFactory、databaseIdProvid…

python中restful接口开发实例_Python RESTful接口开发02

什么是RESTfulRESTful是一种设计思想&#xff0c;一种风格。RESTful主要包括 资源 和 对资源的操作。资源&#xff1a; 对实体的抽象&#xff0c;图书、音乐、电影、学生等都属于资源。对资源的操作&#xff1a; HTTP 方法 行为 示例 GET 获取资源的信息 http://example.com/…

Storm环境搭建(分布式集群)

作为流计算的开篇&#xff0c;笔者首先给出storm的安装和部署&#xff0c;storm的第二篇&#xff0c;笔者将详细的介绍storm的工作原理。下边直接上干货&#xff0c;跟笔者的步伐一块儿安装storm。 原文链接&#xff1a;Storm环境搭建&#xff08;分布式集群&#xff09; Step1…

php 红包算法,PHP语言:实现微信红包拆分算法

本文主要向大家介绍了PHP语言&#xff1a;实现微信红包拆分算法&#xff0c;通过具体的内容向大家展示&#xff0c;希望对大家学习php语言有所帮助。 修复最后一个红包输出未保留2位数 修复领取的红包金额低于最小红包限制* 红包分配算法** example* $coupon new Coupon(…

java 强制向上转型,Java 转型(向上或向下转型)详解及简单实例

在Java编程中经常碰到类型转换&#xff0c;对象类型转换主要包括向上转型和向下转型。向上转型我们在现实中常常这样说&#xff1a;这个人会唱歌。在这里&#xff0c;我们并不关心这个人是黑人还是白人&#xff0c;是成人还是小孩&#xff0c;也就是说我们更倾向于使用抽象概念…

复习Python DB-API

一、python的DB-API 1.Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同 的方式操作各数据库。 Python DB-API使用流程: 1. 引入API模块。 2. 获取与数据库的连接。 3. 执行SQL语句和存储过程。 4. 关闭数据库连接。 2.Python操作mysql 安装包&am…

java se程序设计课后答案,JAVA SE程序设计及实践

实践3 类与对象实践3.4修改Menu类&#xff0c;增加显示普通员工、经理、管理员对应的功能菜单的方法。package com.dh.hrmanager.util;import java.util.Scanner;public class Menu {/*** 返回登陆菜单*/public void showLoginMenu() {System.out.println("\n\n\t\t欢迎进…