求和导数
Derivative of summations
我不时使用 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 求和。
我如何执行 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
使用 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
从哪里获得 Kronecker delta。
如果您不想安装 SymPy 开发版,请等待下一个完整版本(可能会在今年秋天推出),它将支持 IndexedBase
.
的衍生版本
我不时使用 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 求和。
我如何执行 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
使用 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
从哪里获得 Kronecker delta。
如果您不想安装 SymPy 开发版,请等待下一个完整版本(可能会在今年秋天推出),它将支持 IndexedBase
.