3

私は現在Sympy、数学的な計算を実行するために使用しています。現在、数値積分を実行しようとしていますが、スクリプトを実行するたびにエラーが発生し続けます。スクリプトは次のとおりです。

from sympy import *
cst = { 'qe':1.60217646*10**-19, 'm0':N(1.25663706*10**-6) }

d = 3.6*10**-2
l = 20.3*10**-2
n = 217.0
I = 10.2

# Circum of loops
circ = l/n;
# Radius
r = N( circ/(2*pi) )
# Flux through a ring a distance R from the ceter
def flux(rad, I, loopRad):
    distFromWire = loopRad - rad
    bPoint = cst['m0']*I/(2*pi*distFromWire)
    return ( bPoint*2*pi*rad )

# Integrate from r=0 to r=wireRad
x = Symbol('x')
ig = Symbol('ig')
ig = flux(x, I, r)
print(ig)
integrate(ig*x,x)

おそらく実際の物理学/数学に何か問題があると確信していますが、今はそれを統合したいだけです. スクリプトを実行したときに得られる出力は次のとおりです。

8.05359718208634e-5*x/(-6.28318530717959*x + 0.000935483870967742)
Traceback (most recent call last):
  File "script.py", line 34, in <module>
    integrate(ig*x,x)
  File "C:\Python27\lib\site-packages\sympy\utilities\decorator.py", line 24, in threaded_func
    return func(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 847, in integrate
    return integral.doit(deep = False)
  File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 364, in doit
    antideriv = self._eval_integral(function, xab[0])
  File "C:\Python27\lib\site-packages\sympy\integrals\integrals.py", line 577, in _eval_integral
    parts.append(coeff * ratint(g, x))
  File "C:\Python27\lib\site-packages\sympy\integrals\rationaltools.py", line 42, in ratint
    g, h = ratint_ratpart(p, q, x)
  File "C:\Python27\lib\site-packages\sympy\integrals\rationaltools.py", line 124, in ratint_ratpart
    H = f - A.diff()*v + A*(u.diff()*v).quo(u) - B*u
  File "C:\Python27\lib\site-packages\sympy\core\decorators.py", line 75, in __sympifyit_wrapper
    return func(a, sympify(b, strict=True))
  File "C:\Python27\lib\site-packages\sympy\polys\polytools.py", line 3360, in __mul__
    return f.mul(g)
  File "C:\Python27\lib\site-packages\sympy\polys\polytools.py", line 1295, in mul
    _, per, F, G = f._unify(g)
  File "C:\Python27\lib\site-packages\sympy\polys\polytools.py", line 377, in _unify
    F = f.rep.convert(dom)
  File "C:\Python27\lib\site-packages\sympy\polys\polyclasses.py", line 277, in convert
    return DMP(dmp_convert(f.rep, f.lev, f.dom, dom), dom, f.lev)
  File "C:\Python27\lib\site-packages\sympy\polys\densebasic.py", line 530, in dmp_convert
    return dup_convert(f, K0, K1)
  File "C:\Python27\lib\site-packages\sympy\polys\densebasic.py", line 506, in dup_convert
    return dup_strip([ K1.convert(c, K0) for c in f ])
  File "C:\Python27\lib\site-packages\sympy\polys\domains\domain.py", line 85, in convert
    raise CoercionFailed("can't convert %s of type %s to %s" % (a, K0, K1))
sympy.polys.polyerrors.CoercionFailed: can't convert DMP([1, 0], ZZ) of type ZZ[_b1] to RR
[Finished in 0.3s with exit code 1]

編集: よし、プログラムが使用していた数字を取り出して wolfram alpha に入れました。積分が収束しないことが判明したため、エラーが発生しました。単なる計算ミスだったと思います。

4

1 に答える 1

5

数値計算にシンボリックライブラリを使用することは非常に悪い考えです。scipy/numpyを使用するだけです。そうは言っても、このような単純な積分では、sympyを使用できたはずです。ただし、不透明な関数にすべてをダンプするのではなく、実際にはsympy式を使用する必要があります。

まず、Pythonの変数がどのように機能するかを学びます。

ig = Symbol('ig')
ig = flux(x, I, r)

この操作igがシンボルではなくなった後は、の戻り値になりfluxます。

すべてのシンボルを定義し、それらから式を作成します。積分はsympyがそれを処理するのに十分に単純です。

最後に、const*x/(x-const)あなたの場合のように単純な統合は、ソフトウェアに浪費するのではなく、手作業で行う必要があります。

[編集]:私はそれをきれいに書き直しました、そしてそれでもsympyはバグのために正しく統合されません。メーリングリストまたは課題追跡システムで報告すると、修正が試みられます。そうは言っても、表現はとてもシンプルなので、手で統合することができます。

[編集2]:

In [5]: integrate(a*x/(b*x+c), x)
Out[5]: 

  ⎛         ⎛ 2        ⎞⎞
  ⎜x   c⋅log⎝b ⋅x + b⋅c⎠⎟
a⋅⎜─ - ─────────────────⎟
  ⎜b            2       ⎟
  ⎝            b        ⎠
于 2012-07-20T08:17:17.680 に答える