根据变量列表区分函数列表

时间:2017-12-27 21:35:51

标签: python arrays sympy differentiation

假设我有一个功能列表

f = ['m','n', 'z']

和变量列表

v = ['x', 'y', 'z'] 

现在

m = x**2
n = y**2
z = x*y

这里有两个重要的事情:

  • 它们是列表,因此“string”必须转换为“symbols”或“Function”
  • 'z'是一个函数,也是一个变量!所以他们是不同的,dz / dz不统一。这取决于'z'是什么函数。在这种情况下,dz / dx应为y,dz / dz应为0.(假设d为偏导数)

现在我想区分函数列表中关于变量列表的所有元素的所有元素,输出将是一个多维数组。我正在尝试这个没有相同的变量和函数名称(这里只打印一个派生,但最终我需要一个完整的数组):

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

4 个答案:

答案 0 :(得分:3)

你正在寻找的是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]])

答案 1 :(得分:1)

要认识到的一件事是我们在创建符号时使用的字符串与这些符号的名称无关。你可以

a = Symbol('b')

现在a是一个符号,其字符串表示为'b'。在您的代码中,此符号称为a,而不是b。特别是,创建Funct = [Function('m'), Function('n')]然后分配m = x**2不会对您创建的功能执行任何操作:mFunction('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]] 

答案 2 :(得分:0)

为什么不做以下简单的事情?

import sympy as sp

x, y = sp.symbols('x, y')
m, n, z = x**2, y**2, x*y
f = [m, n, z]
v = [x, y]

H = [[fun.diff(var) for var in v] for fun in f]
print(H)

enter image description here

答案 3 :(得分: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]])