【发布时间】:2017-07-14 10:12:33
【问题描述】:
这是两个代码,一个是用 Python 3 编写的,另一个是用 Wolfram Mathematica 编写的。代码是等效的,因此结果(图)应该是相同的。但是代码给出了不同的情节。这是代码。
Python 代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import k0, k1, i0, i1
k=100.0
x = 0.0103406
B = 80.0
def fdens(f):
return (1/2*(1-f**2)**2+f **4/2
+1/2*B*k*x**2*f**2*(1-f**2)*np.log(1+2/(B*k*x**2))
+(B*f**2*(1+B*k*x**2))/((k*(2+B*k*x**2))**2)
-f**4/(2+B*k*x**2)
+(B*f)/(k*x)*
(k0(f*x)*i1(f *np.sqrt(2/(k*B)+x**2))
+i0(f*x)*k1(f *np.sqrt(2/(k*B)+x**2)))/
(k1(f*x)*i1(f *np.sqrt(2/(k*B)+x**2))
-i1(f*x)*k1(f *np.sqrt(2/(k*B)+x**2)))
)
plt.figure(figsize=(10, 8), dpi=70)
X = np.linspace(0, 1, 100, endpoint=True)
C = fdens(X)
plt.plot(X, C, color="blue", linewidth=2.0, linestyle="-")
plt.show()
Mathematica 代码:
k=100.;B=80.;
x=0.0103406;
func[f_]:=1/2*(1-f^2)^2+1/2*B*k*x^2*f^2*(1-f^2)*Log[1+2/(B*k*x^2)]+f^4/2-f^4/(2+B*k*x^2)+B*f^2*(1+B*k*x^2)/(k*(2+B*k*x^2)^2)+(B*f)/(k*x)*(BesselI[1, (f*Sqrt[2/(B*k) + x^2])]*BesselK[0, f*x] + BesselI[0, f*x]*BesselK[1, (f*Sqrt[2/(B*k) + x^2])])/(BesselI[1, (f*Sqrt[2/(B*k) + x^2])]*BesselK[1,f*x] - BesselI[1,f*x]*BesselK[1, (f*Sqrt[2/(B*k) + x^2])]);
Plot[func[f],{f,0,1}]
the Mathematica result (正确的)
结果不同。有人知道为什么吗?
【问题讨论】:
-
他们处理浮点数不同?
-
也许吧。但是,函数最小值的偏移量大于 0.4。我不希望这来自不同的浮动处理。
-
找到问题根源的好方法是,取一个子表达式,分别检查它们的值。递归执行此检查以减少问题的规模。
-
另外,我认为 MMA 涉及符号执行。如果你在 MMA 中使用
Compile[]会发生什么? -
我忘了说,Mathematica 结果是正确的。所以问题出在python代码中。
标签: python-3.x wolfram-mathematica