2016-08-28 5 views
8

나는 때때로 sympy를 사용하지만,별로 좋지 않습니다. 현재 색인 된 변수 목록 (예 : n1에서 nmax까지)을 정의하고 합계를 수행하는 데 주저합니다. 다음합계의 파생물

는 지금까지 시도 : 그럼 난 미분을 할 수 있도록하려면 내가 하나 개의 변수에 대한 미분을하려고하면, 그러나

numSpecies = 10 
n = IndexedBase('n') 
i = symbols("i",cls=Idx) 
nges = summation(n[i],[i,1,numSpecies]) 

,이 실패

diff(nges,n[5]) 

나는 또한 IndexedBase으로 작업하는 것을 피하려고 노력했다.

numSpecies = 10 
n = symbols('n0:%d'%numSpecies) 
k = symbols('k',integer=True) 
ntot = summation(n[k],[k,0,numSpecies]) 

그러나 여기에서는 이미 파이썬 튜플과 sympy 합계를 혼합하기 때문에 합계가 실패합니다.

인덱스 기반 파생 상품 또는 어떤 종류의 대안을 어떻게 수행 할 수 있습니까?

+1

내 특정 문제에 대한 답변은 Bill Bell과 Stelios에게 감사드립니다. 가능한 한 간단하게 본보기를 만들었으므로 사소한 것처럼 보일 수 있습니다. 장기적으로 더 복잡한 방정식의 합계를 정의해야합니다.내 문제는 화학 공학 분야입니다. 종종 당신은 화학 종의 존중 된 몰 분율에 가중치를 부여한 어떤 종류의 재산의 합계가있는 방정식을 접하게됩니다. 종종 특정 종의 변화에 ​​대해 상기 함수의 도함수를 계산할 필요가있다. – Johannes

+0

@Johannes 여러분 환영합니다! 가중치 합계와 같은 더 복잡한 문제를 처리 할 수 ​​있어야한다고 생각합니다. 그래도 문제가 있다면 다른 질문을 올리는 것을 주저하지 마십시오. – Stelios

답변

4

symPy의 개발 버전에서는 예제가 작동합니다.

git clone git://github.com/sympy/sympy.git 
cd sympy 

그런 다음 경로에서 파이썬을 실행하거나 파이썬의 기본 설치하기 전에 그 디렉토리를 포함하도록 PYTHONPATH을 설정

git으로 풀다운, SymPy의 개발 버전을 설치하십시오.

개발 버전에 대한 귀하의 예 :

In [9]: nges_uneval = Sum(n[i], [i,1,numSpecies]) 

In [10]: nges_uneval 
Out[10]: 
    10  
___  
╲   
    ╲ n[i] 
    ╱  
╱   
‾‾‾  
i = 1  

In [11]: diff(nges_uneval, n[5]) 
Out[11]: 
    10  
___  
╲   
    ╲ δ 
    ╱ 5,i 
╱   
‾‾‾  
i = 1  

In [12]: diff(nges_uneval, n[5]).doit() 
Out[12]: 1 

은 또한 다음 SymPy 버전이 상징을 도출 할 수있을 것으로주의 사항 :

In [3]: numSpecies = 10 

In [4]: n = IndexedBase('n') 

In [5]: i = symbols("i",cls=Idx) 

In [6]: nges = summation(n[i],[i,1,numSpecies]) 

In [7]: nges 
Out[7]: n[10] + n[1] + n[2] + n[3] + n[4] + n[5] + n[6] + n[7] + n[8] + n[9] 

In [8]: diff(nges,n[5]) 
Out[8]: 1 

당신은 또한 합계의 계약 양식을 사용할 수 있습니다 상징적 인 지표가있는 곳 :

여기서 Kronecker delta.

SymPy 개발 버전을 설치하고 싶지 않은 경우 다음 가을의 전체 버전 (올 가을에 나올 예정)을 기다리면 IndexedBase 파생 상품을 지원합니다.

+0

빠른 질문 하나. 인덱싱 된 기본 함수를 정의 할 수 있는지 알고 있습니까? 이자형. f_i (T) i는 지수인가? 지금까지 나는 문서에서 아무것도 찾을 수 없었다. 꼭 필요한 것은 아니지만,이 기능으로 나는 내 모든 문제를 적어두고 소리가 나는 방식으로 sympy로 해결할 수있다. 친애하는. – Johannes

+0

현재 지원되지 않는 것 같습니다. IndexedBase는 심볼 또는 문자열을 인수로 필요로합니다. 여전히 IndexedBase의 서브 클래 싱을 시도하고 메소드를 오버라이드 할 수는 있지만 다소 길다. –

1

나는 왜 IndexedBase 접근 방식이 작동하지 않는지 알지 못합니다. (나는 또한 알고있을 것입니다). 그러나 다음을 수행 할 수 있습니다.

import sympy as sp 

numSpecies = 10 
n = sp.symbols('n0:%d'%numSpecies) # note that n equals the tuple (n0, n1, ..., n9) 

ntot = sum(n)  # sum elements of n using the standard 
        # Python function for summing tuple elements 
#ntot = sp.Add(*n) # same result using Sympy function 

sp.diff(ntot, n[5]) 
+0

개발 버전에서 수정되었습니다. –

+0

@FrancescoBonazzi 감사합니다! – Stelios

1

나는 당신이하고 싶은 일에 대해 명확하지 않습니다. 그러나 아마도 이것이 도움이 될 것입니다. 받은 두 개의 댓글에 대한 응답으로 편집 됨.

from sympy import * 

nspecies = 10 
[var('n%s'%_) for _ in range(nspecies)] 

expr = sympify('+'.join(['n%s'%_ for _ in range(nspecies)])) 
expr 
print (diff(expr,n1)) 

expr = sympify('n0**n1+n1**n2') 
expr 
print (diff(expr,n1)) 

최초의 표현식 만이 원래의 질문에 응답합니다. 이것이 결과입니다.

1 
n0**n1*log(n0) + n1**n2*n2/n1 
+0

나는 vars의 목록을 만들 필요가 없었다! –

+0

이미지를 텍스트 형식으로 변환 할 수 있습니까? 현재 귀하의 답변을 사용/테스트하기가 어렵습니다. –

+0

sympifying 문자열없이 기호를 직접 생성 할 수 있습니다. –