matlab符号计算功能和可视化(公式推导)
符号计算结果的图形化显示、符号计算程序的编写以及在线帮助系统都是十分完整和便 捷的
符号计算结果的图形化显示、符号计算程序的编写以及在线帮助系统都是十分完整和便 捷的
符号运算入门
科学与工程技术中的数值运算固然重要,但自然科学理论分析中各种各样的公式、关系 式及其推导就是符号运算要解决的问题。它与数值运算一样,都是科学计算研究的重要内容。 MATLAB 7.0 数值运算的对象是数值,而 MATLAB 7.0 符号运算的对象则是非数值的符号对 象。所谓符号对象就是指代表非数值的符号字符串。下面列举一些实例来具体说明 MATLAB 7.0 的符号运算功能。
科学与工程技术中的数值运算固然重要,但自然科学理论分析中各种各样的公式、关系 式及其推导就是符号运算要解决的问题。它与数值运算一样,都是科学计算研究的重要内容。 MATLAB 7.0 数值运算的对象是数值,而 MATLAB 7.0 符号运算的对象则是非数值的符号对 象。所谓符号对象就是指代表非数值的符号字符串。下面列举一些实例来具体说明 MATLAB 7.0 的符号运算功能。
创建符号对象和表达式
函数命令 sym()的调用格式有如下两种:
S=sym(A,flag)
S=sym(’A’,flag)
函数命令 sym()的调用格式有如下两种:
S=sym(A,flag)
S=sym(’A’,flag)
函数命令 syms() 函数命令 syms()的调用格式为:
syms s1 s2 s3 flag;
该命令可以建立 3 个或多个符号对象,如 s1、s2、s3。同样,flag 为对转换格式的限定, 具体选项同上。
syms s1 s2 s3 flag;
该命令可以建立 3 个或多个符号对象,如 s1、s2、s3。同样,flag 为对转换格式的限定, 具体选项同上。
)函数命令 class() 函数命令 class()的调用格式如下: str=class(object) class()命令将返回对象的数据类型。
实例:对数值 3/4 创建符号对象并检测数据的类型。
a = 3/4;
b = ’3/4’;
c = sym(3/4);
d = sym(’3/4’);
classa = class(a)
classb = class(b)
classc = class(c)
classd = class(d)
a = 3/4;
b = ’3/4’;
c = sym(3/4);
d = sym(’3/4’);
classa = class(a)
classb = class(b)
classc = class(c)
classd = class(d)
变量是程序语言的基本元素之一。MATLAB 7.0 符号运算中,符号变量是内容可变的符 号对象。符号变量通常是指一个或几个特定的字符,不是指符号表达式,甚至可以将一个符 号表达式赋值给一个符号变量。符号变量有时也称为自由变量。符号变量与 MATLAB 7.0 数 值变量名称的命名规则相同
符号变量实例:用函数命令 sym()和 syms()建立符号变量 a、b、c。
a = sym(’a’);
b = sym(’b’);
c = sym(’c’);
classa = class(a)
classb = class(b)
classc = class(c)
实例:用函数命令 syms()来创建符号对象并检测数据的类型
syms a b c;
classa = class(a)
classb = class(b)
classc = class(c)
符号变量实例:用函数命令 sym()和 syms()建立符号变量 a、b、c。
a = sym(’a’);
b = sym(’b’);
c = sym(’c’);
classa = class(a)
classb = class(b)
classc = class(c)
实例:用函数命令 syms()来创建符号对象并检测数据的类型
syms a b c;
classa = class(a)
classb = class(b)
classc = class(c)
符号表达式、符号函数与符号方程
表达式也是程序设计语言的基本元素之一。在 MATLAB 7.0 符号运算中,符号表达式是 由符号常量、符号变量、符号函数运算符以及专用函数连接起来的符号对象。符号表达式有 两类:符号函数与符号方程。符号函数不带等号,而符号方程是带等号的
表达式也是程序设计语言的基本元素之一。在 MATLAB 7.0 符号运算中,符号表达式是 由符号常量、符号变量、符号函数运算符以及专用函数连接起来的符号对象。符号表达式有 两类:符号函数与符号方程。符号函数不带等号,而符号方程是带等号的
用函数命令 sym()与 syms()建立符号函数 f1、f2、f3。
syms x y z;
f1 = x*y/z;
f2 = x^2+y^2+z^2;
f3 = f1/f2;
实例:用函数命令 sym()来创建符号方程 e1、e2、e3
e1 = sym(’a*x^2+b*x+c’)
e2 = sym(’sin(x)^2+2*cos(x)=1’)
e3 = sym(’Dy-y=x’)
syms x y z;
f1 = x*y/z;
f2 = x^2+y^2+z^2;
f3 = f1/f2;
实例:用函数命令 sym()来创建符号方程 e1、e2、e3
e1 = sym(’a*x^2+b*x+c’)
e2 = sym(’sin(x)^2+2*cos(x)=1’)
e3 = sym(’Dy-y=x’)
符号矩阵
元素是符号对象(非数值符号的字符符号即符号变量与符号形式的数即符号常量)的矩 阵叫做符号矩阵。符号矩阵既可以构成符号矩阵函数,也可以构成符号矩阵方程,它们都是 符号表达式
实例:用函数命令 sym()建立符号矩阵 m1、m2。
m1 = sym(’[ab bc cd;de ef fg;h I j]’);
m2 = sym(’[1 12;23 34]’);
元素是符号对象(非数值符号的字符符号即符号变量与符号形式的数即符号常量)的矩 阵叫做符号矩阵。符号矩阵既可以构成符号矩阵函数,也可以构成符号矩阵方程,它们都是 符号表达式
实例:用函数命令 sym()建立符号矩阵 m1、m2。
m1 = sym(’[ab bc cd;de ef fg;h I j]’);
m2 = sym(’[1 12;23 34]’);
符号函数运算符:
基本运算符
? 运算符“+”、“-”、“*”、“\”、“/”、“^”分别实现矩阵的加、减、乘、左除、右除 和求幂运算。 ? 运算符“.*”、“./”、“.\”、“.^”分别实现“元素对元素”的数组乘、左除、右 除和求幂运算。 ? 运算符“’”、“.’”分别实现矩阵的共轭转置和非共轭转置。
2.关系运算符
在符号对象的比较中,没有“大于”、“大于等于”、“小于”和“小于等于”的概念,而 只有是否“等于”的概念。 运算符“==”和“~=”分别对运算符两边的对象进行“相等”、“不等”的比较。当 事实为“真”时,返回结果 1;否则,返回结果 0。
3.三角函数、双曲函数以及它们的反函数
除 atan2 仅能用于数值计算外,其余的三角函数(如 sin)、双曲函数(如 cosh)及它们 的反函数(如 asin、acosh),无论在数值计算还是在符号计算中,它们的使用方法都相同。
4.指数、对数函数
在数值、符号计算中,函数 sqrt、exp 和 expm 的使用方法完全相同。至于对数函数,在 MATLAB 6.X 版本中,符号计算中只有自然对数 log,而没有数值计算中的 log2、log10。而 在 MATLAB 7.X 版本中,增加了 log2 和 log10 函数,其用法同数值运算中完全相同。
5.复数函数
复数函数涉及复数的共轭(conj)、实部(real)、虚部(imag)和模(abs)的函数,在 符号、数值计算中的使用方法相同。但需要注意的是,在符号运算中,MATLAB 7.0 没有提 供求相角的指令。
6.矩阵代数指令
在符号运算中,MATLAB 7.0 提供的常用矩阵代数指令有 diag、triu、tril、inv、det、rank、 rref、null、colspace、poly、expm、eig 和 svd。它们的用法几乎与数值计算中的情况完全一 样,只有 svd 稍微不同,后面将有详细的介绍。
基本运算符
? 运算符“+”、“-”、“*”、“\”、“/”、“^”分别实现矩阵的加、减、乘、左除、右除 和求幂运算。 ? 运算符“.*”、“./”、“.\”、“.^”分别实现“元素对元素”的数组乘、左除、右 除和求幂运算。 ? 运算符“’”、“.’”分别实现矩阵的共轭转置和非共轭转置。
2.关系运算符
在符号对象的比较中,没有“大于”、“大于等于”、“小于”和“小于等于”的概念,而 只有是否“等于”的概念。 运算符“==”和“~=”分别对运算符两边的对象进行“相等”、“不等”的比较。当 事实为“真”时,返回结果 1;否则,返回结果 0。
3.三角函数、双曲函数以及它们的反函数
除 atan2 仅能用于数值计算外,其余的三角函数(如 sin)、双曲函数(如 cosh)及它们 的反函数(如 asin、acosh),无论在数值计算还是在符号计算中,它们的使用方法都相同。
4.指数、对数函数
在数值、符号计算中,函数 sqrt、exp 和 expm 的使用方法完全相同。至于对数函数,在 MATLAB 6.X 版本中,符号计算中只有自然对数 log,而没有数值计算中的 log2、log10。而 在 MATLAB 7.X 版本中,增加了 log2 和 log10 函数,其用法同数值运算中完全相同。
5.复数函数
复数函数涉及复数的共轭(conj)、实部(real)、虚部(imag)和模(abs)的函数,在 符号、数值计算中的使用方法相同。但需要注意的是,在符号运算中,MATLAB 7.0 没有提 供求相角的指令。
6.矩阵代数指令
在符号运算中,MATLAB 7.0 提供的常用矩阵代数指令有 diag、triu、tril、inv、det、rank、 rref、null、colspace、poly、expm、eig 和 svd。它们的用法几乎与数值计算中的情况完全一 样,只有 svd 稍微不同,后面将有详细的介绍。
浮点运算是最快的运算,需要的计算机内存最小,但是结果不精确。MATLAB 7.0 双精 度数输出的数字位数由 format 命令控制,但它内部采用的是由计算机硬件提供的八位浮点的 表示方法。而且,在上面的浮点运算中,存在三种舍入误差,第一是来自 1/3 的除法舍入误 差;第二是来自将 1/2 加到 1/3 的结果上产生的舍入误差;第三是来自将二进制结果转化为 十进制输出时的舍入误差。 而符号运算中的有理数算术运算,它所需要的时间和内存开销都是最大的。只要有足够 的内存和足够长的计算时间,总能产生精确的结果。 一般符号计算的结果都是字符串,特别是一些符号计算结果从形式上看来是数值,但从 变量类型上说,它们仍然是字符串,例如上面例子中的“5/6”实际上就是字符串,而非数值。 要从精确解中获得任意精度的解,并改变默认精度,把任意精度符号解变成“真正的”数值 解,就需要用到 MATLAB 7.0 提供的如下几个函数
1.digits(d)
调用该函数后的近似解的精度变成 d 位有效数字。d 的默认值是 32 位。 另外,调用 digits 命令(没参数)可以得到当前采用的数值计算的精度。
2.vpa(A,d)
求符号解 A 的近似解,该近似解的有效位数由参数 d 来指定。如果不指定 d,则按照一 个 digits(d)指令设置的有效位数输出。
3.double(A)
把符号矩阵或任意精度表示的矩阵 A 转换成为双精度矩阵。
调用该函数后的近似解的精度变成 d 位有效数字。d 的默认值是 32 位。 另外,调用 digits 命令(没参数)可以得到当前采用的数值计算的精度。
2.vpa(A,d)
求符号解 A 的近似解,该近似解的有效位数由参数 d 来指定。如果不指定 d,则按照一 个 digits(d)指令设置的有效位数输出。
3.double(A)
把符号矩阵或任意精度表示的矩阵 A 转换成为双精度矩阵。
,MATLAB 7.0 专门提供了对符号计算结果进行化简和替换的函数,诸如因式分解、同类项合并、符号表 达式的展开、符号表达式的化简和通分等,它们都是表达式的恒等变换。
函数 collect()
函数实现功能为将符号表达式中同类项合并
函数 expand()
函数实现功能为将表达式进行展开
函数 horner()
函数实现将符号表达式转换成嵌套形式 化简
.函数 factor()
函数实现将符号多项式进行因式分解。
实例:以下的指令将对如 x^(n+1)的多项式进行因式分解: ’
n = 1:9
x = x(ones(size(n)));
p = x.^n+1;
[p;factor(p)].’
函数实现功能为将符号表达式中同类项合并
函数 expand()
函数实现功能为将表达式进行展开
函数 horner()
函数实现将符号表达式转换成嵌套形式 化简
.函数 factor()
函数实现将符号多项式进行因式分解。
实例:以下的指令将对如 x^(n+1)的多项式进行因式分解: ’
n = 1:9
x = x(ones(size(n)));
p = x.^n+1;
[p;factor(p)].’
函数 simple()
寻找一个符号表达式的最简形式
实例:
syms x
simple(cos(x)^2+sin(x)^2)
实例:下面是用 simple 化简三角多项式的示例代码:
simple(cos(3*acos(x)))
寻找一个符号表达式的最简形式
实例:
syms x
simple(cos(x)^2+sin(x)^2)
实例:下面是用 simple 化简三角多项式的示例代码:
simple(cos(3*acos(x)))
符号表达式的替换
在 MATLAB 7.0 中,可以通过符号替换来使表达式的输出形式简化,从而可以得到比 较简单的表达式。符号运算工具箱中提供了两个函数 subexpr 和 subs,用于实现符号对象的
替换。
函数 subexpr
函数 subexpr 将表达式中重复出现的字符串用变量代替
函数 subs
函数 subs 可以用指定符号替换符号表达式中的某一特定符号。
实例:
subs(exp(a*t),’a’,-magic(2)) %用矩阵来替换符号变量
在 MATLAB 7.0 中,可以通过符号替换来使表达式的输出形式简化,从而可以得到比 较简单的表达式。符号运算工具箱中提供了两个函数 subexpr 和 subs,用于实现符号对象的
替换。
函数 subexpr
函数 subexpr 将表达式中重复出现的字符串用变量代替
函数 subs
函数 subs 可以用指定符号替换符号表达式中的某一特定符号。
实例:
subs(exp(a*t),’a’,-magic(2)) %用矩阵来替换符号变量
符号矩阵的计算
实例:符号矩阵的加减运算,示例代码设置如下:
syms a b c d %定义基本的符号变量
A = sym(’[a b;c d]’); %定义符号矩阵
B = sym(’[2*a 3*b;c+a d+8]’); %定义符号矩阵
A+B %计算符号矩阵的加法
在下面的例子中,先生成数值希尔伯特矩阵,然后再将它转换成符号矩阵,并对它进行 各种线性代数运算。读者可以从中体会符号对象线性代数运算的特
p343
p343
特征值分解
在 MATLAB 7.0 中,分别采用下面的函数来求符号方阵的特征值和特征向量: • E = eig(A):求符号方阵 A 的符号特征值 E; • [v,E] = eig(A):返回方阵 A 的符号特征值 E 和相应的特征向量 v。 与它们对应的任意精度计算的指令是 E = eig(vpa(A))和[v,E] = eig(vpa(A))。对于上一节最 后给出的矩阵 H,由于它是奇异矩阵,肯定有一个特征值为 0:
[v,E] = eig(H) %求矩阵 H 的特征值和特征向量
在 MATLAB 7.0 中,分别采用下面的函数来求符号方阵的特征值和特征向量: • E = eig(A):求符号方阵 A 的符号特征值 E; • [v,E] = eig(A):返回方阵 A 的符号特征值 E 和相应的特征向量 v。 与它们对应的任意精度计算的指令是 E = eig(vpa(A))和[v,E] = eig(vpa(A))。对于上一节最 后给出的矩阵 H,由于它是奇异矩阵,肯定有一个特征值为 0:
[v,E] = eig(H) %求矩阵 H 的特征值和特征向量
约当标准型
对矩阵进行相似变换时,会产生约当标准型(Jordan Canonical Form)。对于矩阵 A,求 它的约当标准型,也就是找一个非奇异矩阵 V,使 J = V/A*V 最接近对角矩阵,其中的 V 称 为转换矩阵。 当矩阵对称且所有特征值均互异时,其约当标准型就是其特征值所组成的对角矩阵,相 应的转换矩阵由特征向量按列组成。对于非对称或有重特征值的情形,约当标准型的对角元 素由特征值组成,但对角线上面有非零元素。 MATLAB 7.0 提供了函数 jordan 来求矩阵的约当标准形,它的调用格式有:
实例:
A = sym([1 -3 -2;-1 1 -1;2 4 5]); %定义矩阵
[V,J] = jordan(A) %求约当标准型
奇异值分解
在符号数学工具箱中只有任意精度矩阵的奇异值分解才是可行的,其中一个重要原因就 在于由符号计算产生的公式一般都太长、太复杂,而且没有太多的用处。用于对符号矩阵 A 进行奇异值分解的函数式 svd,它的调用格式如下:
在符号数学工具箱中只有任意精度矩阵的奇异值分解才是可行的,其中一个重要原因就 在于由符号计算产生的公式一般都太长、太复杂,而且没有太多的用处。用于对符号矩阵 A 进行奇异值分解的函数式 svd,它的调用格式如下:
符号微积分
微积分运算在数学计算中的重要性是不言自明的,整个高等数学就是建立在微积分运算 的基础上的。同时微积分运算也是后面解符号微分方程的必要知识准备。 在符号数学工具箱中提供了一些常用的函数来支持具有重要基础意义的微积分运算,涉 及的方面主要包括微分、求极限、积分、级数求和和泰勒级数等。下面来具体介绍符号运算 在微积分中的使用方法
符号表达式的微分运算
1.diff 函数
当创建了符号表达式后,就可以利用函数 diff 对它们进行微分运算
实例:我们首先建立一个符号表达式,然后取相应的微分,示例代码设置如下:
syms a x %定义基本变量
f = sin(a*x) %定义符号表达式
df = diff(f) %对缺省变量 x 求微分
微积分运算在数学计算中的重要性是不言自明的,整个高等数学就是建立在微积分运算 的基础上的。同时微积分运算也是后面解符号微分方程的必要知识准备。 在符号数学工具箱中提供了一些常用的函数来支持具有重要基础意义的微积分运算,涉 及的方面主要包括微分、求极限、积分、级数求和和泰勒级数等。下面来具体介绍符号运算 在微积分中的使用方法
符号表达式的微分运算
1.diff 函数
当创建了符号表达式后,就可以利用函数 diff 对它们进行微分运算
实例:我们首先建立一个符号表达式,然后取相应的微分,示例代码设置如下:
syms a x %定义基本变量
f = sin(a*x) %定义符号表达式
df = diff(f) %对缺省变量 x 求微分
2.jacobian 函数
微分运算也可以对列向量进行,所得的结果也是一个列向量
笛卡尔坐标和球坐标之间转换雅可比矩阵 J 可以用如下的命令求得
syms r l f %定义基本变量
x = r*cos(l)*cos(f); y = r*cos(l)*sin(f); %建立转换关系
z = r*sin(l) J = jacobian([x;y;z],[r l f]) %计算转换的雅可比矩阵
微分运算也可以对列向量进行,所得的结果也是一个列向量
笛卡尔坐标和球坐标之间转换雅可比矩阵 J 可以用如下的命令求得
syms r l f %定义基本变量
x = r*cos(l)*cos(f); y = r*cos(l)*sin(f); %建立转换关系
z = r*sin(l) J = jacobian([x;y;z],[r l f]) %计算转换的雅可比矩阵
在 MATLAB 7.0 中,用函数 limit 来求表达式的极限。函数 limit 的调用格式如下:
实例:
syms h n x %定义基本变量
dc = limit((sin(x+h)-sin(x))/h,h,0) %按照导数的定义求 sin 的导数
实例:
limit(1/x,x,0) %求第一个表达式的值
limit(1/x,x,0,’left’) %求第二个表达式的值 limit(1/x,x,0,’right’) %求第三个表达式的值
实例:
syms h n x %定义基本变量
dc = limit((sin(x+h)-sin(x))/h,h,0) %按照导数的定义求 sin 的导数
实例:
limit(1/x,x,0) %求第一个表达式的值
limit(1/x,x,0,’left’) %求第二个表达式的值 limit(1/x,x,0,’right’) %求第三个表达式的值
符号表达式的积分
数学中,积分和微分是一对互逆的运算。符号数学工具箱种提供了函数 int 来求符号表 达式的积分,它的调用格式如下
实例:例如,下面用各种调用方式求符号表达式和符号矩阵的积分值,首先是用缺省变量对符 号表达式求积分。
int(-2*x/(1+x^2)^2) %对符号表达式进行积分
数学中,积分和微分是一对互逆的运算。符号数学工具箱种提供了函数 int 来求符号表 达式的积分,它的调用格式如下
实例:例如,下面用各种调用方式求符号表达式和符号矩阵的积分值,首先是用缺省变量对符 号表达式求积分。
int(-2*x/(1+x^2)^2) %对符号表达式进行积分
级数的求和
函数 symsum 用于对符号表达式进行求和。该函数的调用格式如下:
syms x k %定义基本变量
s1 = symsum(1/k^2,1,inf) %求无穷级数的和
s1 = symsum(x^k,k,0,inf) %求无穷级数的和
实例:下面的命令将返回函数的 8 阶泰勒展开式
syms x %定义基本符号变量
f = 1/(2+cos(x)) %定义 f 函数
r = taylor(f,8) %以 x 为自变量求 f 的泰勒展开式
实例:下面的命令将求出函数 sin(x)*e-x 的麦克劳林级数:
ft = taylor(sym(sin(x)*exp(-x)),8) %求函数的麦克劳林级数
以下要介绍 3 种积分变换,即 Fourier 变换、Laplace 变换与 Z 变换
Fourier变换实例:下面的示例代码将给出 Fourier 变换的具体实现:
syms t w %定义基本符号变量
ut = Heaviside(t); %定义 0 时刻起跳的单位阶跃函数
UT = fourier(ut) %进行 fourier 变换
再来求 Fourier 反变换:
Ut = ifourier(UT,w,t) %进行 fourier 反变换
Fourier变换实例:下面的示例代码将给出 Fourier 变换的具体实现:
syms t w %定义基本符号变量
ut = Heaviside(t); %定义 0 时刻起跳的单位阶跃函数
UT = fourier(ut) %进行 fourier 变换
再来求 Fourier 反变换:
Ut = ifourier(UT,w,t) %进行 fourier 反变换
Laplace 变换
Laplace 变换和反变换的定义为:
与 Fourier 变换相似,Laplace 变换与反变换的实现也有两条途径。直接调用指令 laplace 和 ilaplace 进行,或者根据上面的定义,利用积分指令 int 实现。比较而言,直接使用 laplace 和 ilaplace 指令实现变换较为简洁。具体使用方法如下
实例:
syms t s %定义基本符号变量
syms a b positive %对常数进行“限定性”设置
Mt = [dirac(t-a),heaviside(t-b);exp(-a*t)*sin(b*t),t^2*cos(3*t)]; %定义输入矩阵
MS = laplace(Mt,t,s) %进行 Laplace 变换
Laplace 变换和反变换的定义为:
与 Fourier 变换相似,Laplace 变换与反变换的实现也有两条途径。直接调用指令 laplace 和 ilaplace 进行,或者根据上面的定义,利用积分指令 int 实现。比较而言,直接使用 laplace 和 ilaplace 指令实现变换较为简洁。具体使用方法如下
实例:
syms t s %定义基本符号变量
syms a b positive %对常数进行“限定性”设置
Mt = [dirac(t-a),heaviside(t-b);exp(-a*t)*sin(b*t),t^2*cos(3*t)]; %定义输入矩阵
MS = laplace(Mt,t,s) %进行 Laplace 变换
Z 变换
一个离散因果序列的 Z 变换及其反变换定义为:
Z变换实例:
%首先来构造单位函数并对其性能进行验证
syms n Delta = sym(’charfcn[0](n)’); %定义单位函数δ(n)
D0 = subs(Delta,n,0); %计算δ(0)
D15 = subs(Delta,n,15); %计算δ(15)
disp(’[D0,D15]’);
disp([D0,D15])
再来求序列 f(n)的 Z 变换,示例代码如下:
syms z
fn = 2*Delta+6*(1-(1/2)^n);
FZ = ztrans(fn,n,z);
disp(’FZ = ’);
pretty(FZ)
最后 Z 反变换,示例代码如下:
FZ_n = iztrans(FZ,z,n)
一个离散因果序列的 Z 变换及其反变换定义为:
Z变换实例:
%首先来构造单位函数并对其性能进行验证
syms n Delta = sym(’charfcn[0](n)’); %定义单位函数δ(n)
D0 = subs(Delta,n,0); %计算δ(0)
D15 = subs(Delta,n,15); %计算δ(15)
disp(’[D0,D15]’);
disp([D0,D15])
再来求序列 f(n)的 Z 变换,示例代码如下:
syms z
fn = 2*Delta+6*(1-(1/2)^n);
FZ = ztrans(fn,n,z);
disp(’FZ = ’);
pretty(FZ)
最后 Z 反变换,示例代码如下:
FZ_n = iztrans(FZ,z,n)
符号方程求解
从学习代数开始,我们就一直在探索关于方程的求解理论,从最初的代入消元法和加减 消元法到数值计算中的牛顿迭代法、高斯消元法,一直到微分方程的求解理论,方程在数学 中的重要性就包含在这么漫长的探索、深化过程中。MATLAB 7.0 为符号方程的求解提供了 强有力的支持。 符号方程根据其中涉及到的运算类别,可以分为代数方程和微分方程。其中代数方程只 涉及到符号对象的代数运算,相对比较简单,它还可以细分为线性方程和非线性方程两类。 前者往往可以很容易地求得所有解,但是对于后者来说,却经常容易丢掉一些解,这时就必 须借助绘制函数图形,通过图形来判断方程解的个数。 微分方程的求解稍微复杂一些,它按照自变量的个数,可以分为常微分方程和偏微分方 程。偏微分方程的求解在数学上相当复杂,而且理论体系也繁杂,用机器求解往往不能找到 通行的方法,所以这里介绍用 MATLAB 7.0 求解常微分方程。
从学习代数开始,我们就一直在探索关于方程的求解理论,从最初的代入消元法和加减 消元法到数值计算中的牛顿迭代法、高斯消元法,一直到微分方程的求解理论,方程在数学 中的重要性就包含在这么漫长的探索、深化过程中。MATLAB 7.0 为符号方程的求解提供了 强有力的支持。 符号方程根据其中涉及到的运算类别,可以分为代数方程和微分方程。其中代数方程只 涉及到符号对象的代数运算,相对比较简单,它还可以细分为线性方程和非线性方程两类。 前者往往可以很容易地求得所有解,但是对于后者来说,却经常容易丢掉一些解,这时就必 须借助绘制函数图形,通过图形来判断方程解的个数。 微分方程的求解稍微复杂一些,它按照自变量的个数,可以分为常微分方程和偏微分方 程。偏微分方程的求解在数学上相当复杂,而且理论体系也繁杂,用机器求解往往不能找到 通行的方法,所以这里介绍用 MATLAB 7.0 求解常微分方程。
代数方程的求解
这里所讲的一般代数方程包括线性、非线性和超越方程等,求解指令是 solve。当方程组 不存在符号解时,若又无其他自由参数,则 solve 将给出数值解。该指令的使用格式包括以 下几种: • g = solve(eq):其中 eq 可以是符号表达式或不带符号的字符串,该函数将求解方程 eq = 0,其自变量采用默认变量,可以通过函数 findsym 来确定; • g = solve(eq,var):求解方程 eq = 0,其自变量由参数 var 指定。其中 eq 和上一种调用 方式相同。返回值 g 是由方程的所有解构成的列向量; • g = solve(eq1,eq2,⋯,eqn):求解由符号表达式或不带符号的字符串 eq1,eq2,⋯,eqn 组成的方程组。其中的自变量为整个方程组的默认变量,即将函数 findsym 作用于整 个方程组时返回的变量; • g = solve(eq1,eq2,⋯,eqn,var1,var2,⋯,varn):求解由符号表达式或不带等号的字符串 eq1,eq2,⋯,eqn 组成的方程组。其自变量由输入参数 var1,var2,⋯,varn 指定。 对于上面的 4 种调用方式,输出的解有 3 种情况: • 对于单个方程单个输出参数的情况,将返回由多个解构成的列向量; • 对于有和方程数目相同的输出参数的情况,方程组的解将分别赋给每个输出参数,并 按照字母表的顺序进行排列; • 对于只有一个输出参数的方程组,方程组的解将以结构矩阵的形式赋给输出参数。
实例:
S = solve(’u*y^2+v*z+w = 0’,’y+z+w = 0’,’y’,’z’)
disp(’S.y’),disp(S.y),disp(’S.z’),disp(S.z)
这里所讲的一般代数方程包括线性、非线性和超越方程等,求解指令是 solve。当方程组 不存在符号解时,若又无其他自由参数,则 solve 将给出数值解。该指令的使用格式包括以 下几种: • g = solve(eq):其中 eq 可以是符号表达式或不带符号的字符串,该函数将求解方程 eq = 0,其自变量采用默认变量,可以通过函数 findsym 来确定; • g = solve(eq,var):求解方程 eq = 0,其自变量由参数 var 指定。其中 eq 和上一种调用 方式相同。返回值 g 是由方程的所有解构成的列向量; • g = solve(eq1,eq2,⋯,eqn):求解由符号表达式或不带符号的字符串 eq1,eq2,⋯,eqn 组成的方程组。其中的自变量为整个方程组的默认变量,即将函数 findsym 作用于整 个方程组时返回的变量; • g = solve(eq1,eq2,⋯,eqn,var1,var2,⋯,varn):求解由符号表达式或不带等号的字符串 eq1,eq2,⋯,eqn 组成的方程组。其自变量由输入参数 var1,var2,⋯,varn 指定。 对于上面的 4 种调用方式,输出的解有 3 种情况: • 对于单个方程单个输出参数的情况,将返回由多个解构成的列向量; • 对于有和方程数目相同的输出参数的情况,方程组的解将分别赋给每个输出参数,并 按照字母表的顺序进行排列; • 对于只有一个输出参数的方程组,方程组的解将以结构矩阵的形式赋给输出参数。
实例:
S = solve(’u*y^2+v*z+w = 0’,’y+z+w = 0’,’y’,’z’)
disp(’S.y’),disp(S.y),disp(’S.z’),disp(S.z)
微分方程的求解
在前面已经讲过:从数值计算角度看,与初值问题求解相比,微分方程边值问题的求解 显得复杂和困难。对于应用数学工具去求解实际问题的科研人员来说,此时,不妨通过符号 计算指令进行求解尝试。因为,对于符号计算来说,不论是初值问题,还是边值问题,其求 解微分方程的指令形式都相同,且相当简单。 当然,符号计算可能花费较多的计算机资源,可能得不到简单的解析解或封闭形式的解, 甚至无法求解。既然没有万能的微分方程一般解法,那么:求解微分方程的符号法和数值法 有很好的互补作用。
实例:解微分方程组
S = dsolve(’Dx = y,Dy = -x’);
disp([blanks(12),’x’,blanks(21),’y’]),disp([S.x,S.y])
实例:
y = dsolve(’x*D2y-2*Dy = x^2’,’y(1) = 0,y(5) = 0’,’x’)
在前面已经讲过:从数值计算角度看,与初值问题求解相比,微分方程边值问题的求解 显得复杂和困难。对于应用数学工具去求解实际问题的科研人员来说,此时,不妨通过符号 计算指令进行求解尝试。因为,对于符号计算来说,不论是初值问题,还是边值问题,其求 解微分方程的指令形式都相同,且相当简单。 当然,符号计算可能花费较多的计算机资源,可能得不到简单的解析解或封闭形式的解, 甚至无法求解。既然没有万能的微分方程一般解法,那么:求解微分方程的符号法和数值法 有很好的互补作用。
实例:解微分方程组
S = dsolve(’Dx = y,Dy = -x’);
disp([blanks(12),’x’,blanks(21),’y’]),disp([S.x,S.y])
实例:
y = dsolve(’x*D2y-2*Dy = x^2’,’y(1) = 0,y(5) = 0’,’x’)
可视化数学分析界面
MATLAB 7.0 的符号数学工具箱为符号函数可视化提供了一组简便易用的指令。本章着 重介绍两个进行数学分析的可视化界面,即图示化符号函数计算器(由指令 funtool 引出)和 泰勒级数逼近分析界面(由指令 taylortool 引出)。
图示化符号函数计算器
泰勒级数逼近分析器 taylortool 指令
MATLAB 7.0 的符号数学工具箱为符号函数可视化提供了一组简便易用的指令。本章着 重介绍两个进行数学分析的可视化界面,即图示化符号函数计算器(由指令 funtool 引出)和 泰勒级数逼近分析界面(由指令 taylortool 引出)。
图示化符号函数计算器
泰勒级数逼近分析器 taylortool 指令
sym 和 maple 这两个指令可以实现对 Maple 绝大多数符号计算指令的调用,利用它们可 以大大扩充 MATLAB 7.0 的符号计算功能。下面将通过示例分别介绍两个指令的使用。
利用 sym 函数调用 Maple 函数
例如,通过函数 sym 来调用 Maple 的阶乘函数 k!,代码设置如下
kfac = sym(’k!’); %调用 Maple 函数
这相当于定义了一个可以用来计算正整数阶乘的符号函数。利用它来计算一下阶乘 7! 和 n!,相应的命令如下
syms k n %定义基本变量
subs(kfac,k,7) %计算阶乘
subs(kfac,k,n) %计算阶乘
利用 sym 函数调用 Maple 函数
例如,通过函数 sym 来调用 Maple 的阶乘函数 k!,代码设置如下
kfac = sym(’k!’); %调用 Maple 函数
这相当于定义了一个可以用来计算正整数阶乘的符号函数。利用它来计算一下阶乘 7! 和 n!,相应的命令如下
syms k n %定义基本变量
subs(kfac,k,7) %计算阶乘
subs(kfac,k,n) %计算阶乘
利用 maple 函数调用 Maple 函数
采用 maple 函数可以直接调用 Maple 中的函数。这个函数采用符号对象、字符串和双精 度数作为输入参数,返回和输入参数对应的符号对象、字符串和双精度数。也可以利用函数 maple 来测试用户自己编写的符号数学程序。 假定要写一个 M 文件,用来计算两个多项式和两个整数的最大公约数。为此,首先要知 道怎样调用 Maple 中求取最大公约数的函数。可以使用命令 mhelp 来获得这方面的信息。输 入命令“mhelp gcd”即可获得 Maple 中用于求取最大公约数的函数 gcd 的相关信息。 当已经知道了如何调用函数 gcd 后,就可以编写一个简单的 M 文件 gcd.m 来调用这个 Maple 函数,从而轻松地求得两个多项式或整数的最大公约数。M 文件的内容如下:
function g = gcd(a,b)
g = maple(’gcd’,a,b);
这样就可以简单地调用该文件,并利用 Maple 函数求最大公约数。示例代码如下:
syms x y %定义基本变量
z = gcd(x^2-y^2,x^3-y^3) %求多项式的最大公约数
采用 maple 函数可以直接调用 Maple 中的函数。这个函数采用符号对象、字符串和双精 度数作为输入参数,返回和输入参数对应的符号对象、字符串和双精度数。也可以利用函数 maple 来测试用户自己编写的符号数学程序。 假定要写一个 M 文件,用来计算两个多项式和两个整数的最大公约数。为此,首先要知 道怎样调用 Maple 中求取最大公约数的函数。可以使用命令 mhelp 来获得这方面的信息。输 入命令“mhelp gcd”即可获得 Maple 中用于求取最大公约数的函数 gcd 的相关信息。 当已经知道了如何调用函数 gcd 后,就可以编写一个简单的 M 文件 gcd.m 来调用这个 Maple 函数,从而轻松地求得两个多项式或整数的最大公约数。M 文件的内容如下:
function g = gcd(a,b)
g = maple(’gcd’,a,b);
这样就可以简单地调用该文件,并利用 Maple 函数求最大公约数。示例代码如下:
syms x y %定义基本变量
z = gcd(x^2-y^2,x^3-y^3) %求多项式的最大公约数
matlab语言类似于python语言,模块化编程,函数封装,shell外壳调用,可扩展性(扩展word exell c/c++ java fortran)
附录函数P545