Производные суммирования

Время от времени я использую 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]) 

Однако здесь уже суммирование происходит из-за смешения кортежей python и суммирования sympy.

Как я могу выполнять индексированные производные базы или какое-то обходное решение?

3 Solutions collect form web for “Производные суммирования”

С версией разработки Sympy ваш пример работает.

Чтобы установить версию разработки Sympy, просто потяните ее с помощью git :

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

Затем запустите python с этого пути или установите PYTHONPATH для включения этого каталога перед установкой Python по умолчанию.

Ваш пример в версии разработки:

 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 

Где вы получаете дельту Кронекера .

Если вам не хочется устанавливать версию разработки Sympy, просто дождитесь следующей полной версии (вероятно, выйдет осенью этого года), она будет поддерживать производные от IndexedBase .

Я не знаю, почему подход 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]) 

Я не понимаю, что вы хотите сделать. Однако, возможно, это поможет. Отредактировано в ответ на два полученных комментария.

 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 
Python - лучший язык программирования в мире.