1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MATLAB 符号表达式与运算全面详细讲解

MATLAB 符号表达式与运算全面详细讲解

时间:2020-06-10 14:52:22

相关推荐

MATLAB 符号表达式与运算全面详细讲解

文章目录

1. 符号定义1.1 sym函数介绍1.1.1 定义单个符号1.1.2 定义多个符号1.1.3 保留真实数据1.2 syms函数介绍1.2.1 定义不同变量1.2.2 定义多行符号2. 代换符号2.1 代换表达式中的符号2.2 控制替换后的精度3. 其他函数3.1 因式分解3.2 展开表达式3.3 合并同类项3.4 化简3.5 通分3.6 嵌套分解3.7 求反函数3.8 复合函数

1. 符号定义

1.1 sym函数介绍

1.1.1 定义单个符号

sym函数能够定义单个的符号变量,如下所示:

a = sym('a')

运行后的显示为:

a =

a

1.1.2 定义多个符号

当需要定义多个变量时,则可以在后面写上需要变量的行数与列数,其可以生成多行多列的变量矩阵。

A = sym('a',[2 4])

打印出的结果如下

A =

[ a1_1, a1_2, a1_3, a1_4]

[ a2_1, a2_2, a2_3, a2_4]

当想调用对应的符号时用矩阵元素的索引即可

f = A(1,3) * 8

f =

8*a1_3

sym还支持自定义生成的变量的形式,

A = sym('a_%d_%d',[2 4])

生成的符号就是a_1_1的形式。

1.1.3 保留真实数据

使用sym函数能够将数据的值进行精确的保留,不必要担心计算机计算的误差等问题。

例如,当计算 1123467∗34\frac{1}{123467} * \frac{3}{4}1234671​∗43​ 时,我们想要的是准确的分数形式,但是直接输入的话会导致答案成为浮点形式,这时使用sym函数就能避免这种情况。

直接输入如下:

answer = 1 / 1234567 * (3 / 4)

输出为

answer =

6.0750e-07

使用sym函数转换后:

answer2 = 1 / sym(1234567) * (3 / 4)

输出为

answer2 =

3/4938268

该答案为分式形式的准确解。

注意:在使用sym函数进行精度保留时,不能将其写为sym(1/1234567),写成这种形式时会优先计算1/1234567再将其转为分式,精度已经得到了损失。

1.2 syms函数介绍

1.2.1 定义不同变量

syms函数能够很快的定义多个不同的变量,变量之间只需要使用空格隔开就行,形式如下:

syms a b c d

使用whos命令查看所有变量为

NameSizeBytes ClassAttributes

a1x18sym

b1x18sym

c1x18sym

d1x18sym

1.2.2 定义多行符号

syms同样可以定义多行多列的数据类型,形式如下

syms a [4 3]

以上代码定义了一个4*3的符号,等价于a=sym('a', [4 3]),符号全部存储在a当中,需要使用时只需要使用诸如a(1,3)的索引即可。

2. 代换符号

使用符号定义了一个符号函数后,往往需要将符号函数中的一些符号代换成其他符号或者数值类型,这种情况下一般使用subs函数。

2.1 代换表达式中的符号

subs函数的一般形式如下

subs(S, old, new)

其参数的含义是在符号表达式S中,利用new中的符号或数值替换old中的符号。

其示例如下

syms a b c x yf = a * x^2 + b * y + c;%原表达式syms mf1 = subs(f, [x y], [sin(x) log(y)]) %符号替换符号f2 = subs(f, [a b], [2 3]) %数值替换符号f3 = subs(f, a, 1: 4) %多数值替换符号

输出如下:

f1 =

a*sin(x)^2 + c + b*log(y)

f2 =

2*x^2 + c + 3*y

f3 =

[ x^2 + c + b*y, 2*x^2 + c + b*y, 3*x^2 + c + b*y, 4*x^2 + c + b*y]

2.2 控制替换后的精度

使用数值对表达式进行了替换后,往往需要对精度做一定的控制与保证,这个时候就需要使用vpa函数了。

控制精度的方法有两种,一是用digits函数+vpa函数,一种是直接用vpa函数。

方式一digits+vpa

digits函数规定了精度的保留位数 ,默认是32位,vpa函数对数值进行计算。如digits(10)代表精度保留为有效数字10位,digits函数使用后必须要配合vpa函数使用。

计算 π∗e2\pi * e^2π∗e2 的值,保留50位有效数字。

digits(50); %保留50位精度y = str2sym('pi * exp(2)'); %将字符串转为sym形式vpa(y)

输出如下:

ans =

23.213404357363387236150345896006882480062932649056

有效数字位数为50位。

方式二vpa

vpa函数有还有一种格式如下

vpa(E, D)

其中E为传入的要计算的值,D为要保留的精度。

计算 f(x)=cos1+sin1f(x) = cos1+sin1f(x)=cos1+sin1 的值,保留50位有效数字。

syms xf(x) = cos(x) + sin(x);y = vpa(f(1), 50)

上述代码计算 f(1)f(1)f(1) 的值,设定精度为50,结果为

y =

1.3817732906760362240534389290732756033548734814163

3. 其他函数

3.1 因式分解

符号表达式中使用factor函数对符号表达式进行因式分解,调用格式如下

factor(E)

其中E为符号表达式.

化简 f=x3+x2−x−1f=x^3+x^2 - x - 1f=x3+x2−x−1

syms xf = x^3 + x^2 - x - 1;f1 = factor(f)

输出为

f1 =

[ x - 1, x + 1, x + 1]

3.2 展开表达式

使用expand函数对符号表达式进行展开,调用格式如下

expand(E)

其中E为符号表达式.

展开函数 f=(x+y)4f=(x + y)^4f=(x+y)4

syms x yf= (x + y)^4;f1 = expand(f)

输出为

f1 =

x^4 + 4*x^3*y + 6*x^2*y^2 + 4*x*y^3 + y^4

3.3 合并同类项

使用collect函数对符号表达式进行展开,其调用格式有两种

collect(E)

将符号表达式E中各sym变量前的系数进行合并。

collect(E, v)

将符号表达式E中的v的同幂项系数进行合并。

将函数 f=−axe−cx+be−cxf=-axe^{-cx} + be^{-cx}f=−axe−cx+be−cx的同类项进行合并。

注意,该题下如果不指定合并的项数,那么其将不会进行合并,因为没有除了数值外相同的sym项,比如下面的代码

syms a b c xf = -a * x * exp(-c * x) + b * exp(-c * x)f1 = collect(f)

输出为

f1 =

(-a*exp(-c*x))*x + b*exp(-c*x)

不能说没有变化,只能说变了不如没变。

该题要想合并必须指定合并的项,

syms a b c xf = -a * x * exp(-c * x) + b * exp(-c * x)f1 = collect(f,exp(-c*x))

输出为

f1 =

(b - a*x)*exp(-c*x)

3.4 化简

使用simplify函数对符号表达式进行化简,调用格式如下

simplify(E)

其中E为符号表达式.

化简函数 e1=cos2x+sin2xe_1= cos^2x + sin^2xe1​=cos2x+sin2x 和 e2=ec∗ln(a+b)e_2= e^{c * ln(a + b)}e2​=ec∗ln(a+b)

syms x a b c;e10 = sin(x)^2 + cos(x) ^2;e1 = simplify(e10);e20 = exp(c * log(a+ b));e2 = simplify(e20);

输出为

e1 =

1

e2 =

(a + b)^c

除此之外,也可用simple函数进行化简,simple会对符号表达式进行不同的尝试,并返回长度最短的形式。其调用格式如下:

[R,HOW] = simple(E)

其中E为符号表达式,R为化简结果,HOW为化简方法。

3.5 通分

使用numden函数对符号表达式进行通分,调用格式如下

[N,D] = numden(E)

其中E为符号表达式,N为通分后的分子,D为通分后的分母。

对函数 f=xky+ypxf = \frac{x}{ky} + \frac{y}{px}f=kyx​+pxy​ 进行通分。

syms k p x yf = x / ( k * y) + y / ( p * x);[n, d] = numden(f);f1 = n / d;

输出为

f1 =

(p*x^2 + k*y^2)/(k*p*x*y)

3.6 嵌套分解

使用horner函数对符号表达式进行嵌套类型的分解,调用格式如下

horner(E)

其中E为符号表达式。

将 f=−ax4+bx3−cx2+x+df = -ax^4+bx^3-cx^2+x+df=−ax4+bx3−cx2+x+d 转为嵌套形式的表达式。

syms a b c d xf = -a * x^4 + b * x^3 - c * x^2 + x + d;f1 = horner(f)

输出为

f1 =

d - x*(x*(c - x*(b - a*x)) - 1)

3.7 求反函数

使用finverse函数对符号表达式进行嵌套类型的分解,调用格式如下

g = finverse(E, v)

其中E为符号表达式,v为指定的自变量,单变量为xv可以省略。

求函数 f=ax+bf = ax+bf=ax+b 的反函数。

syms x y a by = a * x + b;g = finverse(y)

输出为

g =

-(b - x)/a

3.8 复合函数

使用compose函数对两个符号表达式进行复合求解,调用格式如下

compose(f, g)

当 f=f(x)f = f(x)f=f(x)以及g=g(y)g = g(y)g=g(y)时,返回复合函数f(g(y))f(g(y))f(g(y)) 。

compose(f, g, z)

当 f=f(x)f = f(x)f=f(x)以及g=g(y)g = g(y)g=g(y)时,返回复合函数f(g(z))f(g(z))f(g(z)) 。

compose(f, g, t, u ,z)

当 f=f(t)f = f(t)f=f(t)以及g=g(u)g = g(u)g=g(u)时,返回复合函数f(g(z))f(g(z))f(g(z)) 。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。