Symbolics Toolbox(符号计算工具箱)是MATLAB的一个扩展工具箱,用于进行符号计算和代数运算。它提供了一系列函数和工具,可以处理符号表达式、求解方程、进行代数简化、计算符号导数和积分等任务。
Symbolics Toolbox(符号计算工具箱)是将数学应用于科学和工程的一套有用工具。本书的其他部分已经给出了使用符号功能进行应用的示例,以检查文献中找到的解析解。此外,基于解析解的预测与基于计算方法的预测进行了比较。本章介绍的符号数学工具包括:
使用Symbolics Toolbox,MATLAB可以被视为21世纪学生的"数学手册"。在过去,科学和工程学生需要购买一本"标准"数学手册。如今,很少有学生拥有并使用数学手册。计算机和像MATLAB这样的工具以积极的方式改变了这种情况。然而,对于本书的第二作者来说,证明MATLAB是这个世纪的手册是一次有趣的实践。本章介绍了符号计算工具的应用,以手册信息的回顾为基础,并提供了我们曾经期望在手册中查找的信息类型的示例,因此我们可以通过应用MATLAB等计算机工具来找到这些信息。
在应用符号工具箱或其他允许用户进行符号分析的计算机工具时,主要问题(如果这算是个问题的话)是,为了有效地使用工具,你需要对提出的数学问题有一定的了解。换句话说,如果你想对函数关于变量 进行求导,你需要知道函数和求导的含义,即找到 关于 的导数 的含义。
另一个例子是求解二次方程的解。你需要知道这是什么类型的方程以及解代数方程的含义。因此,如果你知道要问什么,MATLAB的符号计算工具就可以帮助你找到符号数学问题的答案。
本章讨论了将符号计算应用于可以通过数学手册解答的数学问题,以展示MATLAB中可用的符号工具的强大功能。当然,这些工具要比本章提供的相对简单的示例更强大。一旦你熟练掌握了这个工具箱,你就可以扩展工具箱的应用范围,研究更困难的问题,甚至可能超出传统应用数学解决科学和工程问题的能力。
典型手册中涵盖的符号数学主题包括代数、三角学、微积分、积分、求导和微分方程等。手册提供的信息旨在帮助学生、工程师或科学家在解决技术问题的过程中,在解决数学问题时取得进展。在科学、技术、工程和数学(STEM)的坚实教育背景下,才能有效地利用手册和/或像MATLAB这样的工具。当然,MATLAB和手册都需要定期使用,以熟练掌握应用这些工具来寻找解决方案的能力。我们将涉及手册中涵盖的一些主题,帮助指导读者在尝试使用MATLAB中的符号计算工具箱时获得帮助。我们将从代数开始,包括线性代数、向量代数和矩阵代数。然后,我们将研究求导和积分。接下来,我们将研究积分变换,特别是拉普拉斯变换。最后,我们将探讨微分方程的符号解法。
17.1 代数
17.1.1 多项式
17.1.2 向量
17.1.3 矩阵
在1.1.6节中,我们介绍了如何解决线性方程组的方法。其中一个示例应用了MATLAB Symbolics中的solve工具。让我们通过求解二次方程组 来扩展该示例。应用1.1.6节中所示的相同过程,在命令窗口中输入并执行以下命令,我们得到了以下结果。结果也在下面进行了说明:
>> syms x y
>> [x y] = solve(x^2 + 3*y, y^2 + 2*x)
x =
0
-(-12)^(2/3)/2
-((3^(1/2)*(-12)^(1/3)*i)/2 + (-12)^(1/3)/2)^2/2
-((3^(1/2)*(-12)^(1/3)*i)/2 - (-12)^(1/3)/2)^2/2
y =
0
(-12)^(1/3)
- (3^(1/2)*(-12)^(1/3)*i)/2 - (-12)^(1/3)/2
(3^(1/2)*(-12)^(1/3)*i)/2 - (-12)^(1/3)/2
结果表明, 和 各有四个根。其中两个是实根,两个是复根。这表明MATLAB处理复数而不仅仅是实数。这是MATLAB的另一个重要功能。在MATLAB中,默认情况下(除非重新赋值),i
和j
表示 这个数的符号。
大多数理工科学生可以背诵二次方程的根,这对于用MATLAB进行结果检查非常有帮助。二次方程可以写成如下形式:我们可以使用MATLAB中的solve
函数来解这个方程。可以执行以下脚本来实现:
clear;clc
syms a b c x
solve(a*x^2 + b*x + c)
在命令窗口中的答案为:
ans =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
因此,正如预期的那样,二次方程的解为:
对于两个解都是实数的情况,需要满足 。如果等号成立,那么两个根是相等的。如果 ,那么根是复数且不相等的。还可以使用另一种一行命令来解决这个方程,可以在命令窗口中这样写:
syms a b c x; solve(a*x^2+b*x+c)
solve
函数的输出是一个2×1
的符号数据类型数组。因为这是一个二次方程,所以我们期望得到两个解。
接下来,让我们来看看三次多项式:
为了找到这个方程的根,我们可以执行以下脚本:
clear; clc
syms a b c d x
solve(a*x^3 + b*x^2 + c*x + d)
在这种情况下,由于我们要解决一个三次方程,答案(ans)是一个3×1
的符号数据类型数组。答案可能会非常冗长,因此在这里不再重复,它会在命令窗口中显示出来。
让我们考虑另一个例子。我们来解下面的方程:
在命令窗口中执行了以下命令:
syms a c x; solve(a*x^4 + c*x);
solution = simplify(ans);
solution
得到的解为:
solution =
0
(-c/a)^(1/3)
((3^(1/2)*i - 1)*(-c/a)^(1/3))/2
-((3^(1/2)*i + 1)*(-c/a)^(1/3))/2
接下来使用Latex格式化这个解:
latex(solution)
得到的Latex表示为:
\left(\begin{array}{c} 0\\ {\left(-\frac{c}{a}\right)}^{\frac{1}{3}}\\
\frac{\left( - 1 + \sqrt{3}\, \mathrm{i}\right)\,
{\left(-\frac{c}{a}\right)}^{\frac{1}{3}}}{2}\\
-\frac{\left(1 + \sqrt{3}\, \mathrm{i}\right)\,
{\left(-\frac{c}{a}\right)}^{\frac{1}{3}}}{2} \end{array}\right)
该文字处理软件支持Latex语法。这个转换为Latex格式的表示给出了这个四次方程的四个根的数组。
需要注意的是,其中两个根是复数。
最后,让我们使用solve函数来解三个线性方程的联立方程组。我们来解如下方程组:
在命令窗口中执行以下命令,得到:
syms x y z
[x, y, z] = solve(x + y + z - 1, 2*x + 3*y + z - 1, x + y + 3*z)
x =
3
y =
-3/2
z =
-1/2
这个方程组的解是 , , 。 需要注意的是,在符号计算中有多种实现solve函数(或解决方案工具)的方法。如果得到的是数值解(如上述的例子),则需要将其转换为double类型的数据,以便在MATLAB脚本中使用(这在1.1.6节中已经有所示范)。
单行或单列的数组是向量。让我们考虑以下3分量向量:,
有两种常见的方法可以对这些数学对象进行乘法运算,大多数学生都熟悉这两种方法。它们是内积(点积)和外积(叉积)。可以通过以下符号命令(来自编辑器)来计算它们:
format compact
syms a1 a2 b1 b2 c1 c2 real
%声明了一些符号变量 并指定它们为实数。这样做是为了告诉计算机这些变量具有实数属性
x1 = [a1, b1, c1]
x2 = [a2, b2, c2]
x1_dot_x2 = dot(x1, x2)
x1_cross_x2 = cross(x1, x2)
format
在命令窗口中的结果如下所示:
x1 =
[ a1, b1, c1]
x2 =
[ a2, b2, c2]
x1_dot_x2 =
a1*a2 + b1*b2 + c1*c2
x1_cross_x2 =
[ b1*c2 - b2*c1, a2*c1 - a1*c2, a1*b2 - a2*b1]
使用format compact
命令可以得到上面紧凑的输出结果。而最后一个命令format
用于恢复命令窗口的默认输出格式。将结果写成如下形式:
内积是一个标量。
外积是一个向量。它是一个三分量向量(与用于相乘的向量具有相同的分量数)。
让我们考虑以下被称为矩阵的数学对象。我们可以把这两个物体加减。我们可以把这两个物体乘除。我们将使用符号工具箱来完成这些操作
在MATLAB中执行以下脚本:
format compact
syms a11 a12 a21 a22 b11 b12 b21 b22
Ma = [a11 a12; a21 a22]
Mb = [b11 b12; b21 b22]
Msum = Ma + Mb
Mproduct = Ma*Mb
命令窗口中的结果如下:
Ma =
[ a11, a12]
[ a21, a22]
Mb =
[ b11, b12]
[ b21, b22]
Msum =
[ a11 + b11, a12 + b12]
[ a21 + b21, a22 + b22]
Mproduct =
[ a11*b11 + a12*b21, a11*b12 + a12*b22]
[ a21*b11 + a22*b21, a21*b12 + a22*b22]
这两个矩阵的加法涉及逐项加法。
乘积得到的矩阵与相乘的矩阵大小相同;结果中的每一项都是一行Ma乘以Mb上的一列之和。学习乘法矩阵,如下所示,验证矩阵乘法的过程。这两个矩阵的乘积是:
让我们分析一下下面这个矩阵的一些性质:
syms c11 c12 c21 c22 real
Mc = [c11 c12; c21 c22]
Mcdet = det(Mc);
Mcinv = inv(Mc);
Mc*inv(Mc);
disp(’ Mc * Mcinv = Imatrix’)
Imatrix = simple(ans)
Mcdet
Mcinv
[EigenVectorsMc EigenValuesMc] = eig(Mc)
除了特征向量和特征值,下面的输出在命令窗口。后者被转换为Latex,报告如下。
Mc =
[ c11, c12]
[ c21, c22]
Mc * Mcinv = Imatrix
Imatrix =
[ 1, 0]
[ 0, 1]
Mcdet =
c11*c22 - c12*c21
Mcinv =
[ c22/(c11*c22 - c12*c21), -c12/(c11*c22 - c12*c21)]
[ -c21/(c11*c22 - c12*c21), c11/(c11*c22 - c12*c21)]
与这个矩阵相关的特征值是:
接下来让我们考虑3 × 3对称矩阵的分析,即,
通过实现以下脚本详细检查了这个矩阵。它是一个重要的数学对象,在结构力学中扮演着重要的角色,在结构力学中它是应力张量的形式。
format compact
syms a b c d e f real
M = [a d e
dbf
e f c]
Mdet = det(M);
Minv = inv(M);
M*inv(M);
disp(’ M * Minv = Imatrix’)
Imatrix = simple(ans)
Mdet
Minv
[EigenVectorsM EigenValuesM] = eig(M)
format
在命令窗口的结果,除了相当长的特征值,特征向量和逆表达式如下:
M =
[ a, d, e]
[ d, b, f]
[ e, f, c]
M * Minv = Imatrix
Imatrix =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
Mdet =
- c*d^2 + 2*d*e*f-b*e^2 - a*f^2 + a*b*c
我们知道矩阵M的逆可以正确确定,因为,其中 是单位矩阵。
使用MATLAB的符号工具解决该对称矩阵的特征值问题可以通过以下代码获得结果:
[EigenVectors_M, EigenValues_M] = eig(M);
其中,EigenVectors_M
是一个矩阵,包含了对应于特征值的特征向量的列向量,而EigenValues_M
是一个对角矩阵,包含了特征值。你可以通过查看这两个变量来获取特征值和对应的特征向量的结果。
如果矩阵表示固体材料中某一点的应力状态,则特征值为主应力,特征向量为主方向。这一信息在分析材料强度时很重要。类似的矩阵也出现在流体力学的建模中。
联系客服