当 n 被定义为正整数时,为什么 sympy 不评估 sin(n* pi) = 0 和 cos(n * pi) = (-1)^n?

Why doesn't sympy evaluate sin(n* pi) = 0 and cos(n * pi) = (-1)^n when n is defined to be positive integers?

尝试使用 Sympy 计算函数 f(x) 时,最终输出似乎以符号形式保留 sin(n * pi) 和 cos (n * pi),但不将它们计算为 0 和 (- 1)^n分别当n被定义为正整数时。但是,Symbolab 似乎能够执行上述行为。

有没有办法让 Sympy 计算类似于 Symbolab 所做的表达式?

在 Sympy 中生成行为的最小示例

# Load libraries
import sympy as sp
from sympy import*
from IPython.display import display
init_printing()

# To turn off bugging warnings
import warnings
warnings.filterwarnings('ignore')
x,L,pi = symbols('x, L, pi', real = True, positive = true)
n = symbols('n', positive = True, integer=True)

a_n_x = 2/L
a_n_in = x * cos((n*pi*x)/L)
display(a_n_in)
a_n = a_n_x * integrate(a_n_in, (x,0,2))
display(a_n)
a_n = a_n.subs(L,2)
display(a_n)

您需要确保n是一个整数,否则恒等式不成立:

n = symbols('n', integer=True)
trigsimp( cos(pi * n) ) # Prints (-1)**n

为了得到想要的结果,我们不得不使用sympy.cos()和sympy.pi。更新后的最小可重现示例更详细地演示了此约定

# Load libraries
import sympy as sp
from sympy import*
from IPython.display import display
init_printing()

# To turn off bugging warnings
import warnings
warnings.filterwarnings('ignore')
x,L = symbols('x, L', real = True, positive = True)
n = symbols('n', positive = True, integer=True)

a_n_x = 2/L
a_n_in = x * sp.cos((n*pi*x)/L)
display(a_n_in)
a_n = a_n_x * integrate(a_n_in, (x,0,2))
display(a_n)
a_n = a_n.subs(L,2)
display(a_n.simplify())

编辑:12/4/2021 基于 @kaya3

在 SymPy 中如何定义 pi 的详细解释

问题出在这一行:

x,L,pi = symbols('x, L, pi', real = True, positive = true)

这将 pi 定义为正实数变量,因此它的处理方式与任何其他正实数变量一样 - 特别是,sin(n * pi)cos(n * pi) 无法简化,可能超过 sin(n * x)cos(n * x)。您将其命名为 pi 并不重要。

要修复它,请使用 sympy 模块本身定义的符号 pi,SymPy 将其理解为常量 π。这已经在行 from sympy import * 中导入,因此您只需不要将其替换为您自己的变量即可。