MATLAB2:符号对象的创建及符号计算


一、实验目的

  1.理解符号对象和数值对象之间的差别,以及它们之间的互相转换。
  2.了解符号运算和数值运算的特点、区别和优缺点。
  3.掌握符号对象的基本操作和运算,以及符号运算之间的基本应用。

二、实验内容

  1. 用syms定义具有“限定性”的参数属性:

syms x‘Flag’; %定义符号参数x
Flag表示参数属性,可取以下“限定性”选项:
  A、‘positive’ % 表示那些符号参数取正实数。
  B、‘real’ % 表示那些符号参数限定为实数。
  C、‘unreal’ % 表示那些符号参数为不限定的复数

  2.符号变量定义只能用“空格”隔离

  3.findsym自动认定表达式中的独立自变量的使用方式:

指令说明
findsym(EXPR)确认表达式EXPR中所有“自由”符号变量
findsym(EXPR,N)确认出靠x最近的N个独立自变量;x为首选自由变量,其后排列规则为:与x的ASCII码值之差的绝对值小的字母优先;差值相同时, ASCII码值大的字母优先

注:EXPR可以是符号矩阵,确认是对整个矩阵进行的,不是矩阵元素

  4. findsym的使用规范(新版本中使用symvar函数):

指令说明
findsym所确认的是表达式中的“自由”,“独立”的符号变量。k不自由,z不独立,所以不被该指令认作自由变量。
findsym(EXPR,N)把EXPR表达式中N个最靠近x的自由符号变量确认为“独立自由变量”。注意大小写。大写字母离小写x的距离总是比其他小写字母远

  5.矩阵的简单指令:

指令说明
det(A)矩阵A的行列式
inv(A)矩阵A的逆
eig(A)矩阵A的特征值

  6.符号计算中的算符:
  A、 基本运算符

指令说明
+ - * \ / ^矩阵运算
.* .\ ./ .^数组运算
’ .’共轭转置、非共轭转置

  B、关系运算符
  只有是否等于的概念:== ~=。没有大于、大于等于、小于、小于等于的概念。

  7.符号计算中的基本函数

A、三角函数、双曲函数及反函数:除atan2仅用于数值计算外,其他函数使用方法相同
B、指数、对数函数:没有数值计算中的log2,log10,其它如sqrt,exp,自然对数log使用方法都相同。
C、复数函数:MATLAB没有提供相角angle指令。
D、矩阵代数指令:使用方法几乎完全相同。

  8. 符号对象的识别

A、用class获得每种矩阵的类别
B、用isa判断每种矩阵的类别(若返回1,表示判断正确)
C、利用whos观察内存变量的类别和其它属性

  9. 符号对象的置换操作

指令说明
RES=subs(ES,old,new)用new置换ES中的old后产生RES。
RES=subs(ES,new)用new置换ES中的自由变量后产生RES。

  10. 符号微分

指令说明
dfdvn=diff(f,v,n)f为矩阵时,求导对元素逐个进行,但自变量定义在整个矩阵上;v缺省时,自变量由findsym自动辨认;n缺省为1;在数值计算中,diff是求差分的

  11. 符号序列的求和

指令说明
s=symsum(f,v,a,b)f若为矩阵,求和对每个元素进行,但自变量定义在整个矩阵上;v缺省,自变量由findsym自动辨认;b可以取有限整数或无穷大;a,b缺省,默认求和区间为[0,v-1]

  12. 符号积分

指令说明
intf=int(f,v)f对v的不定积分(不带积分常数)
intf=int(f,v,a,b)f对v的定积分;f若为矩阵,积分对每个元素进行;v缺省,自变量由findsym自动辨认;a,b是积分上下限,可以取任何值或符号表达式

  13. 符号表达式的极限

指令说明
limit(f,x,a)求符号表达式f对x趋近于a的极限
limit(f,‘x’,‘a’,‘left’)求符号表达式f对x趋近于a的左极限
limit(f,‘x’,‘a’,‘right’)求符号表达式f对x趋近于a的右极限

  14.符号变换和符号卷积

指令说明
F=fourier(f,t ,w)求以t为符号变量f的fourier变换F
f=ifourier (F,w,t)求以w为符号变量的F的fourier反变换f

  15.表达式化简

指令说明
simplify(f)对表达式化简,注意不是simple函数

  16.sym()涉及到表达式的一律用str2sym(),例如:

A、str2sym(pi + sqrt(5))
B、f1 = subs(f,sin(x),str2sym(‘log(y)’))

三、仿真结果

1.观察一个数(在此处@记述)在以下四条不同指令作用下的异同:
   a=@
  b=sym(@)
   c=sym(@,‘d’)
   d=sym(‘@’) %这给出完全准确值
  在此,@分别代表具体数值7/3,pi/3,pi*3^(1/3);而异同通过vpa(abs(a-d)),vpa(abs(b-d)),vpa(abs(c-d))等来观察。
答:分析:d=sym(‘@’)对应的是完全准确值,通过上述程序观察a,b,c和d 的误差,可以得到:a,b的输出结果是一致的,但与d对应的完全准确值不完全一样,在a,b取值7/3,pi/3时,a,b,d对应结果是等价的,没有误差;而c=sym(@,‘d’)为数值类数字@的‘十进制浮点’近似表达,默认为32位,与d的误差绝对不是0。

>> a=7/3;b=sym(7/3);c=sym(7/3,'d');d=sym('7/3');
x1=vpa(abs(a-d)), x2=vpa(abs(b-d)),x3=vpa(abs(c-d))
x1 =
0.0
x2 =
0.0
x3 =
0.00000000000000014802973661668756666666667788716
>> a=pi/3;b=sym(pi/3);c=sym(pi/3,'d');d=str2sym('pi/3');
x1=vpa(abs(a-d)),x2=vpa(abs(b-d)),x3=vpa(abs(c-d))
x1 =
0.0
x2 =
0.0
x3 =
 0.00000000000000011483642827992216762806615818554
>>a=pi*3^(1/3);b=sym(pi*3^(1/3));c=sym(pi*3^(1/3),'d');d=str2sym('pi*3^(1/3)');
x1=vpa(abs(a-d)),x2=vpa(abs(b-d)),x3=vpa(abs(c-d))
x1 =
0.00000000000000026601114166290944374842393221638
x2 =
0.00000000000000026601114166290944374842393221638
x3 =
0.0000000000000002660111416629094726767991785515

2.说出以下三条指令产生的结果各属于哪种数据类型,是“双精度”对象,还是“符号”对象?3/7+0.1,sym(3/7+0.1),vpa(sym(3/7+0.1))
答:

>> class(3/7+0.1)
class(sym(3/7+0.1))
class(vpa(sym(3/7+0.1)))
ans =
    'double'
ans =
    'sym'
ans =
'sym'

故3/7+0.1是“双精度”对象,而sym(3/7+0.1),vpa(sym(3/7+0.1)) 是“符号”对象。

3.在不加专门指定的情况下,以下符号表达式中的哪一个变量被认为是独立自由变量?sym(‘sin(wt)’),sym(‘aexp(-X)’),sym(‘zexp(jtheta)’)。
答:在MATLAB中运行指令(-8)(1/3)后,不会得到-2,结果是1.0000 + 1.7321i。它的全部方根有3个,分别为1.0000 + 1.7321i,-2.0000 + 0.0000i,1.0000 - 1.7321i。计算(-8)(1/3)全部方根的M脚本文件为:

>> symvar(str2sym('sin(w*t)'))
symvar(str2sym('a*exp(-X)'))
symvar(str2sym('z*exp(j*theta)'))
 ans =
 [ t, w]
ans =
 [ X, a]
ans =
 [ theta, z]

4.计算二重积分int(int(x2+y2,y,1,x^2),x,1,2)。
答:

>> syms x y;
>> int(int(x^2+y^2,y,1,x^2),x,1,2)
ans =
1006/105

四、实践中遇到的问题及解决方法

  1.问题:在MATLAB中输入sym(‘pi/3’),findsym(sym(‘sin(wt)’))等,总是不能运行
  解决方法:新版本的MATLAB中:
  a、sym()涉及到表达式的一律用str2sym()
  b、取消findsym函数,建议使用symvar函数。故问题中涉及的表达式应该为:str2sym()str2sym(‘pi/3’),symvar(str2sym(‘sin(w*t)’))
  2.问题:分不清数据类型是“双精度”对象,还是“符号”对象?
  解决方法:二者不同点在于:
  a、精度不同:双精度对象大约是16位有效数字,而符号对象是无误差的。
  b、能够进行的运算不同:尽管二者可以调用的部分数学函数名字相同,但真正的函数其实是不一样的。双精度数可以进行比较大小等关系运算,符号对象不能(较新的版本也可以,但结果一般是表达式而非逻辑值)。符号对象里面可以包括未知数,可以进行微积分等各种公式推导,双精度对象不能。
  c、占用内存和运算速度不同:符号对象占用的存储空间比双精度数据大得多,一个双精度数一般是8字节,而一个符号量至少是100多个字节。运算速度方面双精度数据也快得多。
  3.问题:不知道如何定义变量x为正实数?
  解决方法:在syms定义时,加上具有“限定性”的参数属性。该题可以定义为syms(x,’ positive’)
  4.问题:不会求某个点的左右极限
  解决方法:熟记求左右极限的公式

a、limit(f,'x','a','left')	 %求符号表达式f对x趋近于a的左极限
b、limit(f,'x','a','right')	 %求符号表达式f对x趋近于a的右极限

  其中,需要注意与求某点极限的不同:求左右极限需要将自变量以及该点用单引号‘’括起来
  5.问题:不知道如何求绝对值?
  解决方法:一开始,我认为abs()只有求解复数的模的功能,其实不然,它还可以用来求解绝对值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道无方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值