前言:
在MATLAB中,数值与符号的主要区别在于它们的处理方式和应用场景
- 数值计算适用于实际的数值计算问题,如矩阵运算、数据分析等。
- 符号计算适用于符号推导、公式化简和符号解析,如理论物理和工程计算。
01 符号对象
1.基本符号对象:
++定义++基本符号,格式:
Matlab
sym('x') %定义符号变量x
Matlab
syms x y z
前者每次只能定义一个符号对象,且用单引号' '引上;
后者可以同时定义多个符号对象,各对象间用空格分隔。
对于符号常量,定义时还可指定符号量的具体表示格式,如d十进制、f浮点数、r有理数等等,默认时为有理数格式。如:
Matlab
sym('y','real') %定义实型符号变量y
syms b c unreal %定义非实符号变量b和c
2.符号表达式:
- 符号表达式可sym或syms构建。
Matlab
创建符号表达式:
f1=sym('x^2-x*sin(x)+exp(x)')
f1 =
x^2-x*sin(x)+exp(x)
不同的是,sym像定义基本符号对象一样来定义符号表达式,
而syms是先定义表达式中涉及的基本符号对象,再输入表达式。
- 符号方程式是含有等号的符号表达式,只能由sym指令来构建。
Matlab
>> sym('x^2-2*x*y=0')
ans =
x^2-2*x*y=0
- 查找表达式中的符号变量
用函数findsym来寻找符号变量,其调用格式为:
Matlab
查找表达式中的变量:
>> syms a b c x
>> f=a*x^2+b*x+c;
>> findsym(f)
ans =
a, b, c, x
另外还有:
>> findsym(f,2) %返回表达式f中靠近x的2个变量,包括x本身。
ans =
x,c
>> findsym(f,4)
ans =
x,c,b,a
注意:在使用函数findsym时,认为大写字母离x的距离总大于所有小写字母离x的距离
符号表达式的四则运算:
数值表达式一样,可以进行加减、乘除运算,得到的结果仍然是符号型的
Matlab
>>syms x y
>> f1=x^2+x*y+1;
>> f2=y^2+x*y+1;
>> f3=f1+f2,f4=f1-f2,f5=f1*f2,f6=f1/f2,f7=f1\f2
符号表达式的因式分解:
利用函数factor(s)实现:符号表达式s可以是正整数、数值数组或符号表达式数组
例如:
将函数f (x )=2x 4-5x 3+4x 2-5x+2进行因式分解:
Matlab
>> f=sym('2*x^4-5*x^3+4*x^2-5*x+2');
>> F1=factor(f)
F1 =
(x-2)*(2*x-1)*(x^2+1)
合并同类项:
利用函数collect,其调用格式为:
collect(s):按默认变量x对符号表达式s合并同类项;
Matlab
f=-2*x^2*cos(x)-x^2);
>>f1=collect(f)
f1 =
(-2*cos(x)-1)*x^2
collect(s,v):按变量v对符号表达式s合并同类项
Matlab
f=x^3-2*x^2*cos(x)-x^2+y*cos(x)-2*y;
>> f2=collect(f,cos(x))
f2 =
(-2*x^2+y)*cos(x)+x^3-x^2-2*y
多项式展开:
利用函数expand(s)来展开符号表达式s
Matlab
f3=expand(exp((x+y)^2))
f3 =
exp(x^2)*exp(x*y)^2*exp(y^2)
符号表达式的化简:
simplify函数:利用Maple化简规则得到符号表达式的最简结果。
simple函数:尝试用不同的化简方法对表达式进行化简,返回最简形式。
有3种调用格式:
simple(s):显示通过各种化简方法得到的化简结果,并返回其中最简的一个。 r=simple(s):不显示中间的化简结果,仅返回最简的一个结果。
[r how]=simple(s):返回最简的结果和化简方法。
例如:
利用simplify函数化简符号表达式:
Matlab
syms x y
>> s=sin(x)^4-cos(x)^4;
>> f1=simplify(s)
f1 =
1-2*cos(x)^2
利用simple函数化简符号表达式:
Matlab
>> f=simple(s) %直接返回其中最简的结果
f =
-1+cos(x)^2
符号表达式的通分:
利用函数numden 可将符号表达式化简为有理式,提取出其分子和分母
[n,d]=numden(s):返回符号表达式s的分子n和分母d。其中s还可以是符号矩阵
Matlab
>> [n1,d1]=numden(sym(4/5))
n1 = 4
d1 = 5
3.符号方程的求解
利用solve函数,用于求解代数方程(组),调用格式:
g = solve(eq):求自变量为默认自变量的代数方程eq=0。
g = solve(eq,v):求自变量为指定变量v的代数方程eq=0。
g = solve(eq1,eq2,...,eqn):求n个代数方程eq1=0、eq2=0、...、eqn=0组成的方程组,自变量为这n个代数方程的默认自变量。
g = solve(eq1,eq2,...,eqn,v1,v2,...,vn):求n个代数方程eq1=0、eq2=0、...、eqn=0组成的方程组,自变量为n个指定变量v1、...、vn。
注意,当方程(组)不存在符号解时,又没有其它自由参数,则solve将给出数值解。
例如:(1)求解一元二次方程
f=sym('a*x^2+b*x+c');
>> solve(f) %以x为自变量求解方程f=0
ans =
1/2/a*(-b+(b^2-4*a*c)^(1/2))
1/2/a*(-b-(b^2-4*a*c)^(1/2))
>> solve(f,'b') %以b为自变量求解方程f=0
ans =
-(a*x^2+c)/x
(2)求解方程组
>> syms x y z
>> f1=x^2-y^2+z;
>> f2=x+y-z;
>> f3=3*x-y-z-2;
>> [x,y,z]=solve(f1,f2,f3) %以数值数组形式输出求解结果
x =
1/2
y =
-1/2
z =
0
4.符号矩阵
创建符号矩阵方法:
(1)函数法:用sym函数直接创建符号矩阵。
Matlab
A=sym('[1,a,b;a+b,1/2,a*b]')
A =
[ 1, a, b]
[ a+b, 1/2, a*b]
2)直接法:用创建普通数值矩阵的方法创建符号矩阵,但首先要定义所需要的符号变量。
Matlab
利用直接法创建符号矩阵
>> syms a b
>> A=[1,a,b;a+b,1/2,a*b]
A =
[ 1, a, b]
[ a+b, 1/2, a*b]
3)转换法:利用函数sym来实现由数值矩阵转换为符号矩阵
Matlab
转换法创建符号矩阵
>> A=[1.1 2.2;3.3 4.4]
A = 1.1000 2.2000
3.3000 4.4000
>> sym(A)
ans = [ 11/10, 11/5]
[ 33/10, 22/5]
02 符号极限
利用limit函数,求解符号函数的极限,调用格式:
limit(F,x,a):计算当时符号表达式F,当自变量x趋近于a时的极限。
limit(F,a):计算当默认自变量趋近于a时符号表达式F的极限。
limit(F):计算当默认自变量趋近于0时符号表达式F的极限。
limit(F,x,a,'left')或limit(F,x,a,'right'):计算当x趋向于a时,符号表达式F的左极限(a-)或右极限(a+)。
>> syms x y
>> limit(sin(x)/x)
ans = 1
03 符号微分
利用diff函数,调用格式:
diff(s):求符号表达式s对于默认自变量的微分。
diff(s,'v'):求符号表达式s对于自变量v的微分。
diff(s,n):求符号表达式s对于默认自变量的n次微分。
diff(s,'v',n):求符号表达式s对于自变量v的n次微分。
>> s1=sym('2*x^2+y^2-4*x*y');
>> diff(s1)
ans =
4*x-4*y
>> diff(s1,2)
ans =
4
求解微分方程
利用函数dsolve用于求解微分方程(组),调用格式:
r=dsolve('eq1,eq2,...','cond1,cond2,...','v')或 r = dsolve('eq1', 'q2',...,'cond1','cond2',...,'v') 求微分方程eq1、eq2、...的解。 其中cond1、cond2、...为给定的常微分方程的边界条件或初始条件, v为指定的自变量,默认变量为t。
注意,在微分方程eq中,用D表示对自变量(设为x)的微分,如D=d/dx,D2= d2/dx2,D后的字符为因变量。
例如:
>> dsolve('Dy=a*x') %未指定变量,默认变量为t
ans =
a*x*t+C1
>> dsolve('Dy=a*x','x') %指定变量为x
ans =
1/2*a*x^2+C1
>> dsolve('D2y=cos(2*x)-y','Dy(0)=0','y(0)=1','x')
ans =
4/3*cos(x)-1/3*cos(2*x)
>> [x,y]=dsolve('Dx=x-y','Dy=x+y','x(0)=2','y(0)=1')
x =
-exp(t)*(-2*cos(t)+sin(t))
y =
exp(t)*(2*sin(t)+cos(t))
04 符号积分
利用函数int,调用格式:
int(s):求符号表达式s对默认自变量的不定积分。
int (s,'v'):求符号表达式s对自变量v的不定积分。
int (s,a,b):求符号表达式s对默认自变量从a到b的定积分。
int(s,'v',a,b):求符号表达式s对自变量v从a到b的定积分。
>> syms x a
>> int(1/(1+x^2))
ans =
atan(x)
05 复合函数求解
利用compose函数,求解复合函数,调用格式:
compose(f,g):求f=f(x),g=g(y)的复合函数f[g(y)]。
compose(f,g,z):求f=f(x),g=g(y),y=z的复合函数f[g(z)]。
compose(f,g,x,z):求f=f(x),x=g(z)的复合函数f[g(z)]。
compose(f,g,x,y,z):求f=f(x),x=g(y),y=z的复合函数f[g(z)]
>> syms x y z t u %定义符号变量
>> f=1/(1+x^2);g=cos(y);h=x^t;p=exp(y/u); %定义符号表达式f,g,h,p
>> compose(f,g) %求f,g的复合函数
ans =
1/(1+cos(y)^2)
06 求解反函数
利用finverse函数,调用格式:
g = finverse(f):返回符号函数f的反函数,且反函数的自变量与原函数的相同。
g = finverse(f,v):返回包含多余1个变量的符号函数f的反函数,反函数的自变量为v。
Matlab
求解反函数
>> syms x y
>> finverse(exp(2*x)) %求反函数,自变量为x
ans =
1/2*log(x)
>> finverse(x+2*y-1,y) %求反函数,自变量为y
ans =
-1/2*x+1/2+1/2*y