8.1.1建立符号对象
(1)、sym():用于创建单个符号变量。
x = sym(\'a\')
符号变量与数值变量的差别
>> a = sym(\'a\'); %定义符号变量a >> w = a^3 + 3*a + 10 %符号运算 w = a^3 + 3*a + 10 >> x = 5; %定义数值变量x >> w = x^3 + 3*x + 10 %数值运算 w = 150
建立符号变量可以指定该变量所属集合
x = sym(\'x\',set) %set可取值为\'real\'、\'integer\'、\'positive\' 或\'rational\'。 %取消符号变量所属集合 x = sym(\'x\',\'clear\') %sym函数建立符号数组 A=(\'x\',[n1,n2,n3,...,nm])
sym函数可以将常量、向量、矩阵转化为符号对象
x = sym(\'Num\',flag) %Num可以是常量、向量或矩阵,选项flag用于指定将浮点数转换为符号对象时所采用的方法,可取值有\'r\'、\'d\'、\'e\'和\'f\', %分别代表将Num转换为有理式、十进制数、带估计误差的有理式、与精确值对应的分式,默认为‘r’。 %列如 >> x1 = sym(pi) x1 = pi >> x2 = sym(pi,\'e\') x2 = pi - (198*eps)/359
符号对象与数值量在代数运算时的差别: 用符号对象进行计算更像在进行数学演算,所得到的结果是精确的数学表达式。
>> p1=sym(pi);a=sym(4); % 定义符号变量p1、a >> c1=cos((a+10)^2)-sin(p1/4) % 符号计算 c1 = cos(196) - 2^(1/2)/2 >> p2=pi; x=4; % 定义数值变量p2、x >> c2=cos((x+10)^2)-sin(p2/4) % 数值计算 c2 = -0.3646
(2)、1. sym函数一次只能定义一个符号变量, syms函数一次可以定义多个符号变量。
syms a b c d
建立符号变量可以指定该变量所属集合
x = sym( a, b , c, set) %set可取值为\'real\'、\'integer\'、\'positive\' 或\'rational\'。
2.建立符号表达式
(1)使用已经定义的符号变量组成符号表达式。例如:
>> syms x y; >> f=3x^2-5y+2xy+6 f = 3x^2 + 2yx - 5y + 6 >> F=cos(x^2)-sin(2*x)==0 F = cos(x^2) - sin(2*x) == 0
(2)用sym函数将MATLAB的匿名函数转换为符号表达式
>> fexpr=sym(@(x)(sin(x)+cos(x))) fexpr = cos(x) + sin(x)
(3)用str2sym函数将字符串转换为符号表达式
>> fx=str2sym(\'cos(x)+sin(x)\')
3
(1)使用已经定义的符号变量定义符号函数。
>> syms x y; >> f(x, y) = 3x^2-5y+2xy+6 f(x, y) = 3x^2 + 2yx - 5y + 6
(2)用syms函数定义符号函数,然后构造该符号函数所对应的表达式。
>> syms f(t) fxy(x, y) >> f(t)= t^2 + 1 f(t) = t^2 + 1 >> f(x,y)= 3x^2-5y+2xy+6 f(x, y) = 3x^2 + 2yx - 5y + 6
(3)用symfun函数建立符号函数。
f = symfun(formula,inputs) %formula为符号表达式或者由符号表达式构成的向量、矩阵,inputs指定符号函数f的自变量。例如: >> syms x y >> f=symfun(3x^2-5y+2xy+6, [x y]) f(x, y) = 3x^2 + 2yx - 5y + 6
8.1.2 符号表达式中自变量的确定
symvar函数用于获取符号表达式中的自变量。调用格式为
symvar(s)
symvar(s,n)
返回s中的n个符号变量,默认返回s
>> syms x a y z b; >> s1=3*x+y; s2=a*y+b; >> symvar(s1) ans = [ x, y] >> symvar(s1+s2) ans = [ a, b, x, y]
>> syms a b w y z >> f(a,b)=a*z+b*w,2; %定义符号函数 >> symvar(f, 3) ans = [ a, b, w] >> ff=a*z+b*w; %定义符号表达式 >> symvar(ff, 3) ans = [ w, z, b] >> h=sym([3*b/2, (2*x+1)/3; a/x+b/y, 3*x+4]); >> symvar(h,1) ans = x
8.1.3符号对象的算术运算
1、符号对象的四则运算
>> x= sym(\'x\'); >> f= 2*x^2+3*x-5; >> g= x^2-x+7; >> fsym= f+g %或 fsym= plus(f, g) fsym= 3*x^2 + 2*x + 2 >> gsym= f^g gsym= (2*x^2 + 3*x - 5)^ (x^2 - x + 7)
注意:
2.提取符号表达式的分子和分母
[n,d]=numden(s) :n与d的分别用于返回表达式s的分子和分母。
注意: 对于符号矩阵,numden返回分子矩阵n,分母矩阵d
>> [n,d]=numden(sym(10/33)) n = 10 d = 33 >> syms a b x >> [n,d]= numden(a*x^2/(b+x)) n= a*x^2 d= b + x
3.符号表达式的因式分解、展开与合并
(1)factor函数用于分解因式。基本调用格式为:
factor(s) 若参数s是一个整数,函数返回s的所有素数因子;若s是一个符号对象,函数返回由s
>> F = factor(823429252) %对整数分解因子 F = 2 2 59 283 12329 >> F = factor(sym(823429252)) %对符号常量分解因子 F = [ 2, 2, 59, 283, 12329] %返回的因子构成一个向量 >> syms x y; >> s1=x^3-y^3; >> factor(s1) %对s1分解因式 ans = [ x - y, x^2 + x*y + y^2]
(2)expand函数:用于将符号表达式展开成多项式。
expand(S,Name,Value)
ArithmeticOnly 或者为 IgnoreAanlyConstraints ,
>> syms x y >> s2=(-7*x^2-8*y^2)*(-x^2+3*y^2); >> expand(s2) %对s2展开 ans = 7*x^4 - 13*x^2*y^2 - 24*y^4 >> expand(cos(x+y)) ans = cos(x)*cos(y) - sin(x)*sin(y) >> expand(cos(x+y),\'ArithmeticOnly\', true) ans = cos(x + y)
(3)collect函数:用于合并同类项。
collect(P,v) :以v为自变量,对符号对象P按v
>> syms x y >> s3=(x+2*y)*(x^2+y^2+1) >> collect(s3) %默认以x为自变量,对s3按x合并同类项 ans = x^3 + (2*y)*x^2 + (y^2 + 1)*x + 2*y*(y^2 + 1) >> collect(s3,y) %以y为自变量,对s3按y合并同类项 ans = 2*y^3 + x*y^2 + (2*x^2 + 2)*y + x*(x^2 + 1)
4.符号表达式系数的提取
coeffs函数提取符号表达式中的系数。调用格式为
C = coeffs(p) :以默认方式确定符号表达式的自变量,按升幂顺序返回符号表达式p各项的系数
[C,T] = coeffs(p,var) :
>> syms x y >> s = 5*x*y^3 + 3*x^2*y^2 + 2*y + 1; >> coeffs(s) %求各项系数,按所有变量的升幂排列 ans = [ 1, 2, 3, 5] >> coeffs(s,x) %按x的升幂排列 [ 2*y + 1, 5*y^3, 3*y^2] >> coeffs(s,y) %按y的升幂排列,返回变量y的系数 [ 1, 2, 3*x^2, 5*x] >> coeffs(s,[x,y]) ans = [ 1, 2, 5, 3]
5**.符号表达式的化简**
simplify(s,Name,Value) :
对s
>> syms x; >> s= (x^2+5*x+6)/(x+2); >> simplify(s) ans= x + 3 >> s= [2*cos(x)^2-sin(x)^2,sqrt(16)]; >> simplify(s) ans = [ 2 - 3*sin(x)^2, 4]
6**.符号对象与数之间的转换**
>> a = sym(2*sqrt(2)); >> b = sym((1-sqrt(3))^2); >> T = [a, b; a*b, b/a]; >> R1=double(T) %R1为数值矩阵 R1 = 2.8284 0.5359 1.5157 0.1895 >> R2 = vpa(T,10) %R2为符号矩阵 R2 = [ 2.828427125, 0.5358983849] [ 1.515749528, 0.189468691]
7**.指定符号对象的值域**
在进行符号对象的运算前,可用assume函数设置符号对象的值域。
assume(condition)
assume(expr, set)
第1种格式指定变量满足条件condition,第2种格式指定表达式expr属于集合set,set的可取值有\'integer\'、\'rational\'、\'real\'和\'positive\',分别表示整数、有理数、实数和正数。
>> syms x >> assume(x < 0) >> abs(x) ans = -x >> assume(x,\'positive\') >> abs(x) ans = x
8.1.4 符号对象的关系运算
1**.关系运算**
>> syms x y a b c d; >> A=[a*x,x*y; y/b,y^3]; >> B=[a,b; c,d]; >> x+y<=100 ans = x + y <= 100 >> A~=B*2 ans = [ a*x ~= 2*a, x*y ~= 2*b] [ y/b ~= 2*c, y^3 ~= 2*d]
2**.** piecewise**函数**
用于定义分段函数的符号表达式。调用格式如下:
pw = piecewise(cond1,val1,cond2,val2,..., condn,valn)
cond1、cond2、......表示条件,val1、val2、、......表示值。当条件cond1成立时,pw的值是val1;当条件cond2成立时,pw的值是val2。
2**.** piecewise**函数**
用于定义分段函数的符号表达式。调用格式如下:
pw = piecewise(cond1,val1,cond2,val2,..., condn,valn)
cond1、cond2、......表示条件,val1、val2、、......表示值。当条件cond1成立时,pw的值是val1;当条件cond2成立时,pw的值是val2。
>> syms x >> y=piecewise(x>0,sqrt(x),x<0,x*x,x==0,1) y = piecewise(0 < x, x^(1/2), x < 0, x^2, x == 0, 1)
2**.** piecewise**函数**
用于定义分段函数的符号表达式。调用格式如下:
pw = piecewise(cond1,val1,cond2,val2,..., condn,valn)
cond1、cond2、......表示条件,val1、val2、、......表示值。当条件cond1成立时,pw的值是val1;当条件cond2成立时,pw的值是val2。
>> syms x >> isequaln(abs(x), x) ans = logical 0 >> assume(x > 0) >> isequaln(abs(x), sqrt(x*x), x) ans = logical 1
8.1.5 符号对象的逻辑运算
1.基本逻辑运算
4个逻辑运算函数and(与)、or(或)、xor(异或)、not(非)以及3个逻辑运算符&(与)、|(或)、~(非)也可用于符号对象。
>> syms x >> y=x>0 & x<10 %或 y=and(x>0 , x<10) y = 0 < x & x < 10
all函数用于检测符号矩阵中各个元素是否都是有效的符号表达式
2.其他逻辑运算
fold函数,用于组合逻辑表达式。fold函数的调用格式如下:
fold(@fun,v)
fun是逻辑运算函数,v是一个由符号表达式组成的向量。
>> syms a b c >> fold(@and, [a<b+c, b<a+c, c<a+b]) ans = a < b + c & b < a + c & c < a +
8.2.1 符号极限
求符号表达式极限的函数是limit,调用格式如下。
limit(f, var, a, direction)
计算当自变量var趋近于常数a时,符号表达式f的极限值。
选项var缺省时,按默认方式确定自变量。
选项a缺省时,求自变量趋近于0时,表达式f的极限值。
选项direction用于指定趋近的方向,\'right\'表示自变量从右边趋近于a,\'left\'表示自变量从左边趋近于a
>> syms x h t >> limit((sin(x+h)-sin(x))/h, h, 0) %极限1 ans = cos(x) >> limit((1+t/x)^x,inf) %极限2 ans = exp(t) >> limit(x*(sqrt(x^2+1)-x),x,inf,\'left\') %极限3 ans = 1/2 >> limit(cot(x)^(1/log(x)),x,0,\'right\') %极限4 ans = exp(-1)
8.2.2 符号导数
diff函数用于对符号表达式和符号函数求导,调用格式如下。
diff(F,var,n)
F是符号表达式或符号函数
选项var指定自变量,缺省时,按默认规则确定自变量;
选项n指定求n阶导数,默认为1,即求一阶导数。
对多个自变量的求导,可以使用以下格式:
%求(1) >> syms x; >> diff(cos(x*x)) ans = -2*x*sin(x^2) >> diff(cos(x*x),x,2) %求对x的二阶导数 ans = - 2*sin(x^2) - 4*x^2*cos(x^2) >> diff(cos(x*x),x,3) %求对x的三阶导数 ans = 8*x^3*sin(x^2) - 12*x*cos(x^2) %求(2) >> syms a b t >> fx=a*(t-sin(t)); >> fy=b*(1-cos(t)); >> diff(fy,t)/diff(fx,t) %求对x的一阶导数 ans = -(b*sin(t))/(a*(cos(t) - 1)) %求(3) >> syms x y >> diff(x^6-3*y^4+2*x^2*y^2,x) %求对x的偏导数 ans = 6*x^5 + 4*x*y^2 >> diff(x^6-3*y^4+2*x^2*y^2,y) %求对y的偏导数 ans = 4*x^2*y - 12*y^3 >> diff(x^6-3*y^4+2*x^2*y^2,x,y) ans = 8*x*y
8.2.3 符号积分
(1)求不定积分
int(expr, v)
以v为自变量,对符号表达式expr求不定积分。
(2)求定积分
int(expr, v, a, b) 或 int(expr, v, [a, b])
以v为自变量,对符号表达式expr求定积分。a、b分别表示定积分的下限和上限。当表达式s关于变量x在闭区间[a,b]上可积时,函数返回一个定积分结果。当a、b中有一个是inf时,函数返回一个广义积分。当a、b
>> syms x a b %求(1) >> f= 1/(1+x^2); >> f1=int(1/(1+x^2)) %求不定积分 f1 = atan(x) %求(2) >> f2=int(1/(1+x^2),a,b) %求定积分 f2 = atan(b) - atan(a) %求(3) >> f3=int(1/(1+x^2),1,2) %求定积分 f3 = atan(2) - pi/4 >> eval(f3) %计算积分值 ans = 0.3218
>> syms x y >> f1=int(x+y, x, y^2/2, 12-y) f1 = -((y - 4)*(y + 6)*(y^2 + 2*y + 24))/8 >> ff1=int(f1, y, -6, 4) ff1 = 1750/3 >> f2=int(x+y, x, y^2/2, 4-y) f2 = -((y - 2)*(y + 4)*(y^2 + 2*y + 8))/8 >> ff2=int(f2, y, -4, 2) ff2 = 198/5 >> f=ff1-ff2 f = 8156/15
【例8.5】求 ,其中D是由xy平面上曲线y^2=2x绕x轴旋转而成的曲面与平面x=5所围封闭区域,如图所示
>> syms r x theta >> f=int(int(int(r*r,x,r*r/2,5),r,0,sqrt(10)),theta,0,2*pi) f = (40*pi*10^(1/2))/3
函数symsum,用于无穷级数求和,其调用格式为:
symsum(f,v,a,b)
其中,f表示一个级数的通项。选项v指定自变量,v省略时,按默认规则确定自变量。选项a和b
>> syms n k x; %求(1) >> s=symsum((-1)^(n+1)/n,1,inf) s= log(2) >> eval(s) ans = 0.6931 %求(2), factorial是求阶乘的函数 >> symsum(x^k/factorial(k),k,1,inf) ans = exp(x) - 1
8.3.2 函数的泰勒级数
taylor(f,v,a,Name,Value)
a指定将函数f在自变量v = a处展开,a默认为0。
v缺省时,按默认规则确定自变量。
选项Name和Value成对使用,用于设置运算过程的属性。Name有3个可取值:
•\'ExpansionPoint\':指定展开点,对应值为标量或向量。展开点默认为0。
•\'Order\':指定截断阶,对应值为一个正整数。默认截断阶为6,即展开式的最高阶为5。
•\'OrderMode\':指定展开式采用绝对阶或相对阶,对应值为\'Absolute\' 或\'Relative\',默认为\'Absolute\'。
【例8.7】求函数在指定点的泰勒级数展开式。
(1)求在x = 0处的泰勒级数展开式。
>> syms x %求(1) >> taylor(log(x+sqrt(x*x+1))) ans = (3*x^5)/40 - x^3/6 + x %求(2) >> taylor((1+2*x+3*x^x)/(1-2*x-3*x^x),x,1,\'Order\', 5) ans = (5*x)/8 - (13*(x-1)^2)/32 + (29*(x-1)^3)/128 - (45*(x-1)^4)/512 - 17/8
8.4.1 符号代数方程求解
求解用符号表达式表示的代数方程可由函数solve实现,其调用格式如下。
Y = solve(s,v, Name,Value)
Y = solve(s1,s2, …,sn,v1,v2,…,vn)
[y1,y2,...,yn] = solve([s1,s2, …,sn],[v1,v2,…,vn])
第1种格式求解符号表达式s的代数方程,求解变量为v。v缺省时,按默认规则确定自变量;
第2、3种格式求解符号表达式s1,s2,…,sn组成的代数方程组,自变量分别为v1,v2,…,v**n。
>> syms x %解方程(1) >> y=solve(x-(x^3-4*x-7)^(1/3)==1,x) y = 3 %解方程(2) >> sx = solve(sin(x)==1,x) sx = pi/2 要得到方程(2)的完全解,则使用以下命令: >> [solx, params, conds]=solve(sin(x)==1, x, \'ReturnConditions\', true) solx = pi/2 + 2*pi*k params = k conds = in(k, \'integer\')
8.4.2 符号常微分方程求解
通过函数dsolve求解,调用格式为
S = dsolve(eqn,cond)
求解常微分方程eqn在初值条件cond下的特解。若没有给出初值条件cond,则求方程的通解。eqn可以是符号等式或由符号等式组成的向量。
要改变求解过程的参数,函数的调用格式为:
S = dsolve(e,c,Name,Value)
Name和Value成对使用,用于设置求解过程的参数
例如求解微分方程dy/dx=y+1的命令如下:
>> syms y(x)
>> dsolve(diff(y)==y+1)
ans =
%解方程(1) >> syms y(t) >> y1=dsolve(diff(y,t)==(t^2+y^2)/t^2/2) y1 = t -t*(1/(C3 + log(t)/2) - 1) %解方程(2) >> syms y(x) a >> y2=dsolve(diff(y,x)==a*y, y(0)==5) y2 = 5*exp(a*x)
%解方程(3) >> syms f(x) >> y3=dsolve(x*diff(y,x,2)-3*diff(y,x)==x^2, y(1)==0, y(5)==0) y3 = (31*x^4)/468 - x^3/3 + 125/468 %解方程组(4) >> syms x(t) y(t) >> [x,y]=dsolve(diff(x,t)==4*x-2*y, diff(y,t)==2*x-y) x = C11/2 + 2*C10*exp(3*t) y = C11 + C10*exp(3*t)
8.5 符号计算的可视化分析
1.funtool
是一个可视化符号计算器,提供了一些常用的符号运算工具
在命令行窗口输入funtool命令,会打开一个funtool计算器窗口和两个图形窗口。
funtool计算器窗口上半部面板中的f和g编辑框用于编辑参与运算的符号表达式,x编辑框用于设置符号表达式f和g的自变量的值域,a编辑框用于编辑表达式f的常因子。
用于将自变量为x的符号表达式f展开为泰勒级数,并以图形化的方式展现计算时的逼近过程。
在命令行窗口输入taylortool命令,会打开一个Taylor Tool窗口
请发表评论