2016-08-28 12 views
8

私は時々sympyを使用していますが、あまり良くありません。現時点では、インデックス付き変数のリストを定義することに取り組んでいます。つまり、n1からnmaxまでの合計を実行します。それから私は、微分を取ることができるようにしたい:和の微分

は、これまでのところ、私は次のことを試してみました:私は1つの変数に関して導関数を取るしようとした場合

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]) 

しかし、ここですでに合計はPythonのタプルとsympy和を混合するので失敗しました。

インデックスベースの派生商品や何らかの回避策をどのように実行できますか?

+1

私の特定の問題に対する答えは、Bill BellとSteliosに感謝します。私は私の例をできるだけシンプルにしていたので、それは本当に些細なことかもしれません。長期的には、より複雑な方程式の集計を定義する必要があります。私の問題は化学工学の分野です。しばしば化学種の尊重されたモル分率に重み付けされた何らかの種類のプロパティの合計を持つ方程式に遭遇します。しばしば、特定の種の変化に関する上記関数の導関数を計算することが必要である。 – Johannes

+0

@Johannesようこそ!私はあなたが今加重合計のようなもっと複雑な問題に対処できるはずだと信じています。それでも問題が解決しない場合は、別の質問を投稿するのをためらってください。 – Stelios

答えて

4

symPyの開発版では、あなたの例が動作します。

だけgitでそれをプルダウン、SymPyの開発版をインストールするには:

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

そして、そのパスからのpythonを実行するか、Pythonのデフォルトのインストールする前にそのディレクトリを含めるようにPYTHONPATHを設定します。

開発版の

あなたの例:あなたはまた、和の短縮形を使用することができ

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 

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 [13]: j = symbols("j") 

In [13]: diff(n[i], n[j]) 
Out[13]: 
δ 
j,i 

Kronecker delta

SymPy開発版をインストールしたくない場合は、次のフルバージョン(今秋にリリース予定)を待つだけで、IndexedBaseの派生語をサポートします。

+0

しかし、簡単な質問。インデックス付きの基底関数を定義することが可能かどうかを知っていますか? e。 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

私はあなたがしたいことについて明確ではありません。しかし、おそらくこれが役に立ちます。受け取った2つのコメントに応じて編集されました。

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

私はヴァルスのリストを作る必要はありませんでした! –

+0

イメージをテキスト形式のコードに変換できますか?現在、あなたの答えを使用/テストするのは難しいです。 –

+0

シンボリックな文字列を使用せずにシンボルを直接生成できます。 –