2

我尝试了此代码,但出现错误。如果可能,请告诉我如何对定义的函数代码进行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:无法确定关系的真值”这是我得到的错误请帮助,谢谢。

4

1 回答 1

3

请注意, 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()

结果图

于 2020-06-13T23:15:24.287 回答