【发布时间】:2015-03-30 22:58:34
【问题描述】:
我正在尝试重写 Mathematica 代码来构造等填充环:
Nr = 5; (*radial modes*)
DF0[JJ_] := Exp[-JJ]; (*distribution function of long action*)
Jmax = 20; (* max action for numerical cuts*)
CF = NIntegrate[DF0[II], {II, 0, Jmax}];
DF[JJ_] := DF0[JJ]/CF;
bJ = Array[0, Nr + 1];
bJ[[1]] = 0.;
bJ[[Nr + 1]] = Jmax;
For[ir = 2, ir < Nr + 1, ir++,
bb = bJ[[ir - 1]];
bJ[[ir]] =
Jroot /.
FindRoot[
Integrate[DF[JJ], {JJ, bb, Jroot}] == 1/Nr, {Jroot, bb + 1/(Nr DF[bb])}];
];
bJ = Re[bJ];
(* Finding actions aJ of the thin rings: *)
aJ = Array[0, Nr];
For[ir = 1, ir < Nr + 1, ir++,
aJ[[ir]] = NIntegrate[J Nr DF[J], {J, bJ[[ir]], bJ[[ir + 1]]}];
];
aJ = Re[aJ];
rr = Sqrt[2 aJ]; (*radii of the rings*)
NHTRingsPlot =
ParametricPlot[Evaluate[Table[{rr[[i]] Cos[u], rr[[i]] Sin[u]}, {i, 1, Nr}]], {u, 0, 2 Pi}, PlotStyle -> {Blue},(*PlotLabel\[Rule]"Nested Rings",*) AxesLabel -> {"z", "\!\(\*SubscriptBox[\(p\), \(z\)]\)"},LabelStyle -> Directive[{FontSize -> 16}]]
到 Python:
import numpy as np
import scipy
import math
from scipy.integrate import quad
Nr = 5.
Jmax = 20.
CF = math.ceil(scipy.integrate.quad(lambda II : math.exp(-II), 0, Jmax)[0])
bJ = np.array([0.,0.,0.,0.,0.,0.])
bJ[0] = 0.
bJ[Nr] = Jmax
def func():
func = quad(lambda JJ : (math.exp(-JJ) / CF), bb, Jroot) - 1/Nr
for i in bJ:
i=1
if i < Nr:
i += 1
bb = bJ[i]
bJ = np.roots(func, Jroots, bb + CF/(Nr * math.exp(-bb)))
bJ.append()
return bJ
问题在于 func:
TypeError: 不支持的操作数类型 -: 'tuple' 和 'float'
和 与bb:
NameError: name 'bb' 未定义
我刚开始学习 Python,如果有人能帮助我,我将不胜感激。
【问题讨论】:
-
对于我们这些可能受到 Mathematica 挑战的人,请在您的 Mathematica 代码中添加一些 cmets 或描述它在做什么,或将我们指向您尝试实现的算法。此外,说
I'm stuck也不是很有帮助 - 结果有什么问题。
标签: python numpy scipy wolfram-mathematica numerical-integration