matlab_第八章章符号计算

Posted bujilangzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab_第八章章符号计算相关的知识,希望对你有一定的参考价值。

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.提取符号表达式的分子和分母

numden函数来提取符号表达式中的分子或分母。其一般调用格式为:

 [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)

S是符号表达式或符号矩阵;选项Name用于设置展开方式,ArithmeticOnly 或者为 IgnoreAanlyConstraints , Value为Name的值,可取值有true和false,默认为false。

expand(S,ArithmeticOnly,true):  指定展开多项式时不展开三角函数,双曲线函数,对数函数。

expand(S,IgnoreAanlyConstraints,true):指定展开多项式时应用纯代数简化方法。  

>> 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为自变量,对符号对象Pv合并同类项,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)  :第2种格式指定以var为自变量。按升幂顺序返回符号表达式p各项的系数,T返回C中各系数的对应项。

>> 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进行代数化简。如果s是一个符号向量或符号矩阵,则化简s的每一个元素。Name:指定化简过程的属性。Value:为该属性的取值。

属性

>> 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**.符号对象与数之间的转换**

(1)符号对象转换为基本数据类型

R=vpa(A,d):   按d为指定精度计算符号常量表达式A的值。并转化为符号常量。

>> 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**.关系运算**

6种关系运算符<、<=、>、>=、= =、~=和对应的关系运算函数lt、le、gt、ge、eq、ne也可用于符号对象。

 

>> 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函数用于检测符号矩阵中各个元素是否都是有效的符号表达式

any函数用于检测符号矩阵中是否至少有一个元素是有效的符号表达式。

 

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

【例8.1】求下列极限。

 技术图片

 

 

 

>> 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,即求一阶导数。

对多个自变量的求导,可以使用以下格式:

diff(F,var1,...,varN)

 【例8.2】求下列函数的导数。

技术图片

 

%求(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求定积分。ab分别表示定积分的下限和上限。当表达式s关于变量x在闭区间[ab]上可积时,函数返回一个定积分结果。当ab中有一个是inf时,函数返回一个广义积分。当ab中有一个符号表达式时,函数返回一个符号函数。

【例8.3】分别求下列积分

技术图片

 

>> 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

 

 【例8.4】求图8.1中曲边梯形D的面积,其中D是由曲线y^2=2x和直线x+y=4、直线x+y=12所围封闭区域。

技术图片

>> 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

  

8.3.1 级数符号求和

函数symsum,用于无穷级数求和,其调用格式为:

symsum(f,v,a,b)

其中,f表示一个级数的通项。选项v指定自变量,v省略时,按默认规则确定自变量。选项ab指定求和的下限和上限,缺省时,symsum函数返回不定积分

【例8.6】求下列级数之和。

技术图片

 

 

 

>> 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函数将函数展开为幂级数,调用格式为

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处的泰勒级数展开式。

(2)将技术图片在x = 1处的5阶展开式。

>> 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

选项Name和Value成对使用,用于设置求解过程的参数

【例8.8】求解下列方程

 

 技术图片

 

>> 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 =

C4*exp(x) - 1

结果中的C1、C2、…代表任意常数。

 

 【例8.10】求下列微分方程的解。

 技术图片

 

%解方程(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)

  【例8.10】求下列微分方程的解。

 技术图片

 

 

%解方程(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的常因子。

下半部的控制面板中的按钮用于符号表达式f的转换和多种符号计算。

2.taylortool

用于将自变量为x的符号表达式f展开为泰勒级数,并以图形化的方式展现计算时的逼近过程。

在命令行窗口输入taylortool命令,会打开一个Taylor Tool窗口

窗口下部的编辑器用于输入原函数、修改计算参数、自变量的值域。

技术图片

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于matlab_第八章章符号计算的主要内容,如果未能解决你的问题,请参考以下文章

matlab 符号计算 求空间曲线长度

Fortran & Matlab 链接——未定义的符号

MATLAB符号运算

《程序员代码面试指南》第八章 数组和矩阵问题 计算数组的小和

[matlab] 5.字符运算与微积分

MATLAB mex - 未定义符号 _max