MWORKS.Syslab符号数学工具箱
版本 unknown · 30 节
第 1 页
第 2 页
第 3 页
第 4 页
第 5 页
第 6 页
第 7 页
第 8 页
第 9 页
第 10 页
第 11 页
第 12 页
第 13 页
第 14 页
第 15 页
第 16 页
第 17 页
第 18 页
第 19 页
第 20 页
第 21 页
第 22 页
4.1 符号数学常见函数——创建、查找与运算
在 MWORKS.Syslab 中,符号数学工具箱提供了处理符号表达式、方程和矩阵的核心能力。要有效使用这些功能,首先需要掌握符号对象的创建、查找以及基本运算。
创建符号对象
符号数学的基础是符号变量和符号表达式。使用 syms 函数可以创建符号变量:
# 创建单个符号变量
syms x
# 同时创建多个符号变量
syms a b c
创建符号变量后,就可以构建符号表达式:
# 定义符号表达式
expr = x^2 + 2*x + 1
syms函数会一次性声明符号变量,并允许后续直接使用这些变量进行数学运算,无需像数值计算那样预先赋值。
查找符号对象
在处理复杂表达式时,symvar 函数用于查找表达式中的符号变量:
# 查找表达式中的符号变量
vars = symvar(expr)
# 返回:x
symvar 返回一个包含所有符号变量的数组,按字母顺序排列。这在分析表达式结构或进行代换时非常有用。
符号运算
符号对象支持常见的数学运算,包括算术运算、函数计算和方程求解。
算术运算示例:
# 符号表达式运算
expr1 = (x + y)^2
expr2 = x^2 + 2*x*y + y^2
# 检查等价性
isequal(expand(expr1), expr2) # 返回 true
方程求解:
使用 solve 函数求解符号方程:
# 求解方程 x^2 - 4 = 0
sol = solve(x^2 - 4 == 0, x)
# 返回:[-2, 2]
MWORKS
上图展示了在 MWORKS.Syslab 中进行符号运算的典型工作流程:创建符号变量、构建表达式、执行运算并查看结果。
实用技巧
- 简化表达式:使用
simplify函数化简复杂表达式 - 展开运算:使用
expand展开乘积和幂次 - 因式分解:使用
factor进行因式分解
# 综合示例
syms x y
expr = (x + y)^3
# 展开
expand(expr) # 返回:x^3 + 3*x^2*y + 3*x*y^2 + y^3
# 因式分解
factor(x^2 - y^2) # 返回:(x - y)*(x + y)
通过掌握这些基础操作,用户能够高效地进行符号数学计算,为后续的微积分、线性代数和方程求解打下坚实基础。
4.2 符号数学常见函数-方程求解
符号方程求解是符号数学工具箱的核心功能之一,MWORKS.Syslab 提供了 solve 函数用于求解符号方程和方程组。该函数能够处理代数方程、多项式方程以及部分超越方程,返回符号解或数值解。
基础方程求解
solve 函数的基本语法为:
solve(eqn, var)
其中 eqn 是符号方程,var 是求解变量。若未指定求解变量,系统会自动选择符号变量进行求解。
示例:求解一元二次方程
using SymPy
x = symbols("x")
eq = x^2 - 3*x + 2
solutions = solve(eq, x)
执行后,solutions 将返回 [1, 2],即方程的两个根。
solve默认返回所有可能解(包括复数解),且解以数组形式呈现。对于高次多项式,可能返回符号表达式形式的根。
方程组求解
对于多变量方程组,solve 接受多个方程和变量的组合:
x, y = symbols("x y")
eq1 = x + y - 5
eq2 = x - y - 1
solutions = solve([eq1, eq2], [x, y])
返回结果为字典形式:Dict(x => 3, y => 2),可通过 solutions[x] 和 solutions[y] 分别获取每个变量的解。
带参数方程与条件解
当方程包含参数时,solve 会尝试用参数表示解:
a, b, c = symbols("a b c")
eq = a*x^2 + b*x + c
solutions = solve(eq, x)
此时解为带参数的符号表达式:[(-b + sqrt(b^2 - 4*a*c))/(2*a), (-b - sqrt(b^2 - 4*a*c))/(2*a)]。
数值求解与假设
对于无法获得解析解的方程,可配合 N 函数获取数值近似:
x = symbols("x")
eq = sin(x) - x/2
solutions = solve(eq, x)
approx_solutions = N.(solutions) # 转换为浮点数
若需指定求解域或假设,可在 symbols 中声明:
x = symbols("x", real=true)
MWORKS
上图展示了 solve 函数在 MWORKS.Syslab 中的典型调用界面与输出结果。
注意事项
- 方程定义:使用
==表示等式,而非赋值=。例如eq = x^2 == 4。 - 多解处理:
solve返回数组,可遍历或索引访问每个解。 - 符号化简:复杂解可结合
simplify函数进行化简。 - 无解情况:若方程无解,返回空数组
[]。
通过灵活使用 solve 函数,你可以高效地处理从简单线性方程到复杂非线性方程组的符号求解问题。
4.3 符号数学常见函数-公式处理和简化
在符号计算中,表达式往往以复杂的形式呈现,难以直接用于后续分析。MWORKS.Syslab 的符号数学工具箱提供了丰富的函数,用于对符号表达式进行化简、展开、因式分解等处理,使公式更简洁、更易于理解或进行数值计算。
常用公式处理函数
以下是几个核心的公式处理函数及其典型用法:
-
simplify:最通用的化简函数。它尝试应用多种数学恒等式(如三角恒等式、指数对数性质)将表达式简化为最简形式。using SymPy x = symbols("x") expr = sin(x)^2 + cos(x)^2 simplified_expr = simplify(expr) # 结果为 1 -
expand:用于展开多项式或因式乘积。例如,将(x+1)^2展开为x^2 + 2x + 1。expr2 = (x + 1)^2 expanded_expr = expand(expr2) # 结果为 x^2 + 2*x + 1 -
factor:expand的逆操作,用于将多项式分解为不可约因式的乘积。expr3 = x^2 - 1 factored_expr = factor(expr3) # 结果为 (x - 1)*(x + 1) -
collect:按指定变量或变量的幂次合并同类项。这在处理多变量表达式时尤为有用。y = symbols("y") expr4 = x*y + x - 2*y collected_expr = collect(expr4, x) # 按 x 合并:x*(y + 1) - 2*y
分式化简与有理函数处理
对于包含分式的表达式,工具箱提供了专门的处理函数:
apart:执行部分分式分解(Partial Fraction Decomposition),将一个复杂的有理函数拆分为多个简单分式的和。expr5 = 1/( (x+1)*(x+2) ) apart_expr = apart(expr5, x) # 结果为 -1/(x+2) + 1/(x+1)together:将多个分式合并为一个通分后的分式,是apart的逆操作。together_expr = together(apart_expr) # 恢复为 1/((x+1)*(x+2))
简化策略与注意事项
- 多次尝试:
simplify并非万能。有时expand后再simplify,或factor后再simplify能获得更好结果。建议根据表达式特点组合使用。 - 指定简化目标:对于含三角函数的表达式,可使用
simplify(expr, trig=true)强制优先使用三角恒等式。 - 数值替换:简化后的符号表达式可通过
N()或evalf()转换为高精度浮点数,便于工程应用。
提示:当处理包含多个变量的复杂表达式时,先用
collect按主变量合并,再配合factor或simplify,往往能获得清晰的结构。
下图展示了在 MWORKS.Syslab 的交互式环境中,对符号表达式进行 expand 和 factor 操作的典型界面:
MWORKS
通过灵活运用这些函数,你可以将混乱的符号公式整理成逻辑清晰、便于分析的数学形式,为后续的方程求解、微积分运算或代码生成打下坚实基础。
4.4 符号数学常见函数-微积分
在科学计算中,微积分是分析变化率和累积效应的核心工具。MWORKS.Syslab 的符号数学工具箱提供了丰富的符号微积分函数,能够对符号表达式进行精确的求导、积分和极限运算。本节将介绍最常用的符号微积分函数及其使用方法。
符号微分
符号微分用于求解函数对指定变量的导数。使用 diff 函数可以对符号表达式进行任意阶的求导操作。
using SymPy
@vars x
f = sin(x^2) * exp(x)
df = diff(f, x) # 一阶导数
diff函数的第一个参数是符号表达式,第二个参数指定求导变量。如果省略第二个参数,则自动对表达式中的自由变量求导。
对于高阶导数,可以在变量后添加阶数参数:
d2f = diff(f, x, 2) # 二阶导数
d3f = diff(f, x, 3) # 三阶导数
偏导数运算同样通过 diff 实现,只需指定对应的偏导变量:
@vars x y
g = x^2 * y + sin(x * y)
d2g_dxdy = diff(g, x, y) # 先对x求导,再对y求导
符号积分
符号积分分为不定积分和定积分两类。不定积分使用 integrate 函数,返回原函数族:
F = integrate(cos(2x), x) # 不定积分
定积分则需要指定积分区间:
def_int = integrate(exp(-x^2), (x, 0, Inf)) # 从0到无穷的定积分
对于复杂的积分问题,SymPy 引擎会自动尝试多种积分策略,包括分部积分、换元积分和特殊函数积分。如果无法找到解析解,会返回未计算的积分表达式。
极限运算
极限运算是微积分的基础,使用 limit 函数计算符号表达式在指定点的极限值:
L1 = limit(sin(x)/x, x, 0) # 趋于0的极限
L2 = limit(1/x, x, 0, dir="+") # 右极限
L3 = limit(1/x, x, 0, dir="-") # 左极限
dir 参数用于指定趋近方向,"+" 表示右极限,"-" 表示左极限。默认情况下,limit 会计算双侧极限。
级数展开
泰勒级数展开是函数逼近的重要方法,使用 series 函数实现:
s = series(exp(x), x, 0, 6) # 在x=0处展开到5阶
该命令返回 exp(x) 在 x=0 处的泰勒展开式,包含 x^0 到 x^5 的项,并带有大 O 余项。
MWORKS
掌握这些符号微积分函数后,可以高效地解决工程计算中的求导、积分、极限和级数展开问题,为后续的微分方程求解和优化计算奠定基础。
4.5 符号数学常见函数-线性代数
线性代数是科学计算的核心,MWORKS.Syslab 的符号数学工具箱提供了丰富的线性代数函数,支持对符号矩阵进行各种运算。这些函数与数值线性代数类似,但返回的是精确的符号结果。
符号矩阵的创建与基本运算
使用 sym 函数创建符号矩阵是最直接的方法。例如,创建一个 2x2 的符号矩阵 A:
A = sym([1 2; 3 4])
该命令将数值矩阵转换为符号矩阵,每个元素变为符号整数。符号矩阵支持所有标准线性代数运算,包括加法、减法、乘法、转置等。转置使用单引号 ',共轭转置使用 ' 或 '(对于实数矩阵两者相同)。
关键线性代数函数
符号线性代数函数的核心优势在于:返回精确的解析表达式,不涉及数值舍入误差,适合理论推导和公式验证。
以下是最常用的符号线性代数函数:
-
det(A):计算方阵A的行列式。对于符号矩阵,结果是一个符号表达式。例如det(sym([1 2; 3 4]))返回-2。 -
inv(A):计算方阵A的逆矩阵。返回的逆矩阵元素为有理数或符号表达式。对于奇异矩阵,会报错。 -
eig(A):计算方阵A的特征值和特征向量。默认返回特征值向量;若需同时获取特征向量,使用[V, D] = eig(A),其中V的列是特征向量,D是对角矩阵。 -
rank(A):计算矩阵A的秩。符号秩可能比数值秩更精确,因为它考虑了符号参数之间的代数关系。 -
null(A):计算矩阵A的零空间(核)的一组基。返回的列向量满足A * x = 0。
操作实例:求解线性方程组
符号线性代数的一个典型应用是求解含参数的线性方程组。假设需要求解方程组 A * x = b,其中 A 是符号矩阵,b 是符号向量:
A = sym([1 2; 3 4])
b = sym([5; 6])
x = A \ b # 或使用 inv(A) * b
\ 运算符(左除)内部调用符号求解器,返回精确解 x = [-4; 4.5](以分数形式显示)。
进阶操作:矩阵分解
符号矩阵支持多种分解,包括 LU 分解(lu)、QR 分解(qr)、奇异值分解(svd)等。这些分解返回符号表达式,便于分析矩阵的代数性质。
MWORKS
上图展示了 MWORKS.Syslab 中符号线性代数函数的调用界面,用户可以在命令窗口直接输入函数并查看符号结果。
4.6 符号数学常见函数-多项式、假设条件
在符号数学工具箱中,polynomialReduce 函数用于对多项式进行约化操作,而 assume 和 assumptions 函数则用于管理符号变量的假设条件,帮助简化表达式或限定求解范围。
多项式约化
polynomialReduce 函数可以将一个多项式表示为另一个多项式的线性组合加上一个余项。其语法为:
[r, q] = polynomialReduce(p, q, x)
其中 p 是被约化的多项式,q 是除数多项式,x 是主变量。输出 r 是余项,q 是商多项式。
例如,对多项式 p = x^4 + x^3 + x^2 + x + 1 与除数 q = x^2 + 1 进行约化:
using SymPy
x = symbols("x")
p = x^4 + x^3 + x^2 + x + 1
q = x^2 + 1
r, quotient = polynomialReduce(p, q, x)
执行后,quotient 的结果为 x^2 + x,r 的结果为 1。这意味着 x^4 + x^3 + x^2 + x + 1 = (x^2 + 1)*(x^2 + x) + 1。
多项式约化类似于整数除法中的带余除法,它能够将一个多项式分解为商和余项,便于进一步分析或简化。
符号变量的假设条件
assume 函数用于对符号变量施加假设条件,例如限定变量为实数、正整数或大于某个值。assumptions 函数用于查询当前符号变量已有的假设条件。
基本用法:
assume(x, "real") # 假设 x 为实数
assume(x > 0) # 假设 x 大于 0
assumptions(x) # 查询 x 的假设条件
假设条件会影响符号运算的结果。例如,当假设 x > 0 时,对 sqrt(x^2) 化简会得到 x 而非 abs(x)。
assume(x, "positive")
simplify(sqrt(x^2)) # 结果为 x,而非 abs(x)
要清除假设条件,可以使用 assume(x, "clear") 或重新定义符号变量。
合理使用假设条件可以避免符号运算中出现分支情况,使结果更简洁、更符合物理意义。
综合示例
以下示例展示了多项式约化与假设条件的结合使用:
x = symbols("x")
assume(x > 0)
p = x^3 + 2*x^2 - x - 2
q = x + 1
r, quotient = polynomialReduce(p, q, x)
该代码首先假设 x 为正数,然后对三次多项式进行约化。约化结果为 quotient = x^2 + x - 2,余项 r = 0,说明 x^3 + 2*x^2 - x - 2 能被 x + 1 整除。
MWORKS
上述操作在 MWORKS.Syslab 的命令行窗口或脚本中均可执行,结果可在输出区查看。
4.7 符号数学常见函数-图形
在进行符号计算时,将符号表达式可视化为图形,是理解函数行为、验证推导结果的重要手段。MWORKS.Syslab 的符号数学工具箱提供了与数值绘图无缝衔接的机制,能够将符号表达式直接转换为可绘制的图形。
符号表达式到图形的转换路径
符号数学工具箱本身并不直接提供独立的绘图函数,而是通过 matlabFunction 函数将符号表达式转换为可执行的匿名函数(即函数句柄),然后利用标准的数值绘图函数(如 plot、fplot、ezplot)进行可视化。
matlabFunction是连接符号世界与数值世界的桥梁,它将符号表达式编译为高效的 MATLAB 函数句柄,从而能够直接用于数值计算和绘图。
使用 fplot 直接绘制符号函数
最便捷的方式是使用 fplot 函数,它可以直接接受符号表达式作为输入,自动完成从符号到数值的转换和绘图。
# 定义符号变量
using SymPy
@syms x
# 定义符号表达式
f = sin(x) * exp(-x/2)
# 直接使用 fplot 绘制
fplot(f, [0, 10]) # 在 [0, 10] 区间内绘制
MWORKS
fplot 的优势在于:
- 无需手动转换:内部自动处理符号到数值的映射
- 自适应采样:根据函数曲率自动调整采样点密度,保证曲线光滑
- 支持区间指定:通过第二个参数明确绘图区间
通过 matlabFunction 转换后绘图
对于需要更精细控制或与其他数值数据结合的场景,可以先转换后绘图:
# 定义符号表达式
g = x^3 - 6*x^2 + 11*x - 6
# 转换为函数句柄
g_num = matlabFunction(g)
# 生成数值自变量
x_vals = 0:0.1:4
# 计算并绘图
y_vals = g_num.(x_vals)
plot(x_vals, y_vals, "b-", linewidth=2)
xlabel("x")
ylabel("g(x)")
title("三次函数图形")
grid(true)
多函数同图与图例
当需要在一个坐标系中对比多个符号函数时,可以结合 hold on 和 legend 实现:
@syms x
h1 = sin(x)
h2 = cos(x)
# 转换两个函数
h1_num = matlabFunction(h1)
h2_num = matlabFunction(h2)
x_vals = 0:0.01:2*pi
plot(x_vals, h1_num.(x_vals), "r-", label="sin(x)")
hold(true)
plot(x_vals, h2_num.(x_vals), "b--", label="cos(x)")
hold(false)
legend()
参数化曲线与三维图形
对于参数方程或三维符号函数,同样适用上述方法:
# 参数曲线
@syms t
x_expr = cos(3*t)
y_expr = sin(5*t)
x_num = matlabFunction(x_expr)
y_num = matlabFunction(y_expr)
t_vals = 0:0.01:2*pi
plot(x_num.(t_vals), y_num.(t_vals))
通过灵活运用符号到数值的转换机制,MWORKS.Syslab 能够让用户在符号推导与数值可视化之间自由切换,极大地提升了符号数学工具的实际应用价值。