2012-07-19 2 views
3

현재 수학 계산을 돕기 위해 Sympy을 사용하고 있습니다. 지금 당장은 수치 적 통합을 시도하고 있지만 스크립트를 실행할 때마다 계속 오류가 발생합니다. 여기에 스크립트입니다Python에서 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] 

편집 : 저는 여기에 스크립트를 실행할 때 내가 얻을 출력 좋아을, 그래서 프로그램이 사용 울프 람 알파에 넣어 것을 숫자를 꺼냈다. 적분이 수렴하지 않음을 알 수 있습니다. 따라서 오차가 발생합니다. 나는 그것이 단지 수학 오류라고 생각한다.

답변

5

숫자 작업에 기호 라이브러리를 사용하는 것은 매우 나쁜 생각입니다. scipy/numpy를 사용하면됩니다. 즉, 그렇게 단순한 통합을 위해 sympy를 사용할 수있었습니다. 그러나 실제로는 불투명 한 함수의 모든 것을 덤프하지 않고 sympy 표현식을 사용해야합니다.

첫째, 파이썬 작업에 변수를 할 방법 :이 작업 ig 더 이상 심벌 아니다

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

후에는 flux 단지 리턴 값이다.

모든 기호를 정의한 다음 그 기호로 표현을 만드십시오. 적분은 sympy가 그것을 처리하기에 충분히 간단하다.

마지막으로, 귀하의 경우와 같이 간단하게 const*x/(x-const)과 같은 정수는 소프트웨어로 낭비하지 않고 손으로 수행해야합니다.

[편집] 나는 그것을 깔끔하게 재 작성했으며 여전히 버그 때문에 sympy가 올바르게 통합되지 않습니다. 메일 링리스트 또는 이슈 트래커에서이를보고 할 수 있으며이를 수정하려고 시도 할 것입니다. 즉, 표현은 매우 간단해서 손으로 통합 할 수 있습니다.

[EDIT2]

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

    ⎛   ⎛ 2  ⎞⎞ 
    ⎜x c⋅log⎝b ⋅x + b⋅c⎠⎟ 
a⋅⎜─ - ─────────────────⎟ 
    ⎜b   2  ⎟ 
    ⎝   b  ⎠ 
관련 문제