我的目标是用我自己定制的乘法和加法实现来计算一个基本的符号等式,比如ad(b + c)
.
我试图用我自己的函数来使用lambdify
来翻译两个核心的SymPy函数(Add
和Mul
),但是我无法识别它们.
在这个阶段,我只是想让Add
开始工作.我有的代码如下.
from sympy import *
import numpy as np
x, y = symbols('x y')
A = [1,1]
B = [2,2]
def addVectors(inA, inB):
print("running addVectors")
return np.add(inA, inB)
# Test vector addition
print(addVectors(A,B))
# Now using lambdify
f = lambdify([x, y], x + y, {"add":addVectors})
print(f(A, B)) # <------- expect [3,3] and addVectors to be run a second time
# but I get the same as this
print(A + B)
哪一种yield
running addVectors
[3 3]
[1, 1, 2, 2]
[1, 1, 2, 2]
我原本希望使用自定义addVectors
函数计算表达式中的+
运算符.这意味着结果会是这样的.
running addVectors
[3 3]
running addVectors
[3 3]
[1, 1, 2, 2]
我try 了lambdify
系列的几种不同配置,这些配置都给出了相同的原始结果.
f = lambdify([x, y], x + y, {"add":addVectors})
f = lambdify([x, y], x + y, {"Add":addVectors})
f = lambdify([x, y], x + y, {"+":addVectors})
f = lambdify([x, y], Add(x,y), {"Add":addVectors})
f = lambdify([x, y], x + y)
为了确认语法是否正确,我使用了一个更接近文档的示例,并用SIN实现替换了符号cos
函数.
from sympy import *
import numpy as np
x = symbols('x')
def mysin(x):
print('taking the sin of', x)
return np.sin(x)
print(mysin(1))
f = lambdify(x, cos(x), {'cos': mysin})
f(1)
它的工作和预期一样,并产生了
taking the sin of 1
0.8414709848078965
taking the sin of 1
0.8414709848078965
是否可以使用lambdify实现我自己的Add
和Mul
函数?
我怀疑我的问题是Add
(和Mul
)不是SymPy的‘函数’.文档中将它们称为"表达式",这意味着它们在lambdify
过程中不会被识别为替换.
我一直在读的一些链接: SymPy cos个 SymPy Add 一百零二
如有任何建议,我们将不胜感激.感谢你读到这一步.
EDIT: Got a more general case working个
它使用lambdify
和replace
函数的组合来取代Add
和Mul
.然后,此示例计算格式为ad(b + c)
的表达式,这是目标.
from sympy import *
import numpy as np
w, x, y, z = symbols('w x y z')
A = [3,3]
B = [2,2]
C = [1,1]
D = [4,4]
def addVectors(*args):
result = args[0]
for arg in args[1:]:
result = np.add(result, arg)
return result
def mulVectors(*args):
result = args[0]
for arg in args[1:]:
result = np.multiply(result, arg)
return result
expr = w*z*(x + y)
print(expr)
expr = expr.replace(Add, lambda *args: lerchphi(*args))
expr = expr.replace(Mul, lambda *args: Max(*args))
print(expr)
f = lambdify([w, x, y, z], expr, {"lerchphi":addVectors, "Max":mulVectors})
print(f(A, B, C, D))
print(mulVectors(A,D,addVectors(B,C)))
哪一种yield
w*z*(x + y)
Max(w, z, lerchphi(x, y))
[36 36]
[36 36]
关于此解决方案,有几点需要注意:
- 使用
replace
函数,您可以将类型替换为函数(type-gt;func).See the docs. - 我用来替换类型的函数必须接受多个输入,因为表达式中的每个类型可能有两个以上的参数(如上例中的Multiply).我只找到了3个接受
*args
作为输入的函数.它们分别是Min
、Max
和lerchphi
. - 从
Max(x, Min(x, y)) = x
开始,SymPy简化了Min
和Max
个函数.这意味着我不能同时使用Min
和Max
.所以我用了lerchphi
和Max
.这些函数是任意的,因为我将在下一步将它们的实现转换为自定义函数.然而,这意味着我只能替换两个. - 最后一步是将
lerchphi
和Max
转换为定制函数.