在MATLAB和数字符号一样,符号对象同样可以进行一定的计算和化简等相关操作。
目录
1、符号对象的四则运算
(1)简单四则运算
(2)矩阵中的符号进行操作
2、符号元素的因式分解
(1)分解质因数
(2)分解多项式
3、符号表达式的化简
4、符号多项式的展开和合并
(1)、符号表达式的展开
(2)合并
5、计算符号表达式的系数
6、求符号表达式的分子和分母
对于符号对象来说,同样可以对其进行加(+)、减(-)、乘(*)、除(/)以及乘方(^)的运算。首先,举以下的示例进行说明:
syms x y z
a=3*x^3+4*y^2+z;
b=4*x^2+6*y+z^2;
c=x;
d=3*x^3+5*x^2+7*x;
sum=a+b
sub=a-b
mul=a*c
she=d/c
pow=a^2
运行后的结果如下所示:
sum =
3*x^3 + 4*x^2 + 4*y^2 + 6*y + z^2 + z
sub =
3*x^3 - 4*x^2 + 4*y^2 - 6*y - z^2 + z
mul =
x*(3*x^3 + 4*y^2 + z)
she =
(3*x^3 + 5*x^2 + 7*x)/x
pow =
(3*x^3 + 4*y^2 + z)^2
通过上述结果可以看出,对于符号对象来说,可以进行简单四则运算操作,运算规则与我们日常计算所得到的结果相同。
MATLAB不仅可以对符号对象进行计算操作而且同时可以对于矩阵中的符号对象进行相关操作,其中包括矩阵的乘除运算(*、\、/)和乘方运算(^)以及矩阵元素的乘除运算(.*、./、.\)和乘方运算(.^)。
首先介绍的是矩阵的乘除运算:
syms x y
A=[3,x,2*x;4,6*y,x*y;2,10+x,2+y];
B=[5,2+x,10+y;2*x,8*y,2*x;12,1+y,x*y];
C=A*B
运行结果如下所示:
C =
[2*x^2+24*x +15,3*x+8*x*y+2*x*(y+1)+6,3*y+2*x^2*y+2*x^2+30]
[24*x*y+20,4*x +48*y^2+x*y*(y+1)+8,x^2*y^2+12*x*y+4*y+40]
[12*y+2*x*(x+10)+34,2*x+(y+1)*(y+2)+8*y*(x+10)+4,2*y+2*x*(x+10)+x*y*(y+2)+20]
而对于元素来说,假设假设如下两个矩阵进行操作:
syms x y
A=[2*x,5+y;10,24+x];
B=[12*x+y,8*y+x;16-x,18];
C=A/B
D=A\B
E=A^2
运行结果如下所示:
C =
[(41*x-16*y+x*y-80)/(200*x-110*y+8*x*y+x^2),(-2*x^2-4*x*y+60*x+y^2+5*y)/(200*x-110*y +8*x*y +x^2)]
[(x^2+8*x-204)/(200*x-110*y+8*x*y+x^2),(278*x-56*y+x*y+12*x^2)/(200*x-110*y + 8*x*y + x^2)]
D =
[(293*x+8*y+2*x*y+12*x^2-80)/(2*(x^2+24*x-5*y-25)),(24*x+174*y+8*x*y+x^2-90)/(2*(x^2+24*x- 5*y-25))]
[-(x^2+44*x+5*y)/(x^2+24*x-5*y-25),(13*x-40*y)/(x^2+24*x-5*y-25)]
E =
[4*x^2 + 10*y + 50, (x + 24)*(y + 5) + 2*x*(y + 5)]
[ 30*x + 240, 10*y + (x + 24)^2 + 50]
需要说明的是在MATLAB中\和/分别表示的是不同的除法操作,假设有矩阵A和B,那么A\B表示的是,而。
MATLAB中符号变量除了可以进行矩阵的计算,还可以对于矩阵的符号元素进行运算。
例如对上面的矩阵进行矩阵元素之间的计算:
syms x y
A=[2*x,5+y;10,24+x];
B=[12*x+y,8*y+x;16-x,18];
C=A./B
D=A.\B
E=A.^2
运算结果如下所示:
C =
[(2*x)/(12*x + y), (y + 5)/(x + 8*y)]
[ -10/(x - 16), x/18 + 4/3]
D =
[(12*x + y)/(2*x), (x + 8*y)/(y + 5)]
[ 8/5 - x/10, 18/(x + 24)]
E =
[4*x^2, (y + 5)^2]
[ 100, (x + 24)^2]
MATLAB可以对于表达式进行因式分解操作,MATLAB中提供了factor函数完成此功能。factor可以用于分解质因数和多项式。
MATLAB中分解质因数的操作如下所示:
x=factor(24)
结果如下所示:
x =
2 2 2 3
如上所得代码段所示,factor函数主要用于对于质数的操作,而如果是素数的话返回的结果是该素数本身。
x=factor(19)
结果如下所示:
x =
19
MATLAB的factor函数不仅可以对于质数进行分解因式,还可以对于多项式进行分解。例如:
y=x^2-5*x+6;
factor(y)
运行结果如下所示:
ans =
[x - 2, x - 3]
通过运行结果可以看出被分解为了y=(x-2)(x-3),完成了因式分解的功能。
在进行数学计算的时候,常常需要对于符号表达式进行化简,在MATLAB中提供了simplify函数进行化简。
例如对于下面的符号表达式进行化简:
利用MATLAB代码对其进行化简:
z=(3*x*y)/(x^2+4*x);
simplify(z)
运行结果如下所示:
ans =
(3*y)/(x + 4)
这是对一个简单的符号表达式进行化简,对于符号表达式化简的过程实际上就是提取公因式然后再删除相同的公因式。例如将下面的公式进行化简:
该符号表达式的化简过程如下所示:
而通过MATLAB的计算过程是:
syms x
y=(x^2-4*x+3)/(x^2-5*x+6);
simplify(y)
运行结果如下所示:
ans =
(x - 1)/(x - 2)
可以看到与人为计算的结果相同,再比如将下面的公式进行化简:
MATLAB代码如下所示:
syms x y
z=(x^3-y^3)/(x-y)
simplify(z)
运行结果如下所示:
ans =
x^2 + x*y + y^2
通过上面结果可以看出,MATLAB可以进行单一自变量或者是多个自变量进行化简,便于用户进行操作。
MALTAB中可以对于符号多项式进行合并和展开。
MATLAB中提供了expand函数将符号表达式展开为符号多项式。
例如:
A=(3*x^2+4*x*y+2)*(x*2);
B=(4*x^3+8*y^2)*(4*x^2);
C=expand(A)
D=expand(B)
运行结果如下所示:
C =
6*x^3 + 8*y*x^2 + 4*x
D =
16*x^5 + 32*x^2*y^2
利用expand函数可以将因式分解所得到分式再次进行组合。如下所示:
syms x
A=x^2-5*x+6;
B=factor(A)
C=expand(B(1,1)*B(1,2))
运行出来的结果如下所示:
B =
[x - 2, x - 3]
C =
x^2 - 5*x + 6
可以看到所得C的值与A的相同,因此expand可以对于factor所得的分解的因式进行逆操作,即合并操作。
expand还可以对于三角函数进行操作:
syms x y
A=expand(sin(x+y))
B=expand(sin(x-y))
C=expand(cos(x+y))
D=expand(cos(x-y))
运行结果如下所示:
A =
cos(x)*sin(y) + cos(y)*sin(x)
B =
cos(y)*sin(x) - cos(x)*sin(y)
C =
cos(x)*cos(y) - sin(x)*sin(y)
D =
cos(x)*cos(y) + sin(x)*sin(y)
可以看到三角函数看出来的括号的结果是与我们所记的公式的结果是相同的。
在对于符号表达式进行了展开操作之后,同样在一些时候需要对于符号表达式进行合并。MATLAB中提供了collect函数用于合并操作。例如:
syms x
y=(x-2)*(x-3);
y
y=collect(y)
运行结果如下所示:
y =
(x - 2)*(x - 3)
y =
x^2 - 5*x + 6
通过前后之间的对比可以发现,collect函数对于两个括号内的表达式进行了合并操作。
collect函数可以合并的时候指定自变量,例如:
syms x y
z=(x^2+3*y-4)*(x+4*y^2-3*y+5);
z1=collect(z,x)
z2=collect(z,y)
运行结果如下所示:
z1 =
x^3 + (4*y^2 - 3*y + 5)*x^2 + (3*y - 4)*x + (3*y - 4)*(4*y^2 - 3*y + 5)
z2 =
12*y^3 + (4*x^2 - 25)*y^2 + (- 3*x^2 + 3*x + 27)*y + (x^2 - 4)*(x + 5)
通过运行结果可以返发现,当一个符号表达式中含有多个自变量的时候,符号表达式选择不同的自变量所得到的结果也是不一样的。
在MATLAB中可以使用coeffs函数来获取符号表达式的系数。在MATLAB中coeffs函数的最基本的用法如下所示:
上述公式中A表示的是有一个符号表达式,而var表示的是返回结果是按照var的升幂顺序返回符号常量的系数:
syms x
y=3*x^4+2*x^3-8*x^2+4*x+10;
coeffs(y,x)
运行的结果如下所示:
ans =
[10, 4, -8, 2, 3]
另一种形式是:
在这种形式下,c表示的是各个系数矩阵,而num表示的是各个系数对应的是哪一项的。
例如:
syms x
y=3*x^4+2*x^3-8*x^2+4*x+10;
[c,num]=coeffs(y,x)
M=c.*num
运行结果如下所示:
c =
[3, 2, -8, 4, 10]
num =
[x^4, x^3, x^2, x, 1]
M =
[3*x^4, 2*x^3, -8*x^2, 4*x, 10]
通过对于矩阵c和矩阵num两个矩阵各个元素之间进行对比可以发现,c中元素就是num相同位置的元素的系数,将两个矩阵中的元素进行点乘就可以得到矩阵M,将M中的所有元素进行相加就可以得到原始矩阵。
当遇到一个符号表达式中有多个变量的时候,同样可以coeffs函数同样可以对多符号表达式进行排序。例如,当符号表达式中既有变量x和变量y的时候,此时按照符号x作为自变量来获取系数:
syms x y
A=2*x^2+3*x+5*y+4;
B=2*y;
C=expand(A*B)
coeffs(C,x)
运行结果如下所示:
C =
4*x^2*y + 6*x*y + 10*y^2 + 8*y
ans =
[10*y^2 + 8*y, 6*y, 4*y]
通过上面的结果可以看到,结果返回的矩阵的元素都是带有y的符号的。那么,如果我们设置x和y同时作为符号表达式的自变量是什么情况呢?例如:
syms x y
A=2*x^2+3*x+5*y+4;
B=2*y;
C=expand(A*B)
coeffs(C,[x,y])
结果如下所示:
C =
4*x^2*y + 6*x*y + 10*y^2 + 8*y
ans =
[8, 10, 6, 4]
通过上面的结果可以看出,当同时设置x和y作为自变量的时候,此时返回的结果是一个只包含数字的矩阵,是x和y双自变量的系数。
在对于一个符号表达式进行操作的时候,常常需要得到符号表达式的分子或者分母进行操作。在MATLAB中提供了numden函数用于获取符号表达式中的分子或者分母,使用方法是:
在上面的公式中,M可以表达式单个数字、表达式、向量或者是矩阵。
例如:
syms x y
%如果是数字时
[num1,den1]=numden(sym(12/19))
%如果是表达式时
[num2,den2]=numden((3*x^2+4*y^3)/(4*x*y))
%如果是向量时
[num3,den3]=numden([(5*x+4*y)/(6*x*y),(8*x^4)/(7*y^2)])
%如果是矩阵时
[num4,den4]=numden([(3*x*y)/(5*x+6*y),(4*x^2)/(4*y);(4*y)/(x^3),(4*x+6*y)/(4*x+5*y)])
运行结果如下所示:
num1 =
12
den1 =
19
num2 =
3*x^2 + 4*y^3
den2 =
4*x*y
num3 =
[5*x + 4*y, 8*x^4]
den3 =
[6*x*y, 7*y^2]
num4 =
[3*x*y, x^2]
[ 4*y, 4*x + 6*y]
den4 =
[5*x + 6*y, y]
[ x^3, 4*x + 5*y]
通过运行结果可以看出,被操作的是符号表达式如果是数字、表达式、向量还是矩阵,返回的类型也是数字、符号表达式、向量和矩阵,所求解的结果和被操作的符号表达式的类型相同的。