当 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 *
中导入,因此您只需不要将其替换为您自己的变量即可。
尝试使用 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 *
中导入,因此您只需不要将其替换为您自己的变量即可。