求和导数

2024-10-02 08:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常使用sympy,但不是很擅长。目前,我只能定义索引变量的列表,即n1到nmax并对其执行求和。然后我想得到导数:

到目前为止,我尝试了以下方法:

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

但是,如果我尝试对一个变量求导数,则失败:

^{pr2}$

我还试图避免使用^{}。在

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

但是,这里的求和已经失败了,因为混合了python元组和sympy求和。在

如何执行indexedbase衍生工具或某种解决方法?在


Tags: 方法列表定义cls导数symbolssympysummation
3条回答

我不知道为什么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])

对于SymPy的开发版本,您的示例是有效的。在

要安装SymPy的开发版本,只需使用git将其下拉:

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

然后从该路径运行python,或者在python的默认安装之前设置PYTHONPATH以包含该目录。在

开发版本示例:

^{pr2}$

您也可以使用合同形式的总和:

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的派生版本。在

我不清楚你想做什么。然而,也许这会有所帮助。根据收到的两条评论进行编辑。在

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

只有第一个表达式回答了原来的问题。这是输出。在

^{pr2}$

相关问题 更多 >

    热门问题