资源描述
对MATLAB中符号和数值型数据以及
sym(),sym(''),sym(,'d'),vpa()的理解
【2012-02-20更新版】
说明:正文中命令部分可以直接在matlab中运行,作者(Yangfd09_LZU)用的是
MATLAB R2009a(7.8.0.347)
v73_64=vpa(7/3,64),vs73d_64=vpa(sym(7/3,'d'),64)
vs73d_v73_64=vs73d_64-v73_64
v73_32=vpa(7/3,32),vs73d_32=vpa(sym(7/3,'d'),32)
vs73d_v73_32=vs73d_32-v73_32
%sym('7/3','d')是7/3的十进制浮点近似表达(默认32位显示)
%...但从vs73d_64看来,实际有效位数只有16位
%从vs73d_64和vs73d_32对比可知:vpa()不改变sym(7/3,'d')的显示精度
u=7/3-sym('7/3')
uv=vpa(7/3-sym('7/3'))
v73=vpa(7/3),vs73=vpa(sym('7/3'))
uvv=vpa(7/3)-vpa(sym('7/3'))
%v73与vs73相等,但uvv不等于0,说明vpa()做差时精度和看到的不同
%经验证:uvv=vpa(7/3,32)-vpa(sym('7/3'),32)的值是为0的
%故:在形如vpa()-vpa()的表达式求解过程中,
%vpa()对不同的数据类型选取的精度不同,sym('')选得更精确
%...且结果并非全在实际有效数位内的(uvv小数位上不全为3)
v73=vpa(7/3),s73d=sym(7/3,'d')
v73_s73=vpa(7/3)-sym('7/3')
s73d_s73=sym(7/3,'d')-sym('7/3')
%v73_s73不等于0,这是由于vpa(7/3)只是7/3的32为浮点表达,二者不相等
%从s73d_s73可以看出,sym(7/3,'d')的有效精度只有16位(只有前16位为0)
p3=pi*3^(1/3),sp3=sym('pi*3^(1/3)')
p3_sp3=pi*3^(1/3)-sym('pi*3^(1/3)')
vp3=vpa(pi*3^(1/3)),vsp3=vpa(sym('pi*3^(1/3)'))
vp3_vsp3=vpa(pi*3^(1/3))-vpa(sym('pi*3^(1/3)'))
vp3_sp3=vpa(pi*3^(1/3))-sym('pi*3^(1/3)')
v_p3_sp3=vpa(pi*3^(1/3)-sym('pi*3^(1/3)'))
%注意到,p3_sp3其实是等于0的,但v_p3_sp3却不等于0
%经测试:vpa(pi*3^(1/3))只有前16位<...要通过和完全准确值比较得到有效位数的话,
%...不能直接数有几位数相同,而应该先做差...>与vpa(sym('pi*3^(1/3)'))相同
%由于sym('pi*3^(1/3)')作为符号表达式,其值是完全准确的
%...所以可以得出结论:pi*3^(1/3)在vpa()作用后只有16位精度
%这与上面的u和uv相等的事实似乎是矛盾的,在检测之后,认定是由于3^(1/3)引起的
%故,可以得出结论:3^(1/3)一类数值型数据在vpa()作用下只有16位可信精度
%...而不像pi以及7/3那样可以由vpa()读取任意长度的可信有效数据
%p3_sp3等于0,是由于符号运算的计算过程中p3被当做符号数字而非数值数字
运行结果:
v73_64 =
2.333333333333333333333333333333333333333333333333333333333333333
vs73d_64 =
2.3333333333333334813630699500209
vs73d_v73_64 =
0.00000000000000014802973661668756666666666258125
v73_32 =
2.3333333333333333333333333333333
vs73d_32 =
2.3333333333333334813630699500209
vs73d_v73_32 =
0.00000000000000014802973661668760000000000672046
u =
0
uv =
0.0
v73 =
2.3333333333333333333333333333333
vs73 =
2.3333333333333333333333333333333
uvv =
-0.000000000000000000000000000000033333333099244559247800895465629
vs73d_64 =
2.333333333333333333333333333333333333333333333333333333333333333
v73 =
2.3333333333333333333333333333333
s73d =
2.3333333333333334813630699500209
v73_s73 =
-0.000000000000000000000000000000033333333328833299642778924365773
s73d_s73 =
0.00000000000000014802973661668756666666667788716
p3 =
4.5310
sp3 =
pi*3^(1/3)
p3_sp3 =
1275352044764433/281474976710656 - pi*3^(1/3)
vp3 =
4.5309606547207899041040946030989
vsp3 =
4.5309606547207901701152362660084
vp3_vsp3 =
-0.0000000000000002660111416629094726767991785515
vp3_sp3 =
4.5309606547207899041040946030989 - pi*3^(1/3)
v_p3_sp3 =
-0.00000000000000026601114166290944374842393221638
展开阅读全文