Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2008-11-28, 10:09   #1
me4047
初级会员
 
注册日期: 2008-05-27
年龄: 43
帖子: 21
声望力: 17
me4047 正向着好的方向发展
默认 [求助]一个关于符号运算的问题

问题是这样的.我在做题的过程中发现:
a=100000000000000000000000000
b=100000000000000000000000001
b-a=0

然后慢慢的深入到

vpa(15^14)

ans =

29192926025390624.

这个结果显然是错的,因为最后一位不可能是4啊!

经过研究才知道是这样的:
vpa('15^14')

ans =

29192926025390625.
这个结果就顺眼多了:smile: 还觉得自己挺聪明

然后我就想,依此类推。。。但是遇到的问题是

N=29;n=[0:28];
a=vpa('n.^((N-1)/2)')

就出现了下面的错误

??? Error using ==> sym.sym>char2sym
Not a valid symbolic expression.

Error in ==> sym.sym at 92
S = char2sym(x);

Error in ==> vpa at 41
r = vpa(sym(s),d);

我想这个问题不太难,但是以我的资质实在是参悟不透了。求各位高手帮帮忙啊!
me4047 当前离线   回复时引用此帖
旧 2008-11-28, 18:30   #2
me4047
初级会员
 
注册日期: 2008-05-27
年龄: 43
帖子: 21
声望力: 17
me4047 正向着好的方向发展
默认 回复: [求助]一个关于符号运算的问题

没有人愿意帮我吗?:cry:
me4047 当前离线   回复时引用此帖
旧 2008-11-28, 22:27   #3
haiyunyuan
初级会员
 
注册日期: 2008-11-27
年龄: 54
帖子: 7
声望力: 0
haiyunyuan 正向着好的方向发展
默认 回复: [求助]一个关于符号运算的问题

有两个vpa函数;可用help vpa和help sym/vpa.m看一下它们的相关信息,二者有细微差别,前者会有一定的误差,后者是精确的。
vpa(15^14),因为参数是数值表达式,因此调用的是第一个函数;
vpa('15^14'),因为参数是字符串,调用的是第二个函数;当然如果参数是符号表达式调用的也是这个函数,如vpa(sym('15^14'))。

后面问题的答案也就出来了:

N=29;n=[0:28];
a=vpa('n.^((N-1)/2)')

上面程序vpa函数参数是字符串,因此matlab会调用sym/vpa.m,但是N和n都是数值变量,而不是符号对象,肯定会出错;可将程序改成如下情况之一则不会出错:

1、去掉vpa 函数参数的引号,使用数值表达式,vpa.m;
N=29;n=[0:28];
a=vpa(n.^((N-1)/2))

2、将N和n定义成符号常量,这样vpa输入参数不要用引号,就是符号表达式,调用sym/vpa.m。
N=sym(29);n=sym([0:28]);
a=vpa(n.^((N-1)/2))或a=n.^((N-1)/2)

当然上面两种方式的结果在数值较大时结果也有差别,第二种方式是准确的,因此要想得到准确答案,应当进行完全的符号运算,而不应当掺入部分数值运算,否则计算机在进行浮点数到符号对象的转换过程中会带来误差。vpa函数使用数值作为输入参数,输出结果却是符号对象,程序里肯定存在这种转换。sym/vpa.m不存在这种问题。

类似的问题也存在于sym函数的两种调用给是:sym(15^14)和sym('15^14'),前者存在转换误差,后者没有。
haiyunyuan 当前离线   回复时引用此帖
旧 2008-11-29, 01:31   #4
me4047
初级会员
 
注册日期: 2008-05-27
年龄: 43
帖子: 21
声望力: 17
me4047 正向着好的方向发展
默认 回复: [求助]一个关于符号运算的问题

引用:
作者: haiyunyuan 查看帖子
有两个vpa函数;可用help vpa和help sym/vpa.m看一下它们的相关信息,二者有细微差别,前者会有一定的误差,后者是精确的。
vpa(15^14),因为参数是数值表达式,因此调用的是第一个函数;
vpa('15^14'),因为参数是字符串,调用的是第二个函数;当然如果参数是符号表...
:biggrin: :biggrin: :biggrin:

我做出来啦!哈哈哈哈!
感谢啊感谢!
真是不知道怎么感谢楼上了!

果然是高!
me4047 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码


相似的主题
主题 主题作者 版面 回复 最后发表
《MATLAB程序设计教程》电子教案 shnanren MATLAB论坛 14 2010-09-12 10:05
[求助]符号积分 找不到显式,该怎么解决? longxtx202 MATLAB论坛 4 2009-02-08 21:30
[分享]给大家传一个图像空间变换和直方图变换的数学推导 johnny8088 MATLAB论坛 0 2009-01-31 03:26
[求助]一个有关用设计的滤波器处理声音信号的问题。 fujinhai MATLAB论坛 7 2008-11-13 09:31
[求助]在SIMULINK里,如何将inegrator上方的箭头移到下面去 yijianmei MATLAB论坛 1 2008-07-24 10:15


所有时间均为北京时间。现在的时间是 22:19


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.