数学知识第七期 高斯消元

news2024/11/16 12:08:05

前言

高斯大家应该都挺熟悉的吧,伟大的数学家,希望大家能够熟练掌握他的知识!!!

一、高斯消元的基本内容

高斯消元法(Gaussian Elimination)是一种重要的线性代数算法,用于求解线性方程组。具体来说,它是通过一系列初等变换(如行列互换、倍乘等),将原方程组转换为上三角系数矩阵的等价方程组,从而简化问题的形式,最终求出方程组的解。高斯消元法的关键在于如何构造上三角系数矩阵,这需要通过前向消去和反向替换两个步骤来实现。在前向消去过程中,通过初等变换将任意系数矩阵变换为一个具有上三角系数值的等价矩阵;而在反向替换阶段,则是从已经得到的等价方程组的解出发,逐步逆向回到原方程组以求得剩余的解。

高斯消元法的应用非常广泛,不仅限于线性方程组的求解,还包括矩阵的特征值计算、特征向量寻找等问题。此外,高斯消元法对于大规模方程组的处理也非常有效,因为它们能够减少方程的数量,使得计算机能够在有限时间内完成计算。然而,如果方程组非常大,可能需要采用更高级的方法,如迭代法和分块技巧,以加快运算速度。

总结一下,高斯消元法的主要特点和应用包括:

基本原理:通过初等变换将任意系数矩阵方程组转换为具有上三角系数矩阵的等价方程组。
核心步骤:分为前向消去和反向替换两个过程。
适用范围:广泛应用于线性方程组的求解、矩阵特征值计算等。
大规模方程组:在高斯消元法基础上可能还需要采用迭代法或其他技巧处理大型方程组。

二、例题:

1.高斯消元解线性方程组

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const double eps = 1e-6;
double a[N][N];
int n;

int gauss()
{
    int r, c;   // r表示当前所在的行数,c表示当前所指向的列数
    for (r = 0, c = 0; c < n; c ++ ) {
        // step1: 找到当前列下绝对值最大的行t
        // 寻找绝对值最大的数是因为可以避免系数变得太大,精度较高.
        int t = r;
        for (int i = r; i < n; i ++ )
            if (fabs(a[t][c]) < fabs(a[i][c]))
                t = i;
        
        // 如果当前这一列的最大数都是0,那么所有数都是0,那么就跳过该列,继续枚举下一列
        if (fabs(a[t][c]) < eps)    continue;
        
        // 如果当前列下绝对值最大的数所在的行t和当前枚举的行r不同 那么执行step2
        // step2: 让第t行与未固定的行(第r行)的第一行交换
        if (t != r) {
            for (int j = c; j <= n; j ++ )
                swap(a[t][j], a[r][j]);
        }
        
        // step3: 将该行中的第一个非0的数化为1
        // 这里必须从后往前做,假设我们从前往后做,那么就先把该行中的第一个非0的数a[r][c]化为1了,此时a[r][c]=1
        // 但是它是一直循环的做,那么之后的数a[r][j]/=a[r][c]就等于a[r][j]/=1,也就等于a[r][j] 并没有改变
        // 主要的原因就是你从前往后的话就先把a[r][c]变为1了 那么后面的数除以的就是被更新后的a[r][c] 而不是最初的a[r][c]
        for (int j = n; j >= c; j -- )
            a[r][j] /= a[r][c];
        
        // step4: 将下面所有行的第c列变为0
        for (int i = r + 1; i < n; i ++ ) {
            // 只有当前行它的数不为0,才要进行削为0的操作
            // 如果当前行它的数为零,说明不用进行削为零的操作
            if (fabs(a[i][c]) > eps) {
                // 这里也需要倒着做 原理同上
                // 从后往前,当前i行的每个数字,都减去第i行的第c列a[i][c] * 第r行从第n列开始到第c列的每个数a[r][j]
                for (int j = n; j >= c; j -- )
                    a[i][j] -= a[i][c] * a[r][j];
            }
        }
        
        r ++ ;  // 这一行的工作做完,换下一行
    }
    
    // 说明剩下方程的个数是小于n的,说明不是唯一解,判断是无解还是无穷多解
    if (r < n) {
        // 因为已经是阶梯型,所以r~n-1的值应该都为0
        for (int i = r; i < n; i ++ )
            if (fabs(a[i][n]) > eps)    // 第i行的结果a[i][n]结果不是0 即出现了0 = 非0  所以无解
                return 2;
        return 1;   // 否则,0=0,就是r~n-1的方程都是多余方程    所以有无穷多组解
    }
    
    // 说明有唯一解  自底向上回代结果
    for (int i = n - 1; i >= 0; i -- )
        for (int j = i + 1; j < n; j ++ )
            a[i][n] -= a[i][j] * a[j][n];
    
    return 0;
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j <= n; j ++ )
            scanf("%lf", &a[i][j]);
            
    int t = gauss();
    if (!t) {   // 有唯一解
        for (int i = 0; i < n; i ++ ) {
            // 可能会出现输出-0.00的情况 因此需要特判掉
            if (fabs(a[i][n]) < eps)    a[i][n] = 0;
            printf("%.2lf\n", a[i][n]);
        }
    } else if (t == 1) {    // 有无穷多组解
        puts("Infinite group solutions");
    } else  puts("No solution");    // 无解
    
    return 0;
}

