使用 sympy 的盒子函数的傅里叶级数
Fourier series of a box function using sympy
我试过这段代码,但出现错误。如果可能的话,请告诉我如何对定义的函数进行 lambdify
代码
from sympy.abc import x
from sympy import *
init_printing()
def func(y):
if y>0:
return 1
elif y<0:
return -1
else:
return 0
s = fourier_series(func(x), (x, -1, 1))
s = s.truncate(n=4)
s
"TypeError: cannot determine truth value of Relational"
这是我得到的错误
请帮忙,
谢谢。
请注意,sympy 只能使用完全定义为 sympy 表达式的函数。模拟if - elif - else
、Piecewise can be used. There is also a special function, Heaviside,直接对应你给定的函数。默认情况下,Heaviside(0)
未定义。但是,0
的值可以作为第二个参数提供。
在这种情况下使用 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()
我试过这段代码,但出现错误。如果可能的话,请告诉我如何对定义的函数进行 lambdify 代码
from sympy.abc import x
from sympy import *
init_printing()
def func(y):
if y>0:
return 1
elif y<0:
return -1
else:
return 0
s = fourier_series(func(x), (x, -1, 1))
s = s.truncate(n=4)
s
"TypeError: cannot determine truth value of Relational" 这是我得到的错误 请帮忙, 谢谢。
请注意,sympy 只能使用完全定义为 sympy 表达式的函数。模拟if - elif - else
、Piecewise can be used. There is also a special function, Heaviside,直接对应你给定的函数。默认情况下,Heaviside(0)
未定义。但是,0
的值可以作为第二个参数提供。
在这种情况下使用 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()