如何将多变量SymPy表达式lambdify为单参数x的函数?
问题描述
现有SymPy表达式1.0 * H * L ** 3 * W **2,包含变量H、L、W。使用sp.lambdify([sp.Symbol(vari) for vari in variables], 表达式)会生成接收H、L、W三个单独参数的函数,但需求是生成以x为参数的函数,其中H=x[0]、L=x[1]、W=x[2]。尝试直接用xreplace将变量替换为x[index]后执行lambdify未成功,寻求可行实现方法。
解决方案
方法一:使用SymPy的IndexedBase处理数组索引
通过IndexedBase定义数组符号x,将原变量替换为x的索引形式,再执行lambdify:
import sympy as sp # 定义数组符号x x = sp.IndexedBase('x') # 定义原变量和表达式 H, L, W = sp.symbols('H L W') expr = 1.0 * H * L**3 * W**2 # 建立变量到x索引的映射 var_index_map = {H: x[0], L: x[1], W: x[2]} # 替换表达式中的变量 expr_with_x = expr.subs(var_index_map) # 生成以x为参数的函数 func = sp.lambdify('x', expr_with_x, modules='numpy') # 可根据需求替换为'math'等模块 # 测试示例 import numpy as np test_input = np.array([2, 3, 4]) print(func(test_input)) # 输出:864.0
方法二:包装多参数函数
先生成接收单独参数的函数,再用一个简单的包装函数将数组x拆分为对应参数传入:
import sympy as sp # 定义变量和表达式 H, L, W = sp.symbols('H L W') expr = 1.0 * H * L**3 * W**2 # 生成多参数函数 multi_param_func = sp.lambdify([H, L, W], expr) # 包装成单参数x的函数 def array_param_func(x): return multi_param_func(x[0], x[1], x[2]) # 测试示例 test_input = [2, 3, 4] print(array_param_func(test_input)) # 输出:864.0
方法三:直接在lambdify中使用lambda表达式映射
通过lambdify的modules参数自定义变量到x索引的映射:
import sympy as sp # 定义变量和表达式 H, L, W = sp.symbols('H L W') expr = 1.0 * H * L**3 * W**2 # 生成函数,自定义模块映射变量到x的索引 func = sp.lambdify( 'x', expr, modules={'H': lambda x: x[0], 'L': lambda x: x[1], 'W': lambda x: x[2]} ) # 测试示例 test_input = [2, 3, 4] print(func(test_input)) # 输出:864.0
内容的提问来源于stack exchange,提问作者adrckul
相关产品推荐
相关产品推荐