2、高斯消元解异或线性方程组

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N], n;

int gauss() {
    int r, c;
    for (r = 0, c = 0; c < n; c ++ ) {
        int t = r;
        for (int i = r; i < n; i ++ ) {
            if (a[i][c]) {
                t = i;
                break;
            }
        }
        
        if (!a[t][c])   continue;
        
        if (t != r) {
            for (int j = c; j <= n; j ++ )
                swap(a[t][j], a[r][j]);
        }
        
        for (int i = r + 1; i < n; i ++ ) {
            if (a[i][c]) {
                for (int j = n; j >= c; j -- )
                    a[i][j] ^= a[r][j]; // 也可以写成a[i][j] ^= a[i][c] & a[r][j]
            }
        }
        
        r ++;
    }
    
    if (r < n) {
        for (int i = r; i < n; i ++ )
            if (a[i][n])
                return 2;
        return 1;
    }
    
    for (int i = n - 1; i >= 0; i -- )
        for (int j = i + 1; j < n; j ++ )
            a[i][n] ^= a[i][j] & a[j][n];
    return 0;
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n + 1; j++)
            scanf("%d", &a[i][j]);
            
    int t = gauss();
    if (!t) {
        for (int i = 0; i < n; i++)
            printf("%d\n", a[i][n]);
    }
    else if (t == 1)
        puts("Multiple sets of solutions");
    else
        puts("No solution");
    return 0;
}

总结:感谢大家的观看,谢谢大家!!!

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

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

相关文章

vue3中多个表格怎么同时滚动并且固定表头

说明&#xff1a;这里需分为两种情况来做。第一种亲情况就是没有修改过el-table这个组件的样式&#xff1b;第二种情况就是修改过el-table组件的样式。第一种较为简单就简单略过&#xff0c;这里主要提及第二种做法。 1.需求效果 2.第一种没有修改过el-table这个组件的样式的做…

检测CUDA 是否能访问GPU时回应速度慢【笔记】

SUPWEMICRO 418G-Q20X12 维护记录&#xff1a; 两台设备均已安装CUDA与Pytorch&#xff0c;在检测CUDA 是否能访问GPU&#xff0c;执行torch.cuda.is_available()命令时&#xff0c;一台设备速度秒回应True&#xff0c;但另外一台设备回应速度慢&#xff08;1分钟左右&#xff…

JSON概述以及使用

1&#xff0c;JSON 1.1 概述 概念&#xff1a;JavaScript Object Notation。JavaScript 对象表示法. 如下是 JavaScript 对象的定义格式&#xff1a; {name:"zhangsan",age:23,city:"北京" } 接下来我们再看看 JSON 的格式&#xff1a; {"name&…

linux 使用命令创建mysql账户

目录 前言创建步骤 前言 mysql默认有一个root用户&#xff0c;这个账户权限太大了&#xff0c;用起来不太安全&#xff0c;我们通常是重新那家一个账户用于一般的数据库操作&#xff0c;下面介绍如何通过命令创建一个mysql账户。 创建步骤 登录mysql mysql -u root -p输入roo…

【云上建站】快速在云上构建个人网站3——网站选型和搭建

快速在云上构建个人网站3——网站选型和搭建 一、网站选型二、云市场镜像方式一&#xff1a;方式二&#xff1a;1. 进入ECS实例详情页面&#xff0c;点击停止&#xff0c;确保更换操作系统的之前ECS实例处于已停止状态&#xff0c;点击更换操作系统&#xff0c;进行镜像配置。2…

如何对Ajax请求进行封装操作,解决跨域问题的方法,如何使用core解决跨域

目录 1.Ajax原理 2.为什么要封装 3.如何进行封装 4.如何请求 5.如何解决Ajax跨域问题 6.使用CORS解决Ajax跨域问题 1.服务端 2.客户端 1.Ajax原理 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种通过在后台与服务器进行少量数据交换&…

29 python快速上手

Python操作MySQL和实战 1. 事务1.1 MySQL客户端1.2 Python代码 2. 锁2.1 排它锁2.2 共享锁 3. 数据库连接池4. SQL工具类4.1 单例和方法4.2 上下文管理 5.其他总结 目标&#xff1a;掌握事务和锁以及Python操作MySQL的各种开发必备知识。 概要&#xff1a; 事务锁数据库连接池…

【EI会议征稿通知】第四届光学与图像处理国际学术会议(ICOIP 2024)

