You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SymPy Lambdify能否替换Add、Mul核心函数实现自定义运算?

自定义SymPy加法/乘法实现符号方程计算

问题背景

需要用自定义加法和乘法实现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)

运行结果不符合预期:自定义addVectors未被调用,反而执行了列表拼接。尝试多种lambdify参数配置均无效。

验证语法正确性:参照文档替换cos为自定义函数可正常运行,推测Add和Mul作为SymPy的表达式类型而非普通函数,无法被lambdify直接识别替换。

解决方案:结合replace与lambdify

通过replace将表达式类型替换为支持多参数的SymPy函数,再用lambdify映射到自定义逻辑,实现通用场景需求。代码如下:

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

关键说明

  • 利用replace实现表达式类型到函数的转换;
  • 替换需选用支持多参数输入的SymPy函数,目前找到Min、Max、lerchphi三个符合要求;
  • SymPy会自动简化Min和Max,无法同时使用,因此选用lerchphi(加法映射)和Max(乘法映射);
  • 最后通过lambdify将这两个SymPy函数映射到自定义的addVectors和mulVectors。

内容的提问来源于stack exchange,提问作者xareth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:52:50