我正在尝试重写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:名称'bb'未定义
我刚开始学习Python,如果你们中的某些人可以帮助我,我将不胜感激。
答案 0 :(得分:0)
你写的内容有很多问题。由于我并不真正了解您要完成的任务,因此不会成为答案,但我会指出我所看到的问题。你可能应该花一些时间在文档中使用The Python Tutorial。
CF = math.ceil(scipy.integrate.quad(lambda II : math.exp(-II), 0, Jmax)[0])
作业的右侧将评估为1.0
,因此CF始终为1.0
def func():
func = .....
您开始为名为func
的函数定义函数,然后立即为名称func
指定其他内容。请查看Naming and binding和Defining Functions。
TypeError: unsupported operand type(s) for -: 'tuple' and 'float'
scipy.integrate.quad
返回一个元组,你不能对元组执行数学运算(- 1/Nr
)。
NameError: name 'bb' is not defined
您尚未为bb
分配任何内容,因此未对其进行定义。如果您想创建一个部分函数,以便稍后使用bb
的不同值,请查看functools.partial
。另一种方法是在编程后更改bb
之后的代码中定义函数。
>>> print bb
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
print bb
NameError: name 'bb' is not defined
>>> # assign 1 to bb
>>> bb = 1
>>> print bb
1
>>>
使用for
循环(for i in bJ:
)解释您要尝试的内容非常困难,但是您没有正确使用它,for
Statements,The for
Statement - 这是一个简单的例子:
>>> a = np.array([1.0, 2.0, 3.0, 4.0])
>>> a
array([ 1., 2., 3., 4.])
>>> for n in a:
print n
1.0
2.0
3.0
4.0
>>>
for i in bJ:
在每次迭代时将bJ
的连续项/元素分配给i
,然后在for
循环套件中为i
指定不同的值,即>>> for c in 'abcde':
print 'c is ', c
c = 2
print 'now c is ', c
c is a
now c is 2
c is b
now c is 2
c is c
now c is 2
c is d
now c is 2
c is e
now c is 2
>>>
错误。你这样做
{{1}}
关于Python的一个非常好的事情是你可以在shell中尝试一下,看看它们是如何工作的或者不起作用。