解线性方程组——直接解法:(Gauss)高斯消去法、列主元、全主元 | 北太天元

一、问题描述

对于线性方程组
A x = b , A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ) , b = ( b 1 b 2 ⋮ b n ) Ax=b,\quad A=\begin{pmatrix} a_{11} & a_{12} &\cdots &a_{1n}\\ a_{21} & a_{22} &\cdots &a_{2n}\\ \vdots & \vdots & &\vdots\\ a_{n1} & a_{n2} &\cdots &a_{nn}\\ \end{pmatrix},\quad b=\begin{pmatrix} b_1\\b_2\\ \vdots\\ b_n \end{pmatrix} Ax=b,A= a11a21an1a12a22an2a1na2nann ,b= b1b2bn

A为非奇异矩阵,求向量 x x x

二、Gauss消去法

思路:

系数矩阵逐步消元得到上三角矩阵,然后使用回代算法求解。

1. (耿直版)消元法

{ a 11 ( 1 ) x 1 + a 12 ( 1 ) x 2 + . . . + a 1 n ( 1 ) x n = b 1 ( 1 ) a 21 ( 1 ) x 1 + a 22 ( 1 ) x 2 + . . . + a 2 n ( 1 ) x n = b 2 ( 1 ) ⋯ a n 1 ( 1 ) x 1 + a n 2 ( 1 ) x 2 + . . . + a n n ( 1 ) x n = b n ( 1 ) \begin{cases} a_{11}^{(1)}x_1+a_{12}^{(1)}x_2+...+a_{1n}^{(1)}x_n=b_1^{(1)}\\ a_{21}^{(1)}x_1+a_{22}^{(1)}x_2+...+a_{2n}^{(1)}x_n=b_2^{(1)}\\\cdots \\ a_{n1}^{(1)}x_1+a_{n2}^{(1)}x_2+...+a_{nn}^{(1)}x_n=b_n^{(1)} \end{cases} a11(1)x1+a12(1)x2+...+a1n(1)xn=b1(1)a21(1)x1+a22(1)x2+...+a2n(1)xn=b2(1)an1(1)x1+an2(1)x2+...+ann(1)xn=bn(1)

简记为 A ( 1 ) x = b ( 1 ) A^{(1)}x=b^{(1)} A(1)x=b(1),其中 A ( 1 ) = A , b ( 1 ) = b A^{(1)}=A,\quad b^{(1)}=b A(1)=A,b(1)=b

a 11 ( 1 ) ≠ 0 a_{11}^{(1)}\neq0 a11(1)=0,令 l i 1 = a i 1 ( 1 ) a 11 ( 1 ) l_{i1}=\dfrac{a_{i1}^{(1)}}{a_{11}^{(1)}} li1=a11(1)ai1(1)

− l i 1 -l_{i1} li1乘第 1 1 1行加到第 i i i ( i = 2 , 3 , ⋯ , n ) (i=2,3,\cdots,n) (i=2,3,,n)并保留第 1 1 1个方程。

此时 A ( 1 ) → A ( 2 ) , b ( 1 ) → b ( 2 ) A^{(1)}\rightarrow A^{(2)},b^{(1)}\rightarrow b^{(2)} A(1)A(2),b(1)b(2)
a i j ( 2 ) = a i j ( 1 ) − l i 1 a 1 j ( 1 ) ( i , j = 2 , 3 , ⋯ , n ) b i ( 2 ) = b i ( 1 ) − l i 1 b 1 ( 1 ) ( i = 2 , 3 , ⋯ , n ) a_{ij}^{(2)}=a_{ij}^{(1)}-l_{i1}a_{1j}^{(1)}(i,j=2,3,\cdots,n)\\ \ \\ b_{i}^{(2)}=b_{i}^{(1)}-l_{i1}b_{1}^{(1)}(i=2,3,\cdots,n) aij(2)=aij(1)li1a1j(1)(i,j=2,3,,n) bi(2)=bi(1)li1b1(1)(i=2,3,,n)

a k k ( k ) ≠ 0 a_{kk}^{(k)}\neq0 akk(k)=0,令 l i k = a i k ( k ) a k k ( k ) l_{ik}=\dfrac{a_{ik}^{(k)}}{a_{kk}^{(k)}} lik=akk(k)aik(k)
− l i k -l_{ik} lik乘第 k k k行加到第 i i i ( i = k + 1 , k + 2 , ⋯ , n ) (i=k+1,k+2,\cdots,n) (i=k+1,k+2,,n)
a i j ( k + 1 ) = a i j ( k ) − l i k a k j ( k ) ( i , j = k + 1 , k + 2 , ⋯ , n ) a_{ij}^{(k+1)}=a_{ij}^{(k)}-l_{ik}a_{kj}^{(k)}(i,j=k+1,k+2,\cdots,n) aij(k+1)=aij(k)likakj(k)(i,j=k+1,k+2,,n) b i ( k + 1 ) = b i ( k ) − l i k b k ( k ) ( i = k + 1 , k + 2 , ⋯ , n ) b_{i}^{(k+1)}=b_{i}^{(k)}-l_{ik}b_{k}^{(k)}(i=k+1,k+2,\cdots,n) bi(k+1)=bi(k)likbk(k)(i=k+1,k+2,,n)
在这里插入图片描述

缺点

a k k ( k ) ≠ 0 a_{kk}^{(k)}\neq0 akk(k)=0 若为0,不能使用

∣ a k k ( k ) ∣ ≈ 0 \left|a_{kk}^{(k)}\right|\approx0 akk(k) 0 或相对其他元素较小时,舍入误差增加,可能导致误差剧增

进行每一步消元前,先找到列中最大元素所在的那一行,并与原来的行交换位置

2. 列主元

进行每一步消元前,先找到列中最大元素所在的那一行,并与原来的行交换位置

3. 全主元

进行每一步消元前,先找到剩余矩阵中最大的元素,做对应的行交换与列交换,
由于进行了列交换,最后要把 X X X的位置对应回去

三、北太天元源代码

耿直版

function [X,Ae,be] = gsem_base(A,b)
% Gauss消去法耿直版
% A : 系数矩阵
% b : 右端常数 列向量
% X : 求得的解向量
% Ae: 得到的上三角矩阵
% be: 对应的右端项
% 使用要求,A1(k,k)在计算过程中不出现0
% 缺点:当A1(k,k)较小或近似于0时,计算误差可能增大很多
%
%   Version:            1.0
%   last modified:      09/09/2023
A1 = [A,b];%  A和b的增广矩阵
n = length(A);
n1 = length(A1);
% 系数矩阵 化为上三角的过程如下
t = 0;
for i = 1:n-1if A1(i,i) != 0% 对每一行进行操作for k = i+1:1:nlik = A1(k,i)/A1(i,i);    % 算子A1(k,i:n1) = A1(k,i:n1)-lik*A1(i,i:n1);
%            T=A1 % 显示运算步骤endelset = 1;fprintf('出现零元素,不能使用该函数');break;end
end
% 得到上三角后 进行回代
if t == 0
Ae = A1(:,1:n);
be = A1(:,n1);
X  = reg_utm(Ae,be);
end
end

保存为 gsem_base.m文件

列主元

function [X,Ae,be] = gsem_column(A,b)
% 列主元消去法
% A : 表示系数矩阵
% b : 表示右端常数 [列向量]
% X : 求得的解向量
% Ae: 得到的上三角矩阵
% be: 对应的右端项
% 避免了Gauss消去法中出现0的情况
%
%   Version:            1.0
%   last modified:      09/09/2023
A1 = [A,b];%  A和b的增广矩阵
n = length(A);
n1 = length(A1);
% 系数矩阵 化为上三角的过程如下
for i = 1:n-1%[a,s]= max(A1(i:n,i))[~,s]= max(A1(i:n,i)); % s表示对应的位置,由于a用不到,用~替代s = s+i-1; % 由于s是相A对位置,故有此步A1([i,s],:) = A1([s,i],:); % 对应行交换位置% 对每一行进行操作for k = i+1:1:nlik = A1(k,i)/A1(i,i);    % 算子A1(k,i:n1) = A1(k,i:n1)-lik*A1(i,i:n1);
%        T=A1 % 显示运算步骤end
end
% 得到上三角后 进行回代
Ae = A1(:,1:n);
be = A1(:,n1);
X = reg_utm(Ae,be);
end

保存为 gsem_column.m文件

全主元

写全主元时,
注意,进行列的交换后, 对应解的位置发生了互换,最后要换回来.

function [X,Ae,be] = gsem_complete(A,b)
% 全主元消去法
% A : 系数矩阵
% b : 右端常数 [列向量]
% X : 求得的解向量
% Ae: 得到的上三角矩阵
% be: 对应的右端项
% 比列主元更加稳定了
%
%   Version:            1.0
%   last modified:      09/09/2023
A1 = [A,b];    %A和b的增广矩阵
n = length(A);
n1 = length(A1);
X = zeros(n,1);
t = 1:n; % t 用于修正解的位置与原方程不匹配
% 系数矩阵化为上三角的过程如下
for i = 1:n-1A = A1(i:n,i:n);[m,a,b] = max_loc(A); %这里不用A1,避免误判b中元素% a,b是相对的位置a = a+i-1;b = b+i-1;A1([i,a],:) = A1([a,i],:); % 对应行交换位置A1(:,[i,b]) = A1(:,[b,i]); % 对应列交换位置[t(i),t(b)]= deal(t(b),t(i));% 对每一行进行操作for k = i+1:1:nlik = A1(k,i)/A1(i,i);    % 算子A1(k,i:n1) = A1(k,i:n1)-lik*A1(i,i:n1);
%        T=A1 % 显示运算步骤end
end
% 得到上三角后进行回代
Ae = A1(:,1:n);
be = A1(:,n1);
X([t])= reg_utm(Ae,be); %使解匹配原方程位置
end

保存为gsem_complete.m文件
其中用到了我写的 max_loc.m

function [m,a,b] =max_loc(A)
% 获取矩阵中最大元素的位置
% m:矩阵中最大元素的值
% [a,b] 最大值在矩阵中的位置
%
%   Version:            1.0
%   last modified:      05/16/2023[r,l] = size(A);if r == 1    % 行向量a = 1;[m,b] = max(A);elseif l == 1    % 列向量b = 1;[m,a] = max(A);else[M,I] = max(A);[m,b] = max(M); % b = 最大元素所在的列a = I(b); % a = 最大元素所在的行end
end

保存为max_loc.m文件

四、简单测试一下

% 线性方程组的例子
%   last modified:      09/09/2023
clc;clear all;
%%
A = [10 1 2 3 4; 1 9 -1 2 -3; 2 -1 7 3 -5; 3 2 3 12 -1; 4 2 3 4 15];
b = [12; -27; 14; -17; 10];X2 = gsem_column(A,b)
X1 = gsem_base(A,b)
X3 = gsem_complete(A,b)

文中三个函数都用到了解上三角的回代算法,
参考之前写的:解上三角、回代算法|北太天元

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

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

相关文章

win11家庭中文版安装docker遇到Hyper-V启用失败,如何解决??

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

为什么要注册缅甸公司

缅甸作为东南亚新兴市场之一,吸引了越来越多的外国投资者前来开展业务。注册一家公司是在缅甸开展商业活动的第一步。以下是关于在缅甸注册公司的公司类型、注册要求以及注册优势的详细介绍。 在缅甸注册的外国公司主要有以下几种类型: 1、有限责任公司…

树状数组训练:差分应用,维护输出区间最值

差分应用 题目链接 #include<bits/stdc.h>using namespace std;int n, m; const int M 5e5 9; int tree[M];void update(int x, int y) {for (int pos x;pos < n;pos pos & (-pos))tree[pos] y; }int ask(int x) {int ans 0;for (int pos x;pos;pos - po…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…

3. 无重复字符的最长子串/438. 找到字符串中所有字母异位词/560. 和为 K 的子数组

3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 思路&#xff1a;想象一下我们…

90天精通Psim仿真--经典实战教程--第10天 Simcode DSP28335 LED控制

PSIM (Power Simulation) 是一款电力电子和电机控制仿真软件,而DSP28335是德州仪器(TI)的一款数字信号处理器(DSP)。如果你想要在PSIM的SimCoder环境中为DSP28335生成LED闪烁的代码,遵循以下步骤: 打开PSIM并创建模型: 首先,在PSIM中创建一个电路模型,该模型应包括DS…

贪心(贪婪)算法

主要思想 贪心算法的思想主要可以概括为“总是做出当前看起来最优的选择”&#xff0c;也就是不从整体上进行考虑&#xff0c;所得到的答案是某种意义上的局部最优解&#xff0c;不一定是整体最优解。 贪心算法没有固定算法框架&#xff0c;算法设计的关键是贪心策略的选择。…

【回溯】Leetcode 22. 括号生成【中等】

括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 解题思路 1、使用回溯…

AI原生时代,操作系统为何是创新之源?

一直以来&#xff0c;操作系统都是软件行业皇冠上的明珠。 从上世纪40、50年代&#xff0c;汇编语言和汇编器实现软件管理硬件&#xff0c;操作系统的雏形出现&#xff1b;到60年代&#xff0c;高级编程语言和编译器诞生&#xff0c;开发者通过操作系统用更接近人的表达方式去…

Vue 组件通信的几种方式

vue通信方式简介 在Vue.js中&#xff0c;组件间通信可以通过props、$emit、事件总线、Vuex以及Provide/Inject等方式来实现&#xff0c;总的来说&#xff0c;组件通信是现代前端开发中不可或缺的一部分&#xff0c;它可以帮助开发者构建更加模块化、可维护和可扩展的应用。 Pr…

2024年4月18号技术面试总结

1.什么是微服务雪崩?微服务雪崩的解决方案? 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。服务A依赖于服务B,服务A依赖于服务D。现在假设,服务D出现了故障! 它访问这个服务D就必然要等待服务D的结果,那因为服务D出现了故障,那必然不…

String str=“hello“与String str = new String(“hello“)的区别

常量池&#xff08;constant pool&#xff09;指的是在编译期被确定&#xff0c;并被保存在以编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量&#xff0c;也包括字符串常量。 实际上 String str new String("hellow");创建了两个对象&#xf…

Java语言中字符串处理最常见的操作以及注意事项

0. 前言 由于最近线上连续出现跟字符串处理相关的故障&#xff0c;实属不应该。也从这些故障中看到大家对常见的字符串处理API有一些淡忘&#xff0c;希望通过收集整体并总结常见的处理方法&#xff0c;大家温故而知新。 1. 创建和初始化&#xff1a; a. 使用双引号直接创建…

方程豹春季品牌发布会:全家族矩阵献礼比亚迪

春意盎然的四月&#xff0c;深圳也迎来了中国新能源汽车领域的一场盛事。 4月16日&#xff0c;作为比亚迪旗下全球首个专业个性化汽车品牌&#xff0c;方程豹在深圳隆重举办春季发布会。 在这场以“方华”为主题的发布会上&#xff0c;方程豹汽车全家族矩阵首次集体亮相&#x…

【数据结构】单链表经典算法题的巧妙解题思路

目录 题目 1.移除链表元素 2.反转链表 3.链表的中间节点 4.合并两个有序链表 5.环形链表的约瑟夫问题 解析 题目1&#xff1a;创建新链表 题目2&#xff1a;巧用三个指针 题目3&#xff1a;快慢指针 题目4&#xff1a;哨兵位节点 题目5&#xff1a;环形链表 介绍完了…

美化博客文章(持续更新)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;游戏实现&#xff1a;贪吃蛇​​​​​​ &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 该文提供我的一些文章设计的一些方法 目录 1.应用超链接 1.应用超链接

IIL IIH

IIH test_no;DATALOG_MSG;TEST_NO(test_no);RELAY_ON PDCL资源FORCE_V_MLDPS给VCC上电5.5vPIN_MODE位leakage_PINS管脚组接地LEVELS(Vcc5d5_lvl,2mS); PIN_INC(leakage_PINS, LOOP_BY_PIN) { RELAY_OFF PDCL资源 RELAY_ON PPMU资源 FORCE_V_PPMU上电5.5v&#xff0c;电流量…

mysql in查询优化

都说in查询比较慢&#xff0c;要改成子查询模式&#xff0c;ChatGPT大模型告诉了我&#xff0c;SQL中替换In查询的10种方法&#xff0c;太赞了&#xff0c;按照这个说的集中方法&#xff0c;验证一下。因为实际项目中确实存在in很多的情况。 查询执行的先后顺序对优化有必要&am…

【EI会议征稿】2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)

2024 International Conference on Advanced Mechatronic, Electrical Engineering and Automation ●会议简介 2024年先进机械电子、电气工程与自动化国际学术会议&#xff08;ICAMEEA 2024&#xff09;将汇聚全球机械电子、电气工程与自动化领域的专家学者&#xff0c;共同…

【软考】敏捷方法

目录 一、概念二、敏捷方法2.1 极限编程(XP)2.2 水晶法(Crystal)2.2.1 说明2.2.1 特征 2.3 并列争球法(Scrum)2.4 自适应软件开发(ASD)2.5 敏捷统一过程(AUP)2.5.1 说明2.5.2 执行的活动 一、概念 1.Agile Development。 2.敏捷开发的总体目标是通过“尽可能早地、持续地对有价…