[英]Differentiation of a list of functions with respect to a list of variables
假设我有一个功能列表
f = ['m','n', 'z']
和变量列表
v = ['x', 'y', 'z']
现在
m = x**2
n = y**2
z = x*y
这里有两件重要的事情:
现在,我要相对于变量列表的所有元素来区分函数列表的所有元素,并且输出将是多维数组。 我在没有相同的变量和函数名称的情况下尝试了此操作(这里仅打印一个派生变量,但最终我需要一个完整的数组):
from sympy import *
f = ['m', 'n']
v = ['x', 'y']
variable = [var(i) for i in v]
Funct = [Function(i) for i in f]
m = x**2
n = y**2
print(diff(Funct[0], variable[0]))
它给出了这个错误:
print(diff(Funct[0], variable[0]))
File "/usr/local/lib/python2.7/site-packages/sympy/core/function.py", line 1837, in diff
return Derivative(f, *symbols, **kwargs)
File "/usr/local/lib/python2.7/site-packages/sympy/core/function.py", line 1136, in __new__
if symbol_set.difference(expr.free_symbols):
TypeError: 'property' object is not iterable
您正在寻找的被称为Jacobian,可以用SymPy计算如下:
>>> x, y, z = symbols('x y z')
>>> Matrix([x**2, y**2, x*y]).jacobian([x, y, z])
Matrix([
[2*x, 0, 0],
[ 0, 2*y, 0],
[ y, x, 0]])
要意识到的一件事是,我们在创建符号时使用的字符串与这些符号的名称无关。 你可以有
a = Symbol('b')
现在a
是一个符号,其字符串表示形式为'b'。 在您的代码中,此符号称为a
,而不是b
。 特别是,创建Funct = [Function('m'), Function('n')]
,然后分配m = x**2
对创建的函数没有任何作用: m
和Function('m')
之间没有连接Function('m')
。
另外,SymPy并没有真正区分函数 ,而是区分表达式 (插入了某些东西的函数)。 下面创建给定表达式和变量的导数的双重列表:
variables = symbols("x y z")
expressions = [x**2, y**2, x*y]
print([[diff(e, v) for v in variables] for e in expressions])
输出:
[[2*x, 0, 0], [0, 2*y, 0], [y, x, 0]]
您可以尝试derive_by_array
:
In [3]: f = [i(x, y, z) for i in symbols(['m','n', 'z'], cls=Function)]
In [4]: f
Out[4]: [m(x, y, z), n(x, y, z), z(x, y, z)]
In [5]: derive_by_array(f, [x, y, z])
Out[5]:
⎡∂ ∂ ∂ ⎤
⎢──(m(x, y, z)) ──(n(x, y, z)) ──(z(x, y, z))⎥
⎢∂x ∂x ∂x ⎥
⎢ ⎥
⎢∂ ∂ ∂ ⎥
⎢──(m(x, y, z)) ──(n(x, y, z)) ──(z(x, y, z))⎥
⎢∂y ∂y ∂y ⎥
⎢ ⎥
⎢∂ ∂ ∂ ⎥
⎢──(m(x, y, z)) ──(n(x, y, z)) ──(z(x, y, z))⎥
⎣∂z ∂z ∂z ⎦
SymPy的下一版本将支持更紧凑的语法:
diff(f, [[x, y, z]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.