用符号计算的结果代数之后为何这么离谱?
mathematica吧
全部回复
仅看楼主
level 1
本来直接计算结果是没问题的,但是把符号运算的结果复制出来重新代数算为啥这么离奇?
代码如下:
Clear["`*"]
ag=hb^2/(G M m^2);n=Sqrt[r0/ag];
dE=-m/(2hb^2) (G M m)^2 (1/(n+1)^2-1/n^2)
r0=1.5*10^11;hb=1.0546*10^-34;G=6.674*10^-11;
M=2*10^30;m=5.965*10^24;
dE
Clear["`*"]
r0=1.5*10^11;hb=1.0546*10^-34;G=6.674*10^-11;
M=2*10^30;m=5.965*10^24;
dE=-((G^2 m^3 M^2 (-(hb^2/(G m^2 M r0))+1/(1+Sqrt[(G m^2 M r0)/hb^2])^2))/(2 hb^2))
2022年09月05日 11点09分 1
吧务
level 10
应该是复制涉及的MakeBoxes、MakeExpression转换导致了表达式的变更。变更前后逻辑等价但数值上不等价,变更了计算顺序导致有效数字的未充分利用(误差积累)。
复制dE的FullForm则无此问题。增大精度应该也行。
2022年09月05日 15点09分 2
前排说一下,本楼的解释是对的。具体可参看4楼的楼中楼。
2022年09月30日 16点09分
吧务
level 12
回复被吞了,试试分段发
一个非常有意思的问题,和“复制涉及的MakeBoxes、MakeExpression转换”完全无关,是不同定义方式的表达式计算顺序不同以及浮点数舍入误差积累的原因
首先解释不同定义方式的表达式计算顺序不同,Trace一下看看
Clear["`*"]
expr1 = -((
G^2 m^3 M^2 (-(hb^2/(G m^2 M r0)) +
1/(1 + Sqrt[(G m^2 M r0)/hb^2])^2))/(2 hb^2));
expr2 := -((
G^2 m^3 M^2 (-(hb^2/(G m^2 M r0)) +
1/(1 + Sqrt[(G m^2 M r0)/hb^2])^2))/(2 hb^2));
r0 = 1.5*10^11; hb = 1.0546*10^-34; G = 6.674*10^-11;
M = 2*10^30; m = 5.965*10^24;
(expr1 // Trace)
(expr2 // Trace)
Trace的内容很复杂,但只是简单看下就可以发现,对于expr1,先计算了G^2/hb^2,而对于expr2则是先计算了G^2 m^3 M^2再计算(G^2 m^3 M^2)/hb^2。这里的具体原因涉及到mma的底层代码实现,一般用户很难也没必要搞清楚,只要知道有这个设定存在就可以了
2022年09月05日 18点09分 4
我说MakeBoxes有问题,是因为dE输出的Box的诠释与dE本身不同。
2022年09月06日 03点09分
对题主的第一段代码的dE进行以下测试则一目了然 FullForm@de FullForm@MakeExpression@#&@ToBoxes@dE
2022年09月06日 03点09分
@asdasd1dsadsa 有意思,这样看计算顺序的区别比Trace直观多了
2022年09月06日 16点09分
@asdasd1dsadsa 但是很奇怪,我这里expr1和expr2的定义应该不涉及MakeBoxes和MakeExpression,但也出现了相同的问题
2022年09月06日 16点09分
吧务
level 12
本层内容多次被吞,只能改用截图
2022年09月05日 18点09分 7
吧务
level 12
本层内容多次被吞,只能改用截图
2022年09月05日 18点09分 10
吧务
level 12
回答完毕,内容在4、7、10三个楼层。
对百度的自动抽楼机制致以诚挚的问候
2022年09月05日 18点09分 11
1