matlab使用教程(6)—线性方程组的求解

        进行科学计算时,最重要的一个问题是对联立线性方程组求解。在矩阵表示法中,常见问题采用以下形式:给定两个矩阵 A 和 b,是否存在一个唯一矩阵 x 使 Ax = b 或 xA = b?
        考虑一维示例具有指导意义。例如,方程
        7x = 21
        是否具有唯一解?
        答案当然是肯定的。方程有唯一解 x = 3。通过除法很容易求得该解:
        x = 21/7 = 3。
        该解通常不是通过计算 7 的倒数求得的,即先计算 7 –1 = 0.142857...,然后将 7 –1 乘以 21。这将需要更多的工作,而且如果 7 –1 以有限位数表示时,准确性会较低。类似注意事项也适用于多个未知数的线性方程组;MATLAB 在解此类方程时不会计算矩阵的逆。
        尽管这不是标准的数学表示法,但 MATLAB 使用标量示例中常见的除法术语来描述常规联立方程组的解。斜杠 / 和反斜杠 \ 这两个除号分别对应 MATLAB 函数 mrdivide mldivide。两种运算符分别用于未知矩阵出现在系数矩阵左侧或右侧的情况:
x = b/A
        表示使用 mrdivide 获得的矩阵方程 xA = b 的解。
x = A\b
        表示使用 mldivide 获得的矩阵方程 Ax = b 的解。
        考虑将方程 Ax = b 或 xA = b 的两端“除以”A。系数矩阵 A 始终位于“分母”中。
        x = A\b 的维度兼容性条件要求两个矩阵 A b 的行数相同。这样,解 x 的列数便与 b 的列数相同,并且其行维度等于 A 的列维度。对于 x = b/A ,行和列的角色将会互换。
        实际上,Ax=b 形式的线性方程组比 xA=b 形式的线性方程组更常见。因此,反斜杠的使用频率要远高于斜杠的使用频率。本节其余部分将重点介绍反斜杠运算符;斜杠运算符的对应属性可以从以下恒等式推知:
(b/A)' = (A'\b').
        系数矩阵 A 不需要是方阵。如果 A 的大小为 m×n,则有三种情况:
        m = n
        方阵方程组。求精确解。
        m > n
        超定方程组,即方程个数多于未知数个数。求最小二乘解。
        m < n
        欠定方程组,即方程个数少于未知数个数。使用最多 m 个非零分量求基本解。

1mldivide 算法

        mldivide 运算符使用不同的求解器来处理不同类型的系数矩阵。通过检查系数矩阵自动诊断各种情况。
        线性方程组 Ax = b 的通解描述了所有可能的解。可以通过以下方法求通解:
        1求对应的齐次方程组 Ax = 0 的解。使用 null 命令通过键入 null(A) 来执行此操作。这会将解空间的基向量恢复为 Ax = 0。任何解都是基向量的线性组合。
        2求非齐次方程组 Ax = b 的特定解。然后,可将 Ax = b 的任何解写成第 2 步中的 Ax = b 的特定解加上第 1 步中的基向量的线性组合之和。本节其余部分将介绍如何使用 MATLAB 求 Ax = b 的特定解,如第 2 步中所述。

2方阵方程组

        最常见的情况涉及到一个方阵系数矩阵 A 和一个右侧单列向量 b

2.1非奇异系数矩阵

        如果矩阵 A 是非奇异矩阵,则解 x = A\b 的大小与 b 的大小相同。例如:
A = pascal(3);
u = [3; 1; 4];
x = A\u
x =
10
-12
5
        可以确认 A*x 恰好等于 u。如果 A b 为方阵并且大小相同,则 x= A\b 也具有相同大小:
b = magic(3);
X = A\b
X =
19 -3 -1
-17 4 13
6 0 -6
        可以确认 A*x 恰好等于 b。以上两个示例具有确切的整数解。这是因为系数矩阵选为 pascal(3) ,这是满秩矩阵(非奇异的)。

2.2奇异系数矩阵

        如果方阵 A 不包含线性无关的列,则该矩阵为奇异矩阵。如果 A 为奇异矩阵,则 Ax = b 的解将不存在或不唯一。如果 A 接近奇异或检测到完全奇异性,则反斜杠运算符 A\b 会发出警告。如果 A 为奇异矩阵并且 Ax = b 具有解,可以通过键入以下内容求不是唯一的特定解
P = pinv(A)*b
        pinv(A) 是 A 的伪逆。如果 Ax = b 没有精确解,则 pinv(A) 将返回最小二乘解。例如:
A = [ 1 3 7 ; -1 4 4 ; 1 10 18 ] 为奇异矩阵,可以通过键入以下内容进行验证:
rank(A)
ans =
2
        由于 A 不是满秩,它有一些等于零的奇异值。对于 b =[5;2;12] ,方程 Ax = b 具有精确解:
pinv(A)*b
ans =
0.3850
-0.1103
0.7066
        通过键入以下内容验证 pinv(A)*b 是否为精确解
A*pinv(A)*b
ans =
5.0000
2.0000
12.0000
        但是,如果 b = [3;6;0] ,则 Ax = b 没有精确解。在这种情况下, pinv(A)*b 会返回最小二
乘解。键入
A*pinv(A)*b
ans =
-1.0000
4.0000
2.0000
        则不会返回原始向量 b。通过得到增广矩阵 [A b] 的简化行阶梯形式,可以确定 Ax = b 是否具有精确解。为此,对于此示例请输入
rref([A b])
ans =
1.0000 0 2.2857 0
0 1.0000 1.5714 0
0 0 0 1.0000
        由于最下面一行全部为零(最后一项除外),因此该方程无解。在这种情况下,pinv(A) 会返回最小二乘解。

3超定方程组

        此示例说明在对试验数据的各种曲线拟合中通常会如何遇到超定方程组。在多个不同的时间值 t 对数量 y 进行测量以生成以下观测值。可以使用以下语句输入数据并在表中查看该数据。
t = [0 .3 .8 1.1 1.6 2.3]';
y = [.82 .72 .63 .60 .55 .50]';
B = table(t,y)
B=6×2 table
t y
___ ____
0 0.82
0.3 0.72
0.8 0.63
1.1 0.6
1.6 0.55
2.3 0.5
        尝试使用指数衰减函数对数据进行建模
 
        上一方程表明,向量 y 应由两个其他向量的线性组合来逼近。一个是元素全部为 1 的常向量,另一个是带有分量 exp(-t) 的向量。未知系数 c 1 c 2 可以通过执行最小二乘拟合来计算,这样会最大限度地减小数据与模型偏差的平方和。在两个未知系数的情况下有六个方程,用 6×2 矩阵表示。
E = [ones(size(t)) exp(-t)]
E = 6×2
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1.0000 0.3329
1.0000 0.2019
1.0000 0.1003
        使用反斜杠运算符获取最小二乘解。
c = E\y
c = 2×1
0.4760
0.3413
        也就是说,对数据的最小二乘拟合为
 
        以下语句按固定间隔的 t 增量为模型求值,然后与原始数据一同绘制结果:
T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T,Y,'-',t,y,'o')

        E*c y 不完全相等,但差值可能远小于原始数据中的测量误差。如果矩形矩阵 A 没有线性无关的列,则该矩阵秩亏。如果 A 秩亏,则 AX = B 的最小二乘解不唯一。如果A 秩亏,则 A\B 会发出警告,并生成一个最小二乘解。您可以使用 lsqminnorm 求在所有解中具有最小范数的解 X

4欠定方程组

        本例演示了欠定方程组的解不唯一的情况。欠定线性方程组包含的未知数比方程多。MATLAB 矩阵左除运算求基本最小二乘解,对于 m × n 系数矩阵,它最多有 m 个非零分量。
以下是一个简单的随机示例:
R = [6 8 7 3; 3 5 4 1]
rng(0);
b = randi(8,2,1)
R =
6 8 7 3
3 5 4 1
b =
7
8
线性方程组 Rp = b 有两个方程,四个未知数。由于系数矩阵包含较小的整数,因此适合使用 format 命令以有理格式显示解。通过以下命令可获取特定解
format rat
p = R\b
p =
0
17/7
0
-29/7
        其中一个非零分量为 p(2) ,因为 R(:,2) 是具有最大范数的 R 的列。另一个非零分量为 p(4) ,因为 R(:,4) 在消除 R(:,2) 后起控制作用。欠定方程组的完全通解可以通过 p 加上任意零空间向量线性组合来表示,可以使用 null 函数(使用请求有理基的选项)计算该空间向量。
Z = null(R,'r')
Z =
-1/2 -7/6
-1/2 1/2
1 0
0 1
        可以确认 R*Z 为零,并且残差 R*x - b 远远小于任一向量 x(其中x = p + Z*q)  由于 Z 的列是零空间向量,因此 Z*q 是以下向量的线性组合:
        为了说明这一点,选择任意 q 并构造 x,计算残差的范数。
q = [-2; 1];
x = p + Z*q;
format short
norm(R*x - b)
ans =
2.6645e-15
        如果有无限多个解,则最小范数解具有特别意义。您可以使用 lsqminnorm 计算最小范数最小二乘解。该解具有 norm(p) 的最小可能值。
p = lsqminnorm(R,b)
p =
-207/137
365/137
79/137
-424/137

5多右端线性方程组的求解

        某些问题涉及求解具有相同系数矩阵 A 但具有不同右端 b 的线性方程组。如果可以同时使用不同的 b 值,则可以将 b 构造为多列矩阵,并使用单个反斜杠命令求解所有方程组: X = A\[b1 b2 b3 …]。但是,有时不同的 b 值并非全部同时可用,也就是说,您需要连续求解若干方程组。如果使用斜杠 (/) 或反斜杠 (\) 求解其中一个方程组,则该运算符会对系数矩阵 A 进行分解,并使用此矩阵分解来求解。然而,随后每次使用不同的 b 求解类似方程组时,运算符都会对 A 进行同样的分解,而这是一次冗余计算。此问题的求解是预先计算 A 的分解,然后重新使用因子对 b 的不同值求解。但是,实际上,以这种方式预先计算分解可能很困难,因为需要知道要计算的分解(LU、LDL、Cholesky 等)以及如何乘以因子才能对问题求解。例如,使用 LU 分解,您需要求解两个线性方程组才能求解原始方程组 Ax = b:
[L,U] = lu(A);
x = U \ (L \ b);
        对于具有若干连续右端的线性方程组,建议使用 decomposition 对象求解。借助这些对象,您可利用预先计算矩阵分解带来的性能优势,而不必了解如何使用矩阵因子。您可以将先前的 LU 分解替换为:
dA = decomposition(A,'lu');
x = dA\b;
        如果您不确定要使用哪种分解,decomposition(A) 会根据 A 的属性选择正确的类型,类似于反斜杠的功能。
        以下简单测试验证了此方法可能带来的性能优势。该测试分别使用反斜杠 (\) 和 decomposition 对同一稀疏线性方程组求解 100 次。
n = 1e3;
A = sprand(n,n,0.2) + speye(n);
b = ones(n,1);
% Backslash solution
tic
for k = 1:100
x = A\b;
end
toc
Elapsed time is 9.006156 seconds.
% decomposition solution
tic
dA = decomposition(A);
for k = 1:100
x = dA\b;
end
toc
Elapsed time is 0.374347 seconds.
        对于这个问题,decomposition 求解比单独使用反斜杠要快得多,而语法仍然很简单。

6迭代法

        如果系数矩阵 A 很大并且是稀疏矩阵,分解方法一般情况下将不会有效。迭代方法可生成一系列近似解。MATLAB 提供了多个迭代方法来处理大型的稀疏输入矩阵。

7多线程计算

        对于许多线性代数函数和按元素的数值函数,MATLAB 软件支持多线程计算。这些函数将自动在多个线程上执行。要使函数或表达式在多个 CPU 上更快地执行,必须满足许多条件:
1 函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况下执行。它们应需要很少的序列运算。
2数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。例如,仅当数组包含数千个或以上的元素时,大多数函数才会加速。
3运算未与内存绑定;处理时间不受内存访问时间控制。一般而言,复杂函数比简单函数速度更快。如果启用多线程, inv lscov linsolve mldivide 将会对大型双精度数组(约 10,000 个元素或更多)大幅增加速度。

 

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

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

相关文章

20.3 HTML 表格

1. table表格 table标签是HTML中用来创建表格的元素. table标签通常包含以下子标签: - th标签: 表示表格的表头单元格(table header), 用于描述列的标题. - tr标签: 表示表格的行(table row). - td标签: 表示表格的单元格(table data), 通常位于tr标签内, 用于放置单元格中的…

奥迪A3:最新款奥迪A3内饰设计及智能科技应用

奥迪A3一直以来都是奥迪的入门级车型&#xff0c;但这并不意味着它在科技和内饰方面会有所退步。最新款奥迪A3的内饰设计和智能科技应用让人们再次惊叹奥迪的创新能力。 内饰设计 奥迪A3最新款的内饰设计引入了奥迪最新的设计元素&#xff0c;比如8.8英寸的中控显示屏&#xf…

干货 ,ChatGPT 4.0插件Review Reader,秒杀一切选品神器

Hi! 大家好&#xff0c;我是专注于AI项目实战的赤辰&#xff0c;今天继续跟大家介绍另外一款GPT4.0插件Review Reader&#xff08;评论阅读器&#xff09;。 做电商领域的小伙伴们&#xff0c;都知道选品分析至关重要&#xff0c;可以说选品决定成败&#xff0c;它直接关系到产…

【深度学习】High-Resolution Image Synthesis with Latent Diffusion Models,论文

13 Apr 2022 论文&#xff1a;https://arxiv.org/abs/2112.10752 代码&#xff1a;https://github.com/CompVis/latent-diffusion 文章目录 PS基本概念运作原理 AbstractIntroductionRelated WorkMethodPerceptual Image CompressionLatent Diffusion Models Conditioning Mec…

申请软件著作权都有什么好处?

随着社会的发展&#xff0c;知识产权保护意识对于公司而言尤为重要&#xff0c;对自己的权利进行最大限度的保护&#xff0c;以防止被别有用心的人侵权。那么&#xff0c;申请软著的好处到底是什么?软著有什么用呢? 无形资产软著是一种无形的知识产权&#xff0c;是开发者智慧…

Spark-对RDD的理解

RDD是分布式弹性数据集。 RDD有五大特性&#xff1a; 一组分区&#xff0c;每个RDD都会被分为多个分区&#xff0c;这些分区运行在集群的不同节点上&#xff0c;分区数决定并行计算的数量。一个计算每个分区的函数&#xff0c;就是计算逻辑。RDD之间的依赖关系&#xff0c;就…

大数据技术之Clickhouse---入门篇---数据类型、表引擎

星光下的赶路人star的个人主页 今天没有开始的事&#xff0c;明天绝对不会完成 文章目录 1、数据类型1.1 整型1.2 浮点型1.3 布尔型1.4 Decimal型1.5 字符串1.6 枚举类型1.7 时间类型1.8 数组 2、表引擎2.1 表引擎的使用2.2 TinyLog2.3 Memory2.4 MergeTree2.4.1 Partition by分…

简单分享婚宴预订小程序怎么做

婚宴预订小程序需要具备一些功能&#xff0c;通过这些功能&#xff0c;新人可以更方便地选择婚宴场地、预订服务&#xff0c;并且更好地规划自己的婚礼。 1. 场地浏览与选择 婚宴预订小程序可以展示多个婚宴场地的照片和详细信息&#xff0c;包括容纳人数、场地设施、价格等。…

无涯教程-Lua - Arrays(数组)

数组是对象的有序排列&#xff0c;可以是包含行集合的一维数组&#xff0c;也可以是包含多行和多列的多维数组。 在Lua中&#xff0c;数组是使用带有整数的索引表实现的。数组的大小不是固定的&#xff0c;并且可以根据无涯教程的要求(取决于内存限制)来增长。 一维数组 一维…

8.1作业

文件IO函数实现拷贝文件。子进程先拷贝后半部分&#xff0c;父进程再拷贝前半部分&#xff0c;允许使用sleep函数 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpidfo…

指针初阶(1)

文章目录 目录1. 指针是什么2. 指针变量的类型2.1 指针变量-整数2.2 指针变量的解引用 3. 野指针3.1 野指针成因3.2 如何规避野指针 4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 附&#xff1a; 目录 指针是什么指针变量的类型野指针指针运算指针和数组二级指针…

面试总结(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

【Vue组件eval方法的使用】

Vue页面中条件可以放在当前vue页面中而无需影响到组件 如 这是我的表格操作列按钮&#xff0c;需求是第四个按钮如果表格当前数据的is_execl字段为0则显示否则隐藏 这种条件判断很频繁 如果像之前一样给一个标识&#xff0c;页面多了就难以维护&#xff0c;而且判断条件如果不…

【硬件设计】模拟电子基础一--元器件介绍

模拟电子基础一--元器件介绍 一、半导体&#xff08;了解&#xff09;1.1 基础知识1.2 PN结 二、二级管2.1 定义与特性2.2 二极管的分类 三、三级管四、MOS管三、其他元器件管3.1 电容3.2 光耦3.3 发声器件3.4 继电器3.5 瞬态电压抑制器 前言&#xff1a;本章为知识的简单复习&…

【Spring框架】SpringBoot创建和使用

目录 什么是SpringBoot&#xff1f;SpringBoot优点创建SpringBootSpringBoot使用 什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 SpringBoot优点 1.起步依赖(创建的时候就可以方…

Python爬虫遇到URL错误解决办法大全

在进行Python爬虫任务时&#xff0c;遇到URL错误是常见的问题之一。一个错误的URL链接可能导致爬虫无法访问所需的网页或资源。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决方法&#xff0c;并给出相关代码示例&#xff0c;希望对您的爬虫任务有所帮助。 一、…

玩转顺序表——【数据结构】

在C语言学习中&#xff0c;我们经常会遇见增删查改等一系列操作&#xff0c;而这些操作全都与线性表关联&#xff0c;没有线性表将会对这些操作完成的十分艰难&#xff01;那今天就让我们来了解一下顺序表如何增删查改&#xff01;&#xff01;&#xff01; 目录 1.线性表 2…

运算放大器(二):恒流源

一、实现原理 恒流源的输出电流能够在一定范围内保持稳定&#xff0c;不会随负载的变化而变化。 通过运放&#xff0c;将输入的电压信号转换成满足一定关系的电流信号&#xff0c;转换后的电流相当一个输出可调的简易恒流源。 二、电路结构 常用的恒流源电路如…

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…

【【STM32学习-3】】

STM32学习-3 下面是对c语言的稍微复习 这个是我们设置好的文件 以后拖出去用就可以了 这里加入关于指针的感想 关于指针数组和数组指针的想法 常规的东西是int a10; int * p&a; &#xff08;p指向了a元素&#xff0c;意思是p等于a的地址 类型是int*&#xff09;就是 整型指…