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

如何在SymPy中将复指数重写为三角函数形式(避免求值为根式)

解决Sympy复指数转三角函数形式而非根式的问题

要让Sympy将复指数e^(2πi/8)转换为cos(2π/8) + i sin(2π/8)的形式(而非展开为根式),需要阻止Sympy自动化简特殊角的三角函数值,同时保留原始角度的书写形式。以下是两种可行方法:

方法一:用UnevaluatedExpr保留原始角度

from sympy import E, pi, I, UnevaluatedExpr

# 用UnevaluatedExpr包裹原始角度,避免自动约分
theta = UnevaluatedExpr(2 * pi / 8)
root = E ** (I * theta)

# 重写为三角函数形式
trig_form = root.rewrite(cos)
print(trig_form)  # 输出:cos(2*pi/8) + I*sin(2*pi/8)

# 单独提取实部和虚部
real_part, imag_part = trig_form.as_real_imag()
print(real_part)  # cos(2*pi/8)
print(imag_part)  # sin(2*pi/8)

方法二:手动构造表达式并阻止求值

from sympy import pi, I, cos, sin

theta = 2 * pi / 8
# 用hold()阻止Sympy自动计算特殊角的三角函数值
real_part = cos(theta).hold()
imag_part = sin(theta).hold()

trig_form = real_part + I * imag_part
print(trig_form)  # cos(2*pi/8) + I*sin(2*pi/8)
print(real_part)  # cos(2*pi/8)
print(imag_part)  # sin(2*pi/8)

补充:若接受角度化简为π/4但保留三角函数形式

如果可以接受角度被约分为π/4,仅需阻止三角函数值展开为根式,可使用全局求值禁用上下文:

from sympy import E, pi, I, cos, sin
from sympy import evaluate

with evaluate(False):
    root = E ** (I * pi / 4)
    trig_form = root.rewrite(cos)
    print(trig_form)  # 输出:cos(pi/4) + I*sin(pi/4)

关键原理

  • UnevaluatedExpr:包裹表达式以保留原始书写形式,避免Sympy自动约分或求值。
  • hold():针对单个函数调用生效,阻止特殊角三角函数的数值化简。
  • evaluate(False):临时禁用全局自动求值,所有表达式保持符号化状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:20:24