一个新手问题,有报错的输出值可以作为正确值使用吗?
mathematica吧
全部回复
仅看楼主
level 3
墨夕澜 楼主
我的模型求解时报了一个错误是:General::stop: 在本次计算中,General::munfl 的进一步输出将被抑制.
然后输出了一个结果,恕我愚昧,没搞懂这个报错是为什么(有一次改了初始值这个错就没有了??),但是我拿这个输出值代入到原函数里,结果是符合的,所以这个值是正确解吗?
截图和代码放楼下了
2020年07月02日 01点07分 1
level 3
墨夕澜 楼主
2020年07月02日 01点07分 2
level 3
墨夕澜 楼主
代码:
w = ProductLog[(E^(m1 - c2 - 1)*(1 + 1/E^(m1 - m2)))/(
1 + E^(-p + m3))];
pp = w + 201;(*pp是指p无,c1是c内,c2是c无*)
n = E^(-pp + m1) + E^(-pp + m2) + 1;
m1 = 1792;
m2 = 788;
m3 = 312;
c1 = 500;
c2 = 200;
FindRoot[p ==
ProductLog[(1 + w)/(n - 1)*E^(m3 - c1 - (n (1 + w))/(n - 1))] +
c1 + (n (1 + w))/(n - 1), {p, 500}]
检验求出来的P值
m1 = 1792;
m2 = 788;
m3 = 312;
c1 = 500;
c2 = 200;
p = 2085.63;
w = ProductLog[(E^(m1 - c2 - 1)*(1 + 1/E^(m1 - m2)))/(
1 + E^(-p + m3))];
pp = w + 201;
n = E^(-pp + m1) + E^(-pp + m2) + 1;
x = ProductLog[(1 + w)/(n - 1)*E^(m3 - c1 - (n (1 + w))/(n - 1))] +
c1 + (n (1 + w))/(n - 1);
x
2020年07月02日 02点07分 3
level 9
哇到现在还没人回复你[阴险]
这个意思是这个数字太长了超过了机器显示的范围,所以并没有把所有的小数都赋值上去
通俗的说就是保留多少位小数
你可以看看帮助里面的:精度和准确度控制
顺便可以自己算几个数试下:
2020年07月02日 13点07分 4
LZ问的是最后一条报错……
2020年07月04日 02点07分
@xzcyr 他不是问的有报错后的输出值是否可信吗[疑问]
2020年07月04日 03点07分
@0笑叹浮生若梦0 你看他顶楼的图,他画线的是最后一条报错。
2020年07月04日 03点07分
吧务
level 15
我是没想到版本10左右警告信息格式的修改还能引发这种疑问……这个 General::munfl 就是前几条警告的名字,你点一下那三个点就能看到了。
至于这个警告是怎么回事,可以参考 mathematica.stackexchange.com/q/174474/1871
2020年07月04日 02点07分 5
好的谢谢,我去看看
2020年07月11日 07点07分
我去看了,是关于精度的,但是还有点小疑问在楼下,能帮我看一下下不?
2020年07月11日 08点07分
level 3
墨夕澜 楼主
@xzcyr,你的那个参考网址我去看啦,好像是关于精度报错的,说是11.3的版本之后默认不用设置SetSystemOptions["CatchMachineUnderflow" -> False],然后我参考评论区设置了SetSystemOptions["CheckMachineUnderflow" -> False],然后就没有报错了,出来的结果还是一样的,但是据我理解,原评论的意思是说关掉这个只是不把这种精度的报错显示出来而已,所以我这样是不是掩耳盗铃呢[乖]
还有我想问一下,这个关于进一步输出被抑制的报错,也是和精度有关是吗?如果我不在乎精度的话这个解是不是就能用了?
求解答,谢谢谢谢
2020年07月11日 08点07分 7
emmm,我不会艾特
2020年07月11日 08点07分
这就得自己判断了,简单地说就是,你必须要清楚,在你的运算中,当Exp[x]的x值是个很大的负数时,Exp[x]能否近似看作0。一个不能看作0的例子:mathematica.stackexchange.com/q/206565/1871
2020年08月01日 04点08分
@xzcyr 好的,谢谢
2020年08月13日 02点08分
1