### 第7章 MATLAB符号计算
#### 7.1 符号计算基础
##### 7.1.1 符号对象
在MATLAB中,符号计算主要用于处理数学问题,特别是那些涉及数学公式和方程的问题。符号计算允许用户使用变量名称而非具体的数值进行计算,这在解析解的求解过程中尤为重要。
**符号对象**主要包括三种类型:
- **符号常数**:如数学常数π等。
- **符号变量**:没有赋予具体数值的变量。
- **符号表达式**:由符号常数和变量组成的数学表达式。
**`sym`函数**用于创建单个符号对象。其调用格式为:
```matlab
符号量名 = sym('符号字符串');
```
例如,要创建一个名为`a`的符号变量,可以使用以下命令:
```matlab
a = sym('a');
```
其中`'a'`表示符号字符串。
**示例1:**符号变量与数值变量的差异
我们可以创建几个符号变量并比较它们与数值变量的区别。
```matlab
a = sym('a'); b = sym('b');
c = sym('c'); d = sym('d');
w = 10; x = 5; y = -8; z = 11;
A = [a, b; c, d]; % 符号矩阵
B = [w, x; y, z]; % 数值矩阵
det(A) % 符号矩阵的行列式
det(B) % 数值矩阵的行列式
```
对于符号矩阵`A`,MATLAB会返回一个未计算的符号表达式`a*d-b*c`,而对于数值矩阵`B`,它将直接返回一个数值结果`150`。
**示例2:**符号常数与数值在代数运算中的差异
符号常数和数值在代数运算中的处理方式也有所不同。
```matlab
pi1 = sym('pi'); k1 = sym('8'); k2 = sym('3');
pi2 = pi; r1 = 8; r2 = 3;
sin(pi1 / 3) % 符号表达式的值
ans = 1/2 * 3^(1/2)
sin(pi2 / 3) % 数值表达式的值
ans = 0.8660
sqrt(k1) % 符号表达式的值
ans = 2 * 2^(1/2)
sqrt(r1) % 数值表达式的值
ans = 2.8284
sqrt(k1 + sqrt(k2)) % 符号表达式的值
ans = (8 + 3^(1/2))^(1/2)
sqrt(r1 + sqrt(r2)) % 数值表达式的值
ans = 3.1196
```
这些例子展示了符号运算和数值运算之间的区别。符号运算保留了表达式的符号形式,而数值运算则给出具体的数值结果。
**`syms`函数**提供了一种快速定义多个符号变量的方法,其格式为:
```matlab
syms arg1 arg2 ... argn
```
例如,要定义`a`, `b`, `c`, `d`四个符号变量,可以直接写:
```matlab
syms a b c d
```
这样就不需要为每个变量单独使用`sym`函数了。
#### 7.1.2 基本的符号运算
**符号表达式的四则运算**可以通过标准的算术运算符实现:
- 加法 `+`
- 减法 `-`
- 乘法 `*`
- 除法 `/`
- 幂 `^`
**示例:**
```matlab
f = 'z + 1';
u = sym('x + y');
syms x y;
v = (x + y)^2;
Q = f + u;
P = v / u;
```
这里,`Q`将得到表达式`z + 1 + x + y`,而`P`将得到表达式`(x + y) / (x + y)`,即简化后的结果为`1`。
**符号表达式的提取分子和分母运算**可通过`numden`函数实现。该函数用于提取符号表达式中的分子和分母。其调用格式为:
```matlab
[n, d] = numden(s);
```
这里的`s`是一个符号表达式,`n`和`d`分别代表分子和分母。
**示例:**假设我们有一个符号表达式`s = (x + 1) / (x - 1)`,我们可以使用`numden`函数提取分子和分母:
```matlab
syms x;
s = (x + 1) / (x - 1);
[n, d] = numden(s);
```
在这个例子中,`n`将等于`x + 1`,而`d`将等于`x - 1`。
通过以上介绍,我们可以看到MATLAB中的符号计算功能非常强大,能够帮助用户解决复杂的数学问题,并且提供了丰富的工具来处理符号表达式。