SymPy多变量幂次替换两类需求咨询:奇次幂转换与批量替换
SymPy 问题解答
问题1:将x_i的奇次幂转换为x_i*(y_i^n)形式
要实现把所有x_i^(2n+1)转换为x_i*(y_i^n),可以利用SymPy的replace方法结合模式匹配批量处理,以下是两种可行方案:
方案1:Lambda表达式匹配替换
from sympy import * x1, x2, x3, y1, y2, y3 = symbols("x1 x2 x3 y1 y2 y3") term = x1**5 + (x2**2)*(x3**3) + x1**4 + x1**3 + x1**2 + x1 # 先完成x²到y的批量替换 term = term.subs({x1**2: y1, x2**2: y2, x3**2: y3}) # 定义x与对应y的变量对 var_pairs = [(x1, y1), (x2, y2), (x3, y3)] # 遍历处理每个x的奇次幂 for x, y in var_pairs: term = term.replace( # 判断是否为x的奇次幂项 lambda expr: expr.is_Pow and expr.base == x and expr.exp.is_odd, # 转换为x*y^((指数-1)//2) lambda expr: x * (y ** ((expr.exp - 1) // 2)) ) print(term) # 输出:x1*y1**2 + x1*y1 + x1 + x3*y2*y3 + y1**2 + y1
方案2:Wild匹配指数
通过Wild定义匹配规则,直接匹配x^(2n+1)的结构:
from sympy import * x1, x2, x3, y1, y2, y3 = symbols("x1 x2 x3 y1 y2 y3") term = x1**5 + (x2**2)*(x3**3) + x1**4 + x1**3 + x1**2 + x1 term = term.subs({x1**2: y1, x2**2: y2, x3**2: y3}) var_pairs = [(x1, y1), (x2, y2), (x3, y3)] n = Wild('n', integer=True, positive=True) # 匹配正整数n for x, y in var_pairs: term = term.replace(x**(2*n + 1), x*y**n) print(term) # 输出同上
问题2:批量替换x_i²到对应y_i
完全可以批量完成,SymPy的subs方法支持传入字典参数,一次性完成所有替换:
基础批量替换
# 替换原来的三个subs语句为一行 term = term.subs({x1**2: y1, x2**2: y2, x3**2: y3})
动态生成替换字典(适合变量较多的场景)
如果x和y变量是按规律命名的(如x1xn、y1yn),可以用列表推导式动态生成替换字典:
# 生成x1-x3和y1-y3 xs = symbols('x1:4') ys = symbols('y1:4') # 生成替换字典{x1**2:y1, x2**2:y2, x3**2:y3} replace_dict = {x**2: y for x, y in zip(xs, ys)} term = term.subs(replace_dict)
内容的提问来源于stack exchange,提问作者Bilbo Baggins
相关产品推荐
相关产品推荐

