教学目标
1 熟悉符号对象和符号表达式的建立 2 熟练掌握符号表达式的代数运算 3 掌握符号矩阵的建立及其运算 4 掌握符号微积分函数的使用方法 5 掌握方程的求解
3.1 符号对象与符号表达式 3.1.1 符号对象的生成
1.建立符号变量和符号常量 (1) 符号常量的建立
符号常量是不含变量的符号表达式。在MATLAB中我们使用sym指令来建立符号常量。一般调用形式为 sym(‘常量’) %创建符号常量
例如,创建符号常量,这种方式是绝对准确的符号数值表示:
>> a=sym('sin(2)') a = sin(2)
sym命令也可以把数值转换成某种格式的符号常量。 语法: sym(常量,参数) %把常量按某种格式转换为符号常量
说明:参数可以选择为’d’、’f’、’e’或’r’ 四种格式,也可省略,其作用如表3.1所示。
表3.1 参数设置
参数 d f r e 作用 返回最接近的十进制数值(默认位数为32位) 返回该符号值最接近的浮点表示 返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一 返回最接近的带有机器浮点误差的有理值 例如,创建符号常量,这种方式是绝对准确的符号数值表示:
a=sym('sin(2)')
a =
sin(2)
例如,把常量转换为符号常量,按系统默认格式转换:
a=sym(sin(2))
a =
8190223105242182*2^(-53)
例3-1 创建数值常量和符号常量。
a1=2*sqrt(5)+pi
%创建数值常量
a1 =
7.6137
a2=sym('2*sqrt(5)+pi')
%创建符号表达式
a2 =
2*sqrt(5)+pi
a3=sym(2*sqrt(5)+pi)
%按最接近的有理数型表示符号常量
a3 =
8572296331135796*2^(-50) a4=sym(2*sqrt(5)+pi,'d')
%按最接近的十进制浮点数表示符号常量
a4 =
7.6137286085893727261009189533070 a31=a3-a1 %数值常量和符号常量的计算
a31 = 0
a5='2*sqrt(5)+pi'
%字符串常量
a5 =
2*sqrt(5)+pi
(2) 符号变量的建立
符号变量就是含有变量的符号表达式。
在MATLAB中sym也可以用于定义符号变量,但是函数sym一次只能定义一个符号变量,使用不方便。MATLAB提供了另一个函数syms,一次可以定义多个符号变量。syms函数的一般调用格式为:
syms 符号变量名1 符号变量名2 … 符号变量名n
用这种格式定义符号变量时不要在变量名上加字符串分界符(‘),变量间用空格而不要用逗号分隔。
2. 建立符号表达式
符号表达式就是代表数字、函数和变量的MATLAB字符串或字符串数组,它不要求变量要有预先定义的值。符号表达式包含符号函数和符号方程,其中符号函数没有等号,而符号方程必须带有等号。在MATLAB中建立符号表达式主要有一下三种方式: (1) 用单引号建立符号表达式 例
>> f='exp(x)' f = exp(x)
‘ ’中的内容也可以是符号方程。 >> e='a*x^2+bx+c=0' e =
a*x^2+bx+c=0
(2) 用sym建立符号表达式
f1=sym('a*x^2+b*x+c')
f1 =
a*x^2+b*x+c
(3) 使用已经定义的符号变量来组成符号表达式
syms a b c x f2=a*x^2+b*x+c
%创建多个符号变量 %创建符号表达式
f2 =
a*x^2+b*x+c
syms('a','b','c','x') f3=a*x^2+b*x+c;
%创建符号表达式
3.2 符号表达式的运算
符号运算与数值运算的区别主要有以下几点:
A 传统的数值型运算因为要受到计算机所保留的有效位数的限制,它的内部表示法总是采用计算机硬件提供的8位浮点表示法,因此每一次运算都会有一定的截断误差,重复的多次数值运算就可能会造成很大的累积误差。符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的。
B符号运算可以得出完全的封闭解或任意精度的数值解。 C符号运算的时间较长,而数值型运算速度快。 3.2.1 提取分子分母
如果符号表达是有理分式形式或可展开为有理分式形式,则可通过函数numden来提取符号表达式中的分子分母。numden函数的调用形式如下:
[n,d]=numden(a) 提取符号表达式a的分子与分母,并分别将其存放在n与d中 n=numden(a) 提取符号表达式a的分子与分母,但只把分子存放在n中 例 提取符号表达式的分子与分母 >> f=sym('a*x^2/(b-x)'); [n,d]=numden(f) n = -a*x^2 d = -b+x
3.2.2 符号表达式的基本代数运算
符号表达式的加、减、乘、除四则运算及幂运算等基本的代数运算,与矩阵的数值运算几乎完全一样。其中,符号表达式的加、减、乘、除运算可分别有函数symadd、symsub、symmul、symdiv来实现,也可与矩阵的数值运算一样,用“+”、“-”、“×”、“÷”符号进行运算,而符号表达式的幂运算也可以由函数sympow来实现,也可以由幂运算符“^”来实现。 例
>> f='4*x+5'; g='2*x^2+5*x+6'; symadd(f,g)
ans =
9*x+11+2*x^2
symsub(f,g)
ans =
-x-1-2*x^2
symmul(f,g) ans =
(4*x+5)*(2*x^2+5*x+6)
symdiv(f,g) ans =
(4*x+5)/(2*x^2+5*x+6)
sympow(f,g) ans =
(4*x+5)^(2*x^2+5*x+6)
>> A=sym('4*x+5'); B=sym('2*x^2+5*x+6'); >> C=A+B C =
9*x+11+2*x^2
A^B ans =
(4*x+5)^(2*x^2+5*x+6)
注意只有在使用sym命令的定义的表达式才可以用“+”、“-”、“×”、“÷”、“^” 例3-2 符号表达式f=2x2+3x+4与g=5x+6的代数运算。
f=sym('2*x^2+3*x+4')
f =
2*x^2+3*x+4
g=sym('5*x+6')
g = 5*x+6 f+g
%符号表达式相加
ans =
2*x^2+8*x+10 f*g
%符号表达式相乘
ans =
(2*x^2+3*x+4)*(5*x+6)
3.3 符号表达式的操作及转换
3.3.1 符号表达式中自由变量的确定 自由变量的确定原则
MATLAB将基于以下原则选择一个自由变量: A 小写字母i和j不能作为自由变量。
B 符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。
C 大写字母比所有的小写字母都靠后。
如果我们无法确定表达式中的自由变量,我们可以使用MATLAB提供的findsym函数来确定,该函数的一般调用形式为 findsym(EXPR,n) %确定自由符号变量
说明:EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。 例 得出符号表达式中的符号变量。
f=sym('a*x^2+b*x+c')
f =
a*x^2+b*x+c findsym(f)
%得出所有的符号变量
ans =
a, b, c, x
g=sym('sin(z)+cos(v)')
g =
sin(z)+cos(v) findsym(g,1)
%得出第一个符号变量
ans = z
3.3.2 符号表达式的化简
当通过MATLAB的符号函数运算生成的符号表达式难于看懂时,可以通过MATLAB的符号数学工具箱中提供的函数,来对符号表达式进行化简,把它化成易于看懂的形式。这方面的函数主要有:pretty、collect、expand、horner、factor、simplify、simple。 一般来说同一个数学函数可以表示成三种,如 多项式形式的表达方式:f(x)=x3+6x2+11x-6 因式形式的表达方式:f(x)=(x-1)(x-2)(x-3) 嵌套形式的表达方式:f(x)=x(x(x-6)+11)-6 例 三种形式的符号表达式的表示。
f=sym('x^3-6*x^2+11*x-6')
%多项式形式
f =
x^3-6*x^2+11*x-6
g= sym('(x-1)*(x-2)*(x-3)')
%因式形式
g =
(x-1)*(x-2)*(x-3)
h= sym(' x*(x*(x-6)+11)-6')
%嵌套形式
h =
x*(x*(x-6)+11)-6
下面我们将使用上面讲的函数对其化简
1. pretty函数
例 给出相应的符号表达式形式。
pretty(f)
3 2
x - 6 x + 11 x - 6
2. collect函数
例 给出相应的符号表达式形式。
collect(g)
ans =
x^3-6*x^2+11*x-6
当有多个符号变量,可以指定按某个符号变量来合并同类项。下面有x、y符号变量的表达式:
f1=sym('x^3+2*x^2*y+4*x*y+6')
f1 =
x^3+2*x^2*y+4*x*y+6 collect(f1,'y')
%按y来合并同类项
ans =
(2*x^2+4*x)*y+x^3+6
3. expand函数
例 给出相应的符号表达式形式。
expand(g)
ans =
x^3-6*x^2+11*x-6
4. horner函数
例 给出符号表达式的嵌套形式。
horner(f)
ans =
x*(x*(x-6)+11)-6
5. factor函数
例 给出符号表达式的因式形式。
factor(f)
ans =
(x-1)*(x-2)*(x-3)
6. simplify函数
例 利用三角函数来简化符号表达式cos2x-sin2x。
y=sym('cos(x)^2-sin(x)^2')
y =
cos(x)^2-sin(x)^2 simplify(y)
ans =
2*cos(x)^2-1
7. simple函数
simple 函数给出多种简化形式,给出除了pretty 、collect、expand、factor、simplify简化形式之外的radsimp、combine、combine(trig)、convert形式,并寻求包含最少数目字符的表达式简化形式。
例 利用simple简化符号表达式cos2x-sin2x。
simple(y)
simplify:
2*cos(x)^2-1
radsimp:
cos(x)^2-sin(x)^2
combine(trig):
cos(2*x)
factor:
(cos(x)-sin(x))*(cos(x)+sin(x))
expand:
cos(x)^2-sin(x)^2
combine:
cos(2*x)
convert(exp):
(1/2*exp(i*x)+1/2/exp(i*x))^2+1/4*(exp(i*x)-1/exp(i*x))^2
convert(sincos):
cos(x)^2-sin(x)^2
convert(tan):
(1-tan(1/2*x)^2)^2/(1+tan(1/2*x)^2)^2-4*tan(1/2*x)^2/(1+tan(1/2*x)^2)^2
collect(x):
cos(x)^2-sin(x)^2 ans =
cos(2*x)
3.3.3 符号表达式的替换
在MATLAB中可以使用subs函数可用来进行对符号表达式中符号变量的替换。
语法:
subs(s) %用给定值替换符号表达式s中的所有变量 subs(s,new) %用new替换符号表达式s中的自由变量 subs(s,old,new) %用new替换符号表达式s中的old变量 用subs函数对符号表达式(x+y)2+3(x+y)+5进行替换。
f=sym('(x+y)^2+3*(x+y)+5')
%创建符号表达式
f =
(x+y)^2+3*(x+y)+5
x=5;
f1=subs(f)
%用工作空间的给定值替换x
f1 =
(5+y)^2+20+3*y
f2=subs(f,'x+y','s')
%用s替换x+y
f2 =
((s))^2+3*((s))+5 f3=subs(f,'x+y',5)
%用常数5替换x+y
f3 = 45
f4=subs(f,'x','z')
%用z替换x
f4 =
((z)+y)^2+3*((z)+y)+5
3.3.4 符号数值任意精度控制和运算
在MATLAB的符号运算工具箱(Symbolic Math Toolbox)中共包含3种算术运算: A 数值类型 matlab的浮点算术运算 B 有理数类型 maple的精确符号运算
C vpa类型 maple的任意精度算术运算 1. 浮点运算
例:1/2+1/3 --(定义输出格式format long) ans =
0.83333333333333 2. 符号运算
例:sym(1/2)+(1/3)
ans =
5/6 --精确解 3. 任意精度算术运算
任意精度的VPA型运算可以使用digits和vpa命令来实现。 语法: digits(n) %设定默认的精度
说明:n为所期望的有效位数。digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。当有效位数增加时,计算时间和占用的内存也增加。命令“digits”用来显示默认的有效位数,默认为32位。 语法: S=vpa(s,n) %将s表示为n位有效位数的符号对象
说明:s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。 例 对表达式25π进行任意精度控制的比较。
a=sym('2*sqrt(5)+pi')
a =
2*sqrt(5)+pi digits %显示默认的有效位数
Digits = 32
vpa(a)
%用默认的位数计算并显示
ans =
7.6137286085893726312809907207421 vpa(a,20) %按指定的精度计算并显示
ans =
7.6137286085893726313 digits(15) %改变默认的有效位数 vpa(a) %按digits指定的精度计算并显示
ans =
7.61372860858937
例 用三种运算方式表达式比较2/3的结果。
a1 =2/3
%数值型
a1 =
0.6667
a2 = sym(2/3) %有理数型
a2 = 2/3
a3 =vpa('2/3',32) %VPA型
a3 =
.66666666666666666666666666666667
总结
三种运算方式中数值型运算的速度最快。
有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。 VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。 3.3.5 符号与数值间的转换
1. 将符号表达式转换成数值表达式
将符号表达式转换成数值表达式主要是通过函数numeric或eval来实现 >> p='1+sqrt(2)/2'; >> numeric(p)
ans =
1.7071 >> eval(p)
ans =
1.7071
2. 将数值转换成符号表达式
将数值转换成符号表达式主要是通过函数sym来实现。 >> p=1.7071; >> n=sym(p) n =
17071/10000
3. 符号表达式与多项式的转换
构成多项式的符号表达式f(x)可以与多项式系数构成的行向量进行相互转换,MATLAB提供了函数sym2poly和poly2sym实现相互转换。 (1) sym2poly函数
例3-3 将符号表达式2x+3x2+1转换为行向量。
f=sym('2*x+3*x^2+1')
f =
2*x+3*x^2+1 sym2poly(f)
%转换为按降幂排列的行向量
ans =
3 2 1
f1=sym('a*x^2+b*x+c')
f1 =
a*x^2+b*x+c
注意:只能对含有一个变量的符号表达式进行转换。 (2) poly2sym函数
【例3.12续】将行向量转换为符号表达式。
g=poly2sym([1 3 2])
%默认x为符号变量的符号表达式
g =
x^2+3*x+2
g=poly2sym([1 3 2],sym('y')) %y为符号变量的符号表达式
g =
y^2+3*y+2
3.3.6 求反函数和复合函数
在MATLAB中finverse函数可以求得符号函数的反函数。 语法: finverse(f,v) %对指定自变量v的函数f(v)求反函数
说明:当v省略,则对默认的自由符号变量求反函数。 1. 求反函数
【例3.11】求tex的反函数。
f=sym('t*e^x')
%原函数
f = t*e^x
g=finverse(f)
%对默认自由变量求反函数
g =
log(x/t)/log(e)
g=finverse(f,'t')
%对t求反函数
g =
t/(e^x) syms t
g=finverse(f,t)
2. 求复合函数
【例3.11续】计算tex与ay2+by+c的复合函数。
f=sym('t*e^x'); %创建符号表达式 g=sym('a*y^2+b*y+c'); %创建符号表达式 h1=compose(f,g) %计算f(g(x))
h1 =
t*e^(a*y^2+b*y+c) h2=compose(g,f)
%计算g(f(x))
h2 =
a*t^2*(e^x)^2+b*t*e^x+c h3=compose(f,g,'z')
%计算f(g(z))
h3 =
t*e^(a*z^2+b*z+c)
【例3.11续】计算得出tex与y2的复合函数。
f1=sym('t*e^x'); g1=sym('y^2');
h1=compose(f1,g1)
h1 =
t*e^(y^2)
h2=compose(f1,g1,'z')
%计算f(g(z))
h2 =
t*e^(z^2)
h3=compose(f1,g1,'t','y')
%以t为自变量计算f(g(z))
h3 =
y^2*e^x
3.4 符号矩阵
符号矩阵和符号向量中的元素都是符号表达式。 3.4.1 符号矩阵的生成 1 使用sym
符号矩阵可通过函数sym来生成。符号矩阵的元素是任何不带等号的符号表达式,各符号表达式的长度可以不同;符号矩阵中,以空格或逗号分隔的元素指定的是不同列的元素,而以分号分隔的元素指定的是不同行的元素。
A=sym('[a,b;c,d]')
A =
[ a, b] [ c, d]
syms a b c d A=[a b;c d]
A =
[ a, b] [ c, d]
例3-4比较符号矩阵与字符串矩阵的不同。
A=sym('[a,b;c,d]')
%创建符号矩阵
A =
[ a, b] [ c, d]
B='[a,b;c,d]'
%创建字符串矩阵
B =
[a,b;c,d]
C=sym(B)
%转换为符号矩阵
C =
[ a, b] [ c, d] whos
Name Size Bytes Class
A 2x2 312 sym object B 1x9 18 char array C 2x2 312 sym object
Grand total is 25 elements using 642 bytes
2. 用字符串直接创建矩阵
模仿matlab数值矩阵的创建方法
需保证同一列中各元素字符串有相同的长度 例:A =['[ a,2*b]'; '[3*a, 0]'] A =
[ a, 2*b] [3*a, 0]
3.4.2 符号矩阵的运算
符号矩阵的运算主要包括符号矩阵的一些基本运算以及符号矩阵的常用函数运算。 1. 符号矩阵的四则运算
在MATLAB中,进行符号运算的四则运算非常方便。实际上,它与数值矩阵的四则运算完全相同,这大大地方便了用户的操作。符号表达式的加、减、乘、除运算可分别有函数symadd、symsub、symmul、symdiv来实现,也可与矩阵的数值运算一样,用“+”、“-”、“×”、“÷”符号进行运算,而符号表达式的幂运算也可以由函数sympow来实现,也可以由幂运算符“^”来实现。
2. 符号矩阵的其他一些基本运算
符号矩阵的其他一些基本运算包括符号矩阵的转置、行列式、秩、指数运算等。 (1) 符号矩阵的转置运算
符号矩阵的转置运算由函数transpose来实现。 例 >> A=sym('[cos(x),sin(x);x^2+x+1 tan(x)]'); >> B=transpose(A) B =
[ cos(x), x^2+x+1] [ sin(x), tan(x)]
(2) 符号矩阵的行列式运算
符号的行列式运算由函数determ或det来实现 >> B=determ(A) B =
cos(x)*tan(x)-sin(x)*x^2-sin(x)*x-sin(x)
>> C=det(A) C =
cos(x)*tan(x)-sin(x)*x^2-sin(x)*x-sin(x) (3) 符号矩阵的求逆运算
符号矩阵的求逆运算与数值矩阵的求逆运算一样,由函数inv来实现。 >> D=inv(A) D =
[-tan(x)/(-cos(x)*tan(x)+sin(x)*x^2+sin(x)*x+sin(x)), sin(x)/(-cos(x)*tan(x)+sin(x)*x^2+sin(x)*x+sin(x))]
[(x^2+x+1)/(-cos(x)*tan(x)+sin(x)*x^2+sin(x)*x+sin(x)), -cos(x)/(-cos(x)*tan(x)+sin(x)*x^2+sin(x)*x+sin(x))] (4) 符号矩阵的特征值、特征向量运算
在MATLAB中符号矩阵的特征值、特征向量可通过函数“eig”、“eigensys”来实现。 这两个函数的一般调用形式为 E = eig(X) 返回方阵X的特征值
[V,D] = eig(X) 返回方阵特征值和特征向量矩阵 [V,D] = eigensys(A) 和eig的第二种调用方式相同 >> A=sym('[1,3/2;2 4]'); >> [B C]=eig(A) B =
[ -3/4+1/4*21^(1/2), -3/4-1/4*21^(1/2)]
[ 1, 1] C =
[ 5/2+1/2*21^(1/2), 0] [ 0, 5/2-1/2*21^(1/2)] 3.5 符号微积分
微积分是高等数学中最重要的基础内容之一,它被广泛地应用到许多的工程学科中。MATLAB的符号数学运算工具箱为我们提供了快速、简便的计算微积分的工具。MATLAB符号数学工具箱中的符号微积分包括符号极限、符号微分、符号积分等。 3.5.1 符号极限
极限是高等数学的出发点,同时它也是微积分学的基础。在MATLAB中,符号极限由函数“limit”来实现的。Limit函数的调用格式如下: 表达式 x0函数格式 limt(f) limt(f,x,a) limt(f,x,a, left) limt(f,x,a, right) 说明 对x求趋近于0的极限 对x求趋近于a的极限,当左右极限不相等时极限不存在。 对x求左趋近于a的极限 对x求右趋近于a的极限 limf(x) xalimf(x) limf(x) limf(x) xaxa例3-5分别求1/x在0处从两边趋近、从左边趋近和从右边趋近的三个极限值。
f=sym('1/x')
f = 1/x
limit(f)
%对x求趋近于0的极限
ans = NaN
limit(f,'x',0)
%对x求趋近于0的极限
ans = NaN
limit(f,'x',0,'left') %左趋近于0
ans = -inf
limit(f,'x',0,'right')
%右趋近于0
ans = inf
3.5.2 符号级数
1. symsum函数 语法:
symsum(s,x,a,b) %计算表达式s的级数和
说明:x为自变量,x省略则默认为对自由变量求和;s为符号表达式;[a,b]为参数x的取值范围。
111【例3.17】求级数1222和1+x+x2+„+xk+„的和。
23k syms x k
s1=symsum(1/k^2,1,10)
%计算级数的前10项和
s1 =
1968329/1270080
s2=symsum(1/k^2,1,inf)
%计算级数和
s2 =
1/6*pi^2
s3=symsum(x^k,'k',0,inf)
%计算对k为自变量的级数和
s3 =
-1/(x-1)
2. taylor函数
语法:
taylor (F,x,n) %求泰勒级数展开
说明:x为自变量,F为符号表达式;对F进行泰勒级数展开至n项,参数n省略则默认展开前5项。
111【例3.17续】求ex的泰勒展开式为:1xx2x3xk1。
223k! syms x
s1=taylor(exp(x),8)
%展开前8项
s1 =
1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/720*x^6+1/5040*x^7 s2=taylor(exp(x)) %默认展开前5项
s2 =
1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5
3.5.2 符号微分
微分是高等数学中最基础的内容之一。在MATLAB中,符号微分由函数“diff”来实现的。该函数的一般调用格式为:
diff(s):没有指定变量和导数阶数,则系统按findsym函数指示的默认变量对符号表达式s求一阶导数。
diff(s,'v'):以v为自变量,对符号表达式s求一阶导数。
diff(s,n):按findsym函数指示的默认变量对符号表达式s求n阶导数,n为正整数。 diff(s,'v',n):以v为自变量,对符号表达式s求n阶导数。 例 已知f(x)=ax2+bx+c,求f(x)的微分。
f=sym('a*x^2+b*x+c')
f =
a*x^2+b*x+c
diff(f) %对默认自由变量x求一阶微分
ans = 2*a*x+b
diff(f,'a') %对符号变量a求一阶微分
ans = x^2
diff(f,'x',2) %对符号变量x求二阶微分
ans = 2*a
diff(f,3) %对默认自由变量x求三阶微分
ans = 0
微分函数diff也可以用于符号矩阵,其结果是对矩阵的每一个元素进行微分运算。 2xt2例 对符号矩阵求微分。 xtsin(x)esyms t x
g=[2*x t^2;t*sin(x) exp(x)] %创建符号矩阵
g =
[ 2*x, t^2] [ t*sin(x), exp(x)] diff(g) %对默认自由变量x求一阶微分
ans =
[ 2, 0] [ t*cos(x), exp(x)] diff(g,'t')
%对符号变量t求一阶微分
ans =
[ 0, 2*t] [ sin(x), 0] diff(g,2)
%对默认自由变量x求二阶微分
ans =
[ 0, 0] [ -t*sin(x), exp(x)]
diff还可以用于对数组中的元素进行逐项求差值。 例 可以使用diff计算向量间元素的差值。
x1=0:0.5:2; y1=sin(x1)
y1 =
0 0.4794 0.8415 0.9975 0.9093 diff(y1) %计算元素差
ans =
0.4794 0.3620 0.1560 -0.0882
3.5.3 符号积分 由高等数学可知,积分比微分复杂的多。在很多情况下,积分不一定能成功。当在MATLAB中进行符号积分,找不到原函数时,它将返回未经计算的命令。符号积分由函数“int”的调用格式如下所示:
int(f) %对findsym函数返回的独立变量求不定积分,f为符号表达式 int(f,’t’) %求符号变量t的不定积分 int(f,’t’,a,b) %求符号变量t的积分 int(f,’t’,’m’,’n’) %求符号变量t的积分
说明:t为符号变量,当t省略则为默认自由变量;a和b为数值,[a,b]为积分区间;m和n为符号对象,[m,n]为积分区间 例 求积分cos(x)和
cos(x) 。
f=sym('cos(x)'); int(f) %求不定积分
ans = sin(x)
int(f,0,pi/3) %求定积分
ans =
1/2*3^(1/2)
int(f,'a','b') %求定积分
ans =
sin(b)-sin(a) int(int(f))
%求多重积分
ans = -cos(x)
diff和int命令,也可以直接对字符串f进行运算:
f='cos(x)';
2xt2例 求符号矩阵的积分。 xtsin(x)e syms t x
g=[2*x t^2;t*sin(x) exp(x)] %创建符号矩阵
g =
[ 2*x, t^2] [ t*sin(x), exp(x)] int(g) %对x求不定积分
ans =
[ x^2, t^2*x] [ -t*cos(x), exp(x)] int(g,'t') %对t求不定积分
ans =
[ 2*x*t, 1/3*t^3] [ 1/2*t^2*sin(x), exp(x)*t]
int(g,sym('a'),sym('b')) %对x求定积分
ans =
[ b^2-a^2, t^2*(b-a)]
[ -t*cos(b)+t*cos(a), exp(b)-exp(a)]
3.6 积分变换
常见的积分变换有傅立叶变换,拉普拉斯变换和Z变换。 3.6.1 傅立叶变换
fourier变换和反变换可以利用积分函数int来实现,也可以直接使用fourier或ifourier函数实现。
1. 使用fourier函数
fourier的一般调用形式为 F=fourier(f,t ,w) %求时域函数f(t)的fourier变换F
说明:返回结果F是符号变量w的函数,当参数w省略,默认返回结果为w的函数;f为t的函数,当参数t省略,默认自由变量为x。 2. 使用ifourier
ifourier主要用于求傅立叶逆变换,它的一般调用形式为 f=ifourier (F) %求频域函数F的fourier反变换f(t) f=ifourier (F,w,t)
说明:ifourier函数的用法与fourier函数相同。
例 计算f(t)=
1的fourier变换F以及F的fourier反变换。 t%fourier变换
syms t w
F=fourier(1/t,t,w)
F =
i*pi*(Heaviside(-w)-Heaviside(w)) f=ifourier(F,t) %fourier反变换
f = 1/t
f=ifourier(F)
%fourier反变换默认x为自变量
f = 1/x
3.6.2 拉普拉斯变换 1. 拉普拉斯正变换
MATLAB中拉普拉斯变换可用函数laplace实现,一般调用格式为 F=laplace(f,t,s) %求时域函数f的Laplace变换F
说明:返回结果F为s的函数,当参数s省略,返回结果F默认为's'的函数;f为t的函数,当参数t省略,默认自由变量为't'。 例 求sin(at)和阶跃函数的Laplace变换。
syms a t s
F1=laplace(sin(a*t),t,s)
%求sinat的Laplace变换
F1 =
a/(s^2+a^2)
F2=laplace(sym('Heaviside(t)')) %求阶跃函数的Laplace变换
F2 = 1/s
2. Laplace逆变换 语法: f=ilaplace(F,s,t) 例 求
%求F的Laplace反变换f
1和1的Laplace反变换。 sa syms s a t
f1=ilaplace(1/(s+a),s,t) %求1/s+a的Laplace反变换
f1 =
exp(-a*t)
f2=ilaplace(1,s,t)
%求1的Laplace反变换是脉冲函数
f2 =
Dirac(t)
3.6.3 Z变换 1.Z变换
MATLAB中主要用ztrans函数进行Z变换
语法:
F=ztrans(f,n, z) %求时域序列f的Z变换F
说明:返回结果F是以符号变量z为自变量;当参数n省略,默认自变量为'n';当参数z省略,返回结果默认为'z'的函数。
例 求阶跃函数、脉冲函数和e-at的Z变换。
syms a n z t
Fz1=ztrans(sym('Heaviside(t)'),n,z) %求阶跃函数的Z变换
Fz1 =
Heaviside(t)*z/(z-1)
Fz2=ztrans(sym('Dirac(t)'),n,z)
%求脉冲函数的Z变换
Fz2 =
Dirac(t)*z/(z-1)
Fz3=ztrans(exp(-a*t),n,z)
%求e-at的Z变换
Fz3 =
exp(-a*t)*z/(z-1)
2. Z逆变换
iztrans函数用于求逆变换
语法:
f=iztrans(F,z,n) %求F的z反变换f 例 用Z反变换验算阶跃函数、脉冲函数和e-at的Z变换。
syms n z t
f1=iztrans(Fz1,z,n)
f1 =
Heaviside(t)
f2=iztrans(Fz2,z,n)
f2 =
Dirac(t)
f3=iztrans(Fz3,z,n)
f3 =
exp(-a*t)
3.7 符号方程的求解
3.7.1 符号代数方程的求解
在MATLAB中,求解用符号表达式表示的代数方程可由函数solve实现,其调用格式为: solve(s):求解符号表达式s的代数方程,求解变量为默认变量。 solve(s,v):求解符号表达式s的代数方程,求解变量为v。
solve(s1,s2,…,sn,v1,v2,…,vn):求解符号表达式s1,s2,…,sn组成的代数方程组,求解变量分别v1,v2,…,vn。
说明:s可以是含等号的符号表达式的方程,也可以是不含等号的符号表达式,但所指的仍是令s=0的方程;当参数v省略时,默认为方程中的自由变量;其输出结果为结构数组类型。
求方程ax2+bx+c=0和sinx=0的解。
f1=sym('a*x^2+b*x+c')
%无等号
f1 =
a*x^2+b*x+c solve(f1)
%求方程的解x
ans =
[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))] [ 1/2/a*(-b-(b^2-4*a*c)^(1/2))] f2=sym('sin(x)')
f2 = sin(x)
solve(f2,'x')
ans = 0
x22x10例 求三元非线性方程组x3z4的解。
y*z1 eq1=sym('x^2+2*x+1'); eq2=sym('x+3*z=4'); eq3=sym('y*z=-1');
[x,y,z]=solve(eq1,eq2,eq3)
%解方程组并赋值给x,y,z
x = -1 y = -3/5 z = 5/3
3.7.2 符号常微分方程
MATLAB提供了dsolve命令可以用于对符号常微分方程进行求解。 语法:
dsolve(‘eq’,’con’,’v’) %求解微分方程 dsolve(‘eq1,eq2…’,’con1,con2…’,’v1,v2…’) %求解微分方程组
说明:’eq’为微分方程;’con’是微分初始条件,可省略;’v’为指定自由变量,省略时则默认为x或t为自由变量;输出结果为结构数组类型。
当y是因变量时,微分方程’eq’的表述规定为:
y的一阶导数y的n阶导数
dydy或表示为Dy; dxdtdnydxn或
dnydtn表示为Dny。
微分初始条件'con'应写成'y(a)=b,Dy(c)=d'的格式;当初始条件少于微分方程数时,
在所得解中将出现任意常数符C1,C2„„,解中任意常数符的数目等于所缺少的初始条件数。
例 求微分方程x
d2ydx2 y=dsolve('x*D2y-3*Dy=x^2','x')
3dyx2,y(1)=0,y(5)=0的解。 dx %求微分方程的通解
y =
-1/3*x^3+C1+C2*x^4
y=dsolve('x*D2y-3*Dy=x^2','y(1)=0,y(5)=0','x') %求微分方程的特解
y =
-1/3*x^3+125/468+31/468*x^4
例 求微分方程组
dxdyy,x的解。 dtdt [x,y]=dsolve('Dx=y,Dy=-x')
x =
cos(t)*C1+sin(t)*C2 y =
-sin(t)*C1+cos(t)*C2
因篇幅问题不能全部显示,请点此查看更多更全内容