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

Sympy中提取特定变量全部系数的问题求助

SymPy提取变量系数异常问题

问题描述

使用SymPy的coeff()方法提取变量系数时出现不符合预期的结果:

场景1:复杂表达式提取u1系数

原始表达式:

X1*X2*(u1 - u2 + u3 - u4)/(4*a*b) + X1*(-u1 + u2 + u3 - u4)/(4*a) + X2*(-u1 - u2 + u3 + u4)/(4*b) + u1/4 + u2/4 + u3/4 + u4/4

预期提取u1的全部系数:

X1*X2/(4*a*b) + -X1/(4*a) + -X2/(4*b) + 1/4

SymPy实际返回:

1/4

场景2:简单表达式提取u1系数

原始表达式:

(-u1 + u2 + u3 - u4)/(4*a)

预期提取u1的系数:

-1/(4*a)

SymPy实际返回:

0

示例代码

import sympy as sp
import numpy as np

a0, a1, a2, a3, X1, X2, a, b = sp.symbols('a0 a1 a2 a3 X1 X2 a b')
u1, u2, u3, u4 = sp.symbols('u1 u2 u3 u4')
Disp = a0 + a1*X1 + a2*X2 + a3*X1*X2

Eq1 = Disp.subs({X1: -a, X2: -b})
Eq2 = Disp.subs({X1: a, X2: -b})
Eq3 = Disp.subs({X1: a, X2: b})
Eq4 = Disp.subs({X1: -a, X2: b})

sol = sp.solve([Eq1 - u1, Eq2 - u2, Eq3 - u3, Eq4 - u4]
               , [a0, a1, a2, a3], dict=True)
a0, a1, a2, a3 = sol[0][a0], sol[0][a1], sol[0][a2], sol[0][a3]
Disp1 = a0 + a1*X1 + a2*X2 + a3*X1*X2
# print(Disp1)
N1 = Disp1.as_expr()
N2 = Disp1.coeff(u2)
print(N2)

问题原因与解决方案

SymPy的coeff()方法默认仅识别表达式完全展开后,变量作为独立项的系数。如果变量被包裹在分式分子、括号组合中,coeff()无法直接识别,需先对表达式执行展开操作。

修复示例

场景2修复

expr = (-u1 + u2 + u3 - u4)/(4*a)
expanded_expr = sp.expand(expr)
coeff_u1 = expanded_expr.coeff(u1)
print(coeff_u1)  # 输出:-1/(4*a)

场景1修复

expr = X1*X2*(u1 - u2 + u3 - u4)/(4*a*b) + X1*(-u1 + u2 + u3 - u4)/(4*a) + X2*(-u1 - u2 + u3 + u4)/(4*b) + u1/4 + u2/4 + u3/4 + u4/4
expanded_expr = sp.expand(expr)
coeff_u1 = expanded_expr.coeff(u1)
print(coeff_u1)  # 输出:X1*X2/(4*a*b) - X1/(4*a) - X2/(4*b) + 1/4

示例代码修复

对Disp1先展开再提取系数:

N2 = sp.expand(Disp1).coeff(u2)
print(N2)

内容的提问来源于stack exchange,提问作者Никита Петров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:17:16