请注意, sympy 只能与完全定义为 sympy 表达式的函数一起使用。要模拟if - elif - else
,可以使用Piecewise 。还有一个特殊功能Heaviside直接对应于您的给定功能。默认,Heaviside(0)
未定义。但是,0
可以将 for 的值作为第二个参数提供。
在这种情况下,使用 Heaviside 函数似乎不起作用:
from sympy import Heaviside, fourier_series
from sympy.abc import x
s = fourier_series(Heaviside(x, 0), (x, -1, 1))
print(s)
这会导致 sympy 无法进行进一步操作的未评估积分:
FourierSeries(Heaviside(x, 0), (x, -1, 1), (Integral(Heaviside(x, 0), (x, -1, 1))/2, SeqFormula(cos(_n*pi*x)*Integral(cos(_n*pi*x)*Heaviside(x, 0), (x, -1, 1)), (_n, 1, oo)), SeqFormula(sin(_n*pi*x)*Integral(sin(_n*pi*x)*Heaviside(x, 0), (x, -1, 1)), (_n, 1, oo))))
幸运的是,有了 Piecewise,一切都按预期进行:
from sympy import lambdify, Piecewise, fourier_series
from sympy.abc import x
s = fourier_series(Piecewise((1, x > 0), (-1, x < 0), (0, True)), (x, -1, 1))
该函数可以被lambdified调用lambdify(x, s.truncate(n=4))
,然后用于例如通过matplotlib绘制曲线:
import numpy as np
import matplotlib.pyplot as plt
for k in range(1, 7):
s_np = lambdify(x, s.truncate(n=k))
xs = np.linspace(-1, 1, 500)
plt.plot(xs, s_np(xs), label=f'$n={k}$')
plt.autoscale(enable=True, axis='x', tight=True)
plt.legend()
plt.show()