第四届光学与图像处理国际学术会议&#xff08;ICOIP 2024&#xff09; 2024 4th International Conference on Optics and Image Processing 光学器件的实用化、图像处理的更优化等话题深受国内外专家、学者们关注。为推动光学与图像处理的发展&#xff0c;促进该领域学术交…

Python编程小案例——编一个事件提醒弹窗小程序

Python编程小案例——编一个事件提醒弹窗小程序 ​ 平时生活中有时候遇到这样的情况&#xff0c;早上把鸡蛋煮了&#xff0c;然后就进到书房开始忙自己的事了。不知不觉把煮鸡蛋的事彻底忘了&#xff0c;随着时间的推移&#xff0c;厨房里散发出来不正常的锅烧糊的味道&#x…

【Maven基础】依赖插件管理工具

Maven Maven 作用Maven 安装Maven 目录Maven config settings创建 Maven 项目运行 Java 文件Maven 坐标导入 Maven 项目依赖管理依赖配置 依赖传递排除依赖 依赖范围生命周期test跳过 Test Maven 作用 Maven 安装 Maven 目录 bin 存放可执行文件 config 存放 Maven 的配置文件 …

etcd自动化安装配置教程

文章目录 前言一、简介1. 简介2. 特点3. 端口介绍 二、etcd安装教程&#xff08;单机版&#xff09;1. 复制脚本2. 增加执行权限3. 执行脚本4. 查看启动状态5. 卸载etcd 三、etcd安装教程&#xff08;集群版&#xff09;1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 启…

Facebook的社交影响力:用户行为解析与趋势

在当今数字时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交平台之一&#xff0c;其社交影响力愈发显著。本文将深入分析Facebook的社交影响力&#xff0c;解析用户行为&#xff0c;同时探讨当前和未来的社交趋势。 社…

如何快速将 HTML 文件转换为 PDF

HTML表格是一种在网页上显示数据的通用且强大的方式。它们可用于创建简单的表&#xff08;例如日历&#xff09;或更复杂的表&#xff08;例如数据网格&#xff09;。在这篇博文中&#xff0c;我们将逐步学习如何在 C# 中创建 HTML 表格。本指南将为您提供在 C# 中有效创建 HTM…

MySQL运维实战(5.3) MySQL数据乱码的一些情况

作者&#xff1a;俊达 表数据乱码 表数据出现乱码的情况通常是由于数据的真实编码与相关参数不一致引起的&#xff0c;其中包括常见的参数如character_set_client、character_set_results、字段编码以及终端编码等。确保这些参数保持一致&#xff0c;可以有效预防和解决乱码问…

前端封装websocket类,实现消息注册和全局回调

实现消息注册和回调函数&#xff0c;实现全局使用同一个webscoket对象&#xff0c;并实现断线重连和心跳连接等功能&#xff0c;可以实现全局使用唯一实例&#xff0c;可以另外进行拓展配置 // WebSocket类对象 class WebSocketCli {// 构造函数constructor(url: string, opts…

如何更改Outlook阅读邮件时的默认字体?

如果收到的邮件中未指定字体&#xff0c;outlook默认使用宋体显示。 如果觉得不好看&#xff0c;可以进行更改。但不是在outlook中更改&#xff0c;outlook中只是修改编辑器中的字体&#xff0c;和纯文本邮件浏览的字体&#xff0c;不能更改未指定字体的HTML邮件的显示字体。 …

如何确保 Redis 集群的数据一致性?

当我们谈论Redis集群的数据一致性问题时&#xff0c;实际上我们是在探讨一个复杂且多维度的主题。 Redis作为一个高性能的键值存储数据库&#xff0c;在分布式环境下如何保证数据的一致性&#xff0c;是设计和使用Redis集群时需要重点考虑的问题。 下面&#xff0c;我将从多个角…

福禄克万用表使用注意事项

所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b; 2、Fluke 15B / 17B / 18B&#xff1b; 虽然福禄克万用表非常耐用&#xff0c;但是一旦电池漏液是非常糟糕的&#xff01; 定期查看电池是否漏液&#xff01; 定期查看电池是否漏液&#xff01; 定期查看电池是否…

SOLIDWORKS Simulation 2024增强新功能

SOLIDWORKS 2024 新功能前瞻| SOLIDWORKS Simulation 功能增强 • 性能增强功能 • 壳体的接合交互 • 网格性能 • 欠约束实体检测 • 增强型轴承接头 • 收敛检查图解 • 去耦合混合自由体模式 • 复制算例时排除网格和结果 • 新增在网格化后及分析完成后自动保存模…

推荐系统|召回_Swing召回通道

召回_Swing 模型 swing模型是ItemCF的一种改造 ItemCF的原理 举个例子。 ItemCF的存在的问题 有可能两篇不同类型的物品/笔记被分享到同一个微信群&#xff0c;从而提高了两个不同类型的视频被同一组人打开的概率。 而这只能说明这两个物品/笔记具有相同的受众&#xff0c;…