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
函数能够将数据的值进行精确的保留,不必要担心计算机计算的误差等问题。
例如,当计算
1
123467
∗
3
4
\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
命令查看所有变量为
Name Size Bytes Class Attributes
a 1x1 8 sym
b 1x1 8 sym
c 1x1 8 sym
d 1x1 8 sym
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 y
f = a * x^2 + b * y + c;%原表达式
syms m
f1 = 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
函数使用。
例
计算
π
∗
e
2
\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
)
=
c
o
s
1
+
s
i
n
1
f(x) = cos1+sin1
f(x)=cos1+sin1 的值,保留50位有效数字。
syms x
f(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
=
x
3
+
x
2
−
x
−
1
f=x^3+x^2 - x - 1
f=x3+x2−x−1
syms x
f = 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
)
4
f=(x + y)^4
f=(x+y)4
syms x y
f= (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
=
−
a
x
e
−
c
x
+
b
e
−
c
x
f=-axe^{-cx} + be^{-cx}
f=−axe−cx+be−cx的同类项进行合并。
注意,该题下如果不指定合并的项数,那么其将不会进行合并,因为没有除了数值外相同的sym
项,比如下面的代码
syms a b c x
f = -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 x
f = -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
为符号表达式.
例
化简函数
e
1
=
c
o
s
2
x
+
s
i
n
2
x
e_1= cos^2x + sin^2x
e1=cos2x+sin2x 和
e
2
=
e
c
∗
l
n
(
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
=
x
k
y
+
y
p
x
f = \frac{x}{ky} + \frac{y}{px}
f=kyx+pxy 进行通分。
syms k p x y
f = 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
=
−
a
x
4
+
b
x
3
−
c
x
2
+
x
+
d
f = -ax^4+bx^3-cx^2+x+d
f=−ax4+bx3−cx2+x+d 转为嵌套形式的表达式。
syms a b c d x
f = -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
为指定的自变量,单变量为 x
时 v
可以省略。
例
求函数
f
=
a
x
+
b
f = ax+b
f=ax+b 的反函数。
syms x y a b
y = 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)) 。文章来源:https://www.toymoban.com/news/detail-491734.html
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)) 。文章来源地址https://www.toymoban.com/news/detail-491734.html
到了这里,关于MATLAB 符号表达式与运算全面详细讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!