如何获取SymPy表达式的实部?实部分离异常问题
SymPy中无法正确提取表达式实部的解决方法
问题出在你定义的符号a和b默认属于复数域,SymPy无法确定它们是否存在虚部,因此调用re()时会展开成包含re()和im()的通用形式,而非你预期的实数项。
解决方法:定义符号时指定实数属性
在创建符号时添加real=True参数,明确告知SymPy a和b是实数:
from sympy import * # 定义a、b为实符号 a, b = symbols('a b', real=True) z1 = a + b*I z2 = expand(z1**3) # expand已足够,无需额外simplify print(z2) # 提取实部 print(re(z2))
执行后输出:
a**3 + 3*I*a**2*b - 3*a*b**2 - I*b**3 a**3 - 3*a*b**2
原理说明
SymPy的符号默认属于复数空间,当未明确实数属性时,re()函数会对每个符号的实部、虚部分别计算,得到最通用的复数实部表达式。而当指定real=True后,SymPy会认定a和b的虚部为0,实部就是它们本身,此时re()可以直接筛选出表达式中的实数项。
补充:事后添加实数假设
如果已经定义了符号,也可以通过assume()补充实数假设:
a, b = symbols('a b') assume(a, real=True) assume(b, real=True) z1 = a + b*I z2 = expand(z1**3) print(re(z2)) # 同样得到a**3 - 3*a*b**2
内容的提问来源于stack exchange,提问作者gpv
相关产品推荐
相关产品推荐

