对MATLAB中符号和数值型数据以及
sym(),sym(''),sym(,'d'),vpa()的理解
[说明:正文中命令部分可以直接在matlab中运行,作者用的是MA TLAB 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
vs73d=vpa(sym(7/3,'d'))
%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'))
vs73d_64=vpa(sym('7/3'),64)
%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为浮点表达,二者不相等
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)')作为符号表达式,其值是完全准确的