第三讲 MATLAB的符号运算
—— matlab 不仅具有数值运算功能,还开发了在 matlab环境下实现符号计算的工具包 Symbolic
Math Toolbox
符号运算的功能
符号表达式、符号矩阵的创建
符号线性代数
因式分解、展开和简化
符号代数方程求解
符号微积分
符号微分方程一、符号运算的基本操作
1,什么是符号运算
与数值运算的区别
※ 数值运算中必须先对变量赋值,
然后才能参与运算。
※ 符号运算无须事先对独立变量赋值,运算结果以标准的符号形式表达。
特点:
运算对象可以是没赋值的符号变量
可以获得任意精度的解
Symbolic Math Toolbox—— 符号运算工具包通过调用 Maple软件实现符号计算的。
maple软件 —— 主要功能是符号运算,
它占据符号软件的主导地位。
2,符号变量与符号表达式
f = 'sin(x)+5x'
f —— 符号变量名
sin(x)+5x—— 符号表达式
' '—— 符号标识
符号表达式一定要用 ' ' 单引号括起来 matlab才能识别。
' ' 的内容可以是符号表达式,也可以是符号方程。
例:
f1='a?x^2+b?x+c' —— 二次三项式
f2= 'a?x^2+b?x+c=0' —— 方程
f3='Dy+y^2=1' —— 微分方程
※ 符号表达式或符号方程可以赋给符号变量,以后调用方便;也可以不赋给符号变量直接参与运算
3.符号矩阵的创建数值矩阵 A=[1,2;3,4]
A=[a,b;c,d] —— 不识别
用 matlab函数 sym创建矩阵( symbolic
的缩写 )
命令格式,A=sym('[ ]')
※ 符号矩阵内容同数值矩阵
※ 需用 sym指令定义
※ 需用 ' '标识例如,A = sym('[a,2*b ; 3*a,0]')
A =
[ a,2*b]
[3*a,0]
这就完成了一个符号矩阵的创建。
注意:符号矩阵的每一行的两端都有方括号,这是与 matlab数值矩阵的一个重要区别。
用字符串直接创建矩阵
模仿 matlab数值矩阵的创建方法
需保证同一列中各元素字符串有相同的长度。
例,A =['[ a,2*b]'; '[3*a,0]']
A =
[ a,2*b]
[3*a,0]
符号矩阵的修改
a.直接修改可用?,?键找到所要修改的矩阵,
直接修改
b.指令修改
用 A1=sym(A,?,?,'new') 来修改。
用 A1=subs(A,'new','old')来修改
A1=subs(S,'old','new')
例如,A =[ a,2*b]
[3*a,0]
A1=sym(A,2,2,'4*b')
A1 =[ a,2*b]
[3*a,4*b]
A(2,2)='4*b'
A3 = [ a,2*b]
[3*a,4*b]
A2=subs(A1,'c','b')
A2 =[ a,2*c]
[3*a,4*c]
将数值矩阵转化为符号矩阵函数调用格式,sym(A)
A=[1/3,2.5;1/0.7,2/5]
A =
0.3333 2.5000
1.4286 0.4000
sym(A)
ans =
[ 1/3,5/2]
[10/7,2/5]
符号矩阵与数值矩阵的转换
将符号矩阵转化为数值矩阵函数调用格式,numeric(A)
A =
[ 1/3,5/2]
[10/7,2/5]
numeric(A)
ans =
0.3333 2.5000
1.4286 0.4000
1,符号矩阵运算数值运算中,所有矩阵运算操作指令都比较直观、简单。例如,a=b+c;
a=a*b ; A=2*a^2+3*a-5等。
而符号运算就不同了,所有涉及符号运算的操作都有专用函数来进行二、符号运算符号矩阵运算的函数:
symadd(a,d) —— 符号矩阵的加
symsub(a,b) —— 符号矩阵的减
symmul(a,b) —— 符号矩阵的乘
symdiv(a,b) —— 符号矩阵的除
sympow(a,b) —— 符号矩阵的幂运算
symop(a,b) —— 符号矩阵的综合运算例 1,f= '2*x^2+3*x-5'; g= 'x^2+x-7';
h= symadd(f,g)
h=
3*x^2+4*x-12
例 2,f='cos(x)';g= ' sin(2*x)';
symop(f,'/',g,'+',f,'*',g)
ans =
cos(x)/sin(2*x)+cos(x)*sin(2*x)
例 1,f= 2*x^2+3*x-5; g= x^2+x-7;
>> syms x
>> f=2*x^2+3*x-5; g= x^2+x-7;
>> h=f+g
h = 3*x^2+4*x-12
例 2,f=cos(x);g= sin(2*x);
>> syms x
>> f=cos(x);g=sin(2*x);
>> f/g+f*g
ans =
cos(x)/sin(x)+cos(x)*sin(x)
符号运算函数:
symsize —— 求符号矩阵维数
charploy —— 特征多项式
determ —— 符号矩阵行列式的值
eigensys —— 特征值和特征向量
inverse —— 逆矩阵
transpose —— 矩阵的转置
jordan —— 约当标准型
simple —— 符号矩阵简化
2,任意精度的数学运算在 symbolic中有三种不同的算术运算:
1,数值类型 matlab的浮点算术运算
2,有理数类型 maple的精确符号运算
3,vpa类型 maple的任意精度算术运算
浮点算术运算
1/2+1/3 -- (定义输出格式 format long)
ans =
0.83333333333333
符号运算
sym(1/2)+(1/3)
ans =
5/6 --精确解
任意精度算术运算
digits(n) —— 设置可变精度,缺省 16位
vpa(x,n) —— 显示可变精度计算
digits(25)
vpa(1/2+1/3)
ans =
.8333333333333333333333333
vpa(5/6,40)
ans =
.8333333333333333333333333333333333333333
a=sym('[1/4,exp(1);log(3),3/7]')
a =
[ 1/4,exp(1)]
[log(3),3/7]
vpa(a,10)
ans =
[.2500000000,2.718281828]
[1.098612289,.4285714286]
diff(f) — 对缺省变量求微分
diff(f,v) — 对指定变量 v求微分
diff(f,v,n) — 对指定变量 v求 n阶微分
int(f) — 对 f表达式的缺省变量求积分
int(f,v) — 对 f表达式的 v变量求积分
int(f,v,a,b) — 对 f表达式的 v变量在( a,b)
区间求定积分
3,符号微积分与积分变换
int( '被积表达式 ','积分变量 ','积分上限 ',
'积分下限 ') —— 定积分
—— 缺省时为不定积分
mtaylor(f,n) —— 泰勒级数展开
ztrans(f) —— Z变换
Invztrans(f) —— 反 Z变换
Laplace(f) —— 拉氏变换
Invlaplace(f) —— 反拉氏变换
fourier(f) —— 付氏变换
Invfourier(f) —— 反付氏变换例 1.计算二重不定积分
d x d yxe xy
F=int(int('x*exp(-x*y)','x'),'y')
F=
1/y*exp(-x*y)
例 2.计算 f='x*exp(-x*10)'的 Z变换
F=ztrans(f)
F=
z*exp(-10)/(z-exp(-10))^2
>> syms x y
>> F=int(int(x*exp(-x*y),x),y)
F =
1/y*exp(-x*y)
>> syms x
>> f=x*exp(-x*10);
>> F=ztrans(f)
>> F=ztrans(x*exp(-x*10);
F =
z*exp(-10)/(z-exp(-10))^2
例 3,计算指数函数 eAt。
用拉氏反变换法计算 eAt的公式为:
eAt = L-1[(SI-A)-1]
系统矩阵 A=
32
10

tttt
tttt
eeee
eeee

22
22
222
2e
At =
结果:
>> a=[0 1;-2 -3];
>> syms s
>> b=(s*eye(2)-a)
b =
[ s,-1]
[ 2,s+3]
>> B=inv(b)
[ (s+3)/(s^2+3*s+2),1/(s^2+3*s+2)]
[ -2/(s^2+3*s+2),s/(s^2+3*s+2)]
>> b11=ilaplace(sym(b,1,1));b(1,1)=b11;
>> b12=ilaplace(sym(b,1,2));b(1,2)=b12;
>> b21=ilaplace(sym(b,2,1));b(2,1)=b21;
>> b22=ilaplace(sym(b,2,2));b(2,2)=b22;
>> b
b =
[ -exp(-2*t)+2*exp(-t),exp(-t)-exp(-2*t)]
[ -2*exp(-t)+2*exp(-2*t),2*exp(-2*t)-exp(-t)]
4.符号代数方程求解
matlab符号运算能够解一般的线性方程、非线性方程及一般的 代数方程、
代数方程组 。当方程组不存在符号解时,又无其他自由参数,则给出数值解。
命令格式:
solve(f) —— 求一个方程的解
Solve(f1,f2,…f n) —— 求 n个方程的解例 1,f = ax2+bx+c 求解
f='a*x^2+b*x+c';
solve(f) —— 对缺省变量 x求解
ans =
[1/2/a*(-b+(b^2-4*a*c)^(1/2))]
[1/2/a*(-b-(b^2-4*a*c)^(1/2))]
计算机格式
a
acbb
2
42 一般格式例 2,符号方程 cos(x)=sin(x)
tan(2*x)=sin(x)求解
f1=solve('cos(x)=sin(x)'),
f1 =
1/4*pi
solve(f,'b' ) —— 对指定变量 b求解
ans =
-(a*x^2+c)/x
f3= matlab4.2的解
[ 0]
[ pi]
[ atan(1/2*(-2*3^(1/2))^(1/2),1/2+1/2*3^(1/2))]
[ atan(-1/2*(-2*3^(1/2))^(1/2),1/2+1/2*3^(1/2))]
[ atan(1/2*2^(1/2)*3^(1/4)/(1/2-1/2*3^(1/2)))+pi]
[ -atan(1/2*2^(1/2)*3^(1/4)/(1/2-1/2*3^(1/2)))-pi]
f2=solve('tan(2*x)=sin(x)')
f2 = matlab4.2的解
[ 0]
[acos(1/2+1/2*3^(1/2))]
[acos(1/2 -1/2*3^(1/2))]
numeric(f3)
ans =
0
3.1416
0 + 0.8314i
0 - 0.8314i
1.9455
-1.9455
numeric(f2)
ans =
0
0 + 0.8314i
1.9455
matlab4.2与 6.1的对比例 3,解方程组 x+y+z=1
x-y+z=2
2x-y-z=1
g1='x+y+z=1',g2='x-y+z=2',g3='2*x-y-z=1'
f=solve(g1,g2,g3)
f=solve('x+y+z=1','x-y+z=2','2*x-y-z=1')
f =
z = 5/6,y = -1/2,x = 2/3
f=solve('x+y+z=1','x-y+z=2','2*x-y-z=1')
f =
x,[1x1 sym] f.x
ans =2/3
y,[1x1 sym] f.y
ans =-1/2
z,[1x1 sym] f.z
ans =5/6
[x,y,z]=solve('x+y+z=1','x-y+z=2','2*x-y-z=1')
x = 2/3
y =-1/2
z =5/6
5,符号微分方程求解
—— 用一个函数可以方便地得到微分方程的符号解符号微分方程求解指令,dsolve
命令格式,dsolve(f,g)
f —— 微分方程,可多至 12个微分方程的求解; g为初始条件
默认自变量为 'x',可任意指定自变量 't','u'等
微分方程的各阶导数项以大写字母 D表示
dt
dy
dx
dy
2
2
dt
yd
n
n
dt
yd
2
2
dx
yd
n
n
dx
yd
或或或
y的一阶导数 —— Dy
y的二阶导数 —— D2y
y的 n 阶导数 —— Dny
[y1,y2…]=dsolve(x1,x2,…xn) —— 返回微分方程的解一阶微分方程
dsolve('Dx=y','Dy=x','x(0)=0','y(0)=1')
ans =
x(t) = sin(t),y(t) = cos(t)
二阶微分方程
dsolve('D2y=-a^2*y','y(0)=1','Dy(pi/a)=0')
ans =
cos(a*x)
例 3.
y=dsolve('D2y+2*Dy+2*y=0','y(0)=1','Dy(0)=0')
ans =
exp(-x)*cos(x)+exp(-x)*sin(x)
ezplot(y) —— 方程解 y(t)的时间曲线图
2
2
dx
yd
dx
dy2? 02 y
00?)(
dx
dy,1)0(?y 求该方程的解
-6 -4 -2 0 2 4
0
50
100
150
200
250
300
x
e x p ( - x ) * co s( x ) + e x p ( - x ) * si n ( x )
-6 -4 -2 0 2 4
0
50
100
150
200
250
t
e x p (- t ) s i n ( t )+ e x p (- t ) c o s ( t )
三,maple函数 —— 符号运算的扩展
maple—— 是专门进行数学运算的软件工具,
具有超强的符号运算能力,提供了几乎包括所有数学领域的专用函数
matlab—— 依赖于 maple的内核与函数库,扩展了自己的符号运算功能。
matlab还设计了对 maple库函数的调用功能使得已有的 maple数学功能,可以扩充 matlab
中,作为自身符号运算能力的扩展。
1,maple内核访问函数可以访问 maple内核的 matlab函数,
maple ——— 访问 maple内核函数
mapleinit —— maple函数初始化
mpa ———— maple函数定义
mhelp ——— maple函数帮助命令
procread —— maple函数程序安装
,maple 的调用格式
maple('表达式 ')
—— 将表达式送至 maple内核,
返回符号表达式结果。
maple ( '函数 ',变量 1,变量 2)
—— 调用 maple函数,传递给定变量 。
例 1,展开 5阶 bernoulli 多项式,计算 x=3 时 bernoulli 数。
a=maple('bernoulli(5,x)')
a =
-1/6*x+5/3*x^3+x^5-5/2*x^4
a=maple('bernoulli(5,3)')
a =
85
例 2,化简三角函数式 sin2x+cos2x
a=maple('simplify(sin(x)^2+cos(x)^2);')
a =
1
例 4,求 f(t)=e-3tsint的拉式变换
f=maple('laplace(exp(-3*t)*sin(t),t,s);')
f =
1/((s+3)^2+1)
例 4,寻找二次多项式的完全平方
f (x) = x2+2x+2
a=maple('completesquare(x^2+2*x+2)')
a =
completesquare(x^2+2*x+2) 将工具包装入内存maple('with(student);')
a=maple('completesquare(x^2+2*x+2)')
a =
(x+1)^2+1
maple软件中的所有函数,在初始化时并没有完全装入内存,可用 readlib指令把库函数读入内存,
或用 with指令将应用工具包装入内存。
调用格式
maple('readlib(函数名 );')
maple('with(工具包名 );')
例 5.求 sin(x2+y2)在 x=0,y=0处泰勒级数展开式,8阶截断。
maple('mtaylor(sin(x^2+y^2),[x=0,y=0],8)')
ans =
mtaylor(sin(x^2+y^2),[x = 0,y = 0],8)
maple('readlib(mtaylor);')
maple('mtaylor(sin(x^2+y^2),[x=0,y=0],8)')
ans =
x^2+y^2-1/6*x^6-1/2*y^2*x^4-1/2*y^4*x^2-
1/6*y^6
2,mpa —— maple变量定义
任何一个 matlab定义的函数 f,可使用 mpa
语句直接调用,还可把 f 定义成 maple变量 v。
maple的工作空间与 matlab工作空间是相互独立的,所以 f 与 v是属于不同工作空间中的变量
mpa的调用格式:
mpa('v',f)
mpa v f f为 matlab工作空间中已存在的变量例,电磁力计算公式为试 I=0.5,x=0.1邻域展开泰勒级数,3阶截断,令常数,
1.直接调用
maple('readlib(mtaylor);')
maple('mtaylor(k*I^2/x^2,[I=0.5,x=0.1],3);')
2
2
0
4
)(),(
x
NISxIF
4
2
0 NSk
2
2
),(
x
kIxIF?
2.定义符号函数 f(matlab6.1无 map函数 )
f='k*I^2/x^2';
maple('mtaylor(f,[I=0.5,x=0.1],3);')
ans =
mtaylor(f,[I =,5,x =,1],3)
mpa('u',f)
maple('mtaylor(u,[I=0.5,x=0.1],3);')
ans =
25.*k-.50e3*k*(x-.1)+.10e3*k*(I-
.5)+7500.000000000000*k*(x-
.1)^2+.1e3*k*(I-.5)^2-.20e4*k*(I-.5)*(x-.1)
注意,matlab符号运算时,可以识别 matlab定义的符号变量,但在调用 maple 函数时,需将 matlab变量定义为 maple变量后,所调用的函数方可识别和执行
3.mhelp —— maple函数帮助命令
mhelp 是协助检索 maple库函数的专用命令调用格式,mhelp 相关词条例如:
mhelp intro — maple介绍
mhelp maple — maple命令格式
mhelp tutorial — maple入门
mhelp index — maple检索工具词条函数词条
mhelp index 用于工具包检索
library —— maple标准库函数
packages —— 应用工具包
libmisc —— 其它库函数
statements —— maple语句描述
expressions —— maple表达式
datatypes —— maple数据格式
tables —— maple表格和阵列
procedures —— maple程序
misc —— maple其它应用一般帮助文本主要包括以下部分
FUNCTION—— 函数功能说明
CALLING SEQUENCE—— 调用格式
PARAMETERS —— 调用参数说明
SYNOPSIS —— 语法说明
EXAMPLES —— 应用举例
SEE ALSO —— 相关词条
4.maple库函数
maple库函数共分四类
maple内部函数:驻留函数任何条件下都可调用
mhelp index[internal]
maple的外部函数 — 读库定义部分:
调用时先执行读库命令,因此与内部函数一样可直接调用
mhelp index[external]
maple的外部函数 — 读库装入部分
maple其余外部函数需要在使用前执行 maple('readlib(函数名 );')命令将其装入内存
mhelp index[libmisc]
maple的惰性函数 — 不能直接调用,
还需一些函数如 mod,evala,evalf 等才能调用
mhelp index[intert]
小 结本节介绍了 matlab语言的符号运算功能,通过学习应该掌握:
掌握如何创建、修改符号矩阵
掌握符号运算功能
maple函数调用
mhelp检索