在数值积分中找到根(积分极限)

时间:2015-01-31 15:33:36

标签: python numpy scipy wolfram-mathematica numerical-integration

我正在尝试重写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,如果你们中的某些人可以帮助我,我将不胜感激。

1 个答案:

答案 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 bindingDefining 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 StatementsThe 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中尝试一下,看看它们是如何工作的或者不起作用。