Minos 发表于 2010-11-24 11:08:59

紧急求助,个人觉得奇怪的问题!

诸位大侠好,我用vpa对MATLAB的随机函数进行小数点位数的调整——
vpa(unifrnd(0,1),9)
若单独在command窗口运行好像没有问题,但是编写.m文件时就报错——
=======================
OK = 0;
for i= 1:100%定义时间范围
      x = vpa(unifrnd(0,1),9); %利用vpa()函数调整MATLAB精度为小数点后9位
      if x <= 1 && x > 5E-8
            OK = OK + 1;
      end
end
OK
============================
报错信息为:
??? Error using ==> sym.sym>notimplemented at 2621
Function 'le' is not implemented for MuPAD symbolic objects.
Error in ==> sym.sym>sym.le at 834
            notimplemented('le');
Error in ==> MonteCarloTest at 39
      if x <= 1 && x > 5E-8
=========================
谁帮忙会诊一下?感激不尽!

chenzhian 发表于 2010-11-24 12:16:38

vpa转换的字符串,你的错误提示全部是关于字符出现的错误。
这样
你把字符串的变成数值
x =eval(vpa(unifrnd(0,1),9));
应该是没问题的。

qibbxxt 发表于 2010-11-24 13:58:52

vpa返回值是sym类型的,不能比较,建议转换成double类型clear;clc;close all
OK = 0;
for i= 1:100%定义时间范围
      x = double(vpa(unifrnd(0,1),9)); %利用vpa()函数调整MATLAB精度为小数点后9位
      if x <= 1 && x > 5E-8
            OK = OK + 1;
      end
end
OK

Minos 发表于 2010-11-24 15:07:20

:victory:
多谢上面的2位!还是这边高手多啊,呵呵
受教了,再次感谢哦!

Minos 发表于 2010-11-24 15:20:15

:)不好意思,上述办法可以解决出错的问题,但是好像用了eval() 或 double() 转换后,精度就变小了,我用vpa()的目的就是想把精度准确到小数点后面9位,但是eval和double又变回去了(回到默认精度小数点后面4位)了。也就是相当于vpa()没发挥作用。咋回事呀?

chenzhian 发表于 2010-11-24 15:24:38

不是,那是显示的问题,你用format long看下,确实保存的是有九位小数的数字。

Minos 发表于 2010-11-24 15:49:04

哦,你是指MATLAB的显示设置默认是4位小数,要显示的准确需要加以调整对吗?上面的回答已经解决我面临的问题,十分感谢。
试了一下——
eval(vpa(unifrnd(0,1),9)) 会生成如 0.207742293000000;
double(vpa(unifrnd(0,1),9)) 会生成如 0.587044704531417;
有没有刚好设成自定义的精度的函数啊?小数位数多了会不会影响循环速度啊,我的循环次数可能会比较多呃,最近想做一个MonteCarlo仿真
呵呵,问题有点多。

zhouyang664 发表于 2010-11-24 23:56:30

指定精度的实现:
floor(m*10^n)/10^n
m是你的数据,n是想保留的位数!

chenzhian 发表于 2010-11-25 10:57:51

7# Minos
你用eval(vpa(unifrnd(0,1),9)) 得到的结果不就是有九位精度的数值吗?
页: [1]
查看完整版本: 紧急求助,个人觉得奇怪的问题!