def test_messy(): from sympy import (laplace_transform, Si, Shi, Chi, atan, Piecewise, acoth, E1, besselj, acosh, asin, And, re, fourier_transform, sqrt) assert laplace_transform(Si(x), x, s) == ((-atan(s) + pi/2)/s, 0, True) assert laplace_transform(Shi(x), x, s) == (acoth(s)/s, 1, True) # where should the logs be simplified? assert laplace_transform(Chi(x), x, s) == \ ((log(s**(-2)) - log((s**2 - 1)/s**2))/(2*s), 1, True) # TODO maybe simplify the inequalities? assert laplace_transform(besselj(a, x), x, s)[1:] == \ (0, And(S(0) < re(a/2) + S(1)/2, S(0) < re(a/2) + 1)) # NOTE s < 0 can be done, but argument reduction is not good enough yet assert fourier_transform(besselj(1, x)/x, x, s, noconds=False) == \ (Piecewise((0, 4*abs(pi**2*s**2) > 1), (2*sqrt(-4*pi**2*s**2 + 1), True)), s > 0) # TODO FT(besselj(0,x)) - conditions are messy (but for acceptable reasons) # - folding could be better assert integrate(E1(x)*besselj(0, x), (x, 0, oo), meijerg=True) == \ log(1 + sqrt(2)) assert integrate(E1(x)*besselj(1, x), (x, 0, oo), meijerg=True) == \ log(S(1)/2 + sqrt(2)/2) assert integrate(1/x/sqrt(1 - x**2), x, meijerg=True) == \ Piecewise((-acosh(1/x), 1 < abs(x**(-2))), (I*asin(1/x), True))
def test_messy(): from sympy import (laplace_transform, Si, Shi, Chi, atan, Piecewise, acoth, E1, besselj, acosh, asin, And, re, fourier_transform, sqrt) assert laplace_transform(Si(x), x, s) == ((-atan(s) + pi / 2) / s, 0, True) assert laplace_transform(Shi(x), x, s) == (acoth(s) / s, 1, True) # where should the logs be simplified? assert laplace_transform(Chi(x), x, s) == \ ((log(s**(-2)) - log((s**2 - 1)/s**2))/(2*s), 1, True) # TODO maybe simplify the inequalities? assert laplace_transform(besselj(a, x), x, s)[1:] == \ (0, And(S(0) < re(a/2) + S(1)/2, S(0) < re(a/2) + 1)) # NOTE s < 0 can be done, but argument reduction is not good enough yet assert fourier_transform(besselj(1, x)/x, x, s, noconds=False) == \ (Piecewise((0, 4*abs(pi**2*s**2) > 1), (2*sqrt(-4*pi**2*s**2 + 1), True)), s > 0) # TODO FT(besselj(0,x)) - conditions are messy (but for acceptable reasons) # - folding could be better assert integrate(E1(x)*besselj(0, x), (x, 0, oo), meijerg=True) == \ log(1 + sqrt(2)) assert integrate(E1(x)*besselj(1, x), (x, 0, oo), meijerg=True) == \ log(S(1)/2 + sqrt(2)/2) assert integrate(1/x/sqrt(1 - x**2), x, meijerg=True) == \ Piecewise((-acosh(1/x), 1 < abs(x**(-2))), (I*asin(1/x), True))
def fourier(self): """Attempt Fourier transform""" F = sym.fourier_transform(self.expr, self.var, f) if hasattr(self, '_fourier_conjugate_class'): F = self._fourier_conjugate_class(F) return F
def fourier_sympy(expr, t, f): result = sym.fourier_transform(expr, t, f) if expr != 0 and result == 0: # There is a bug in SymPy where it returns 0. raise ValueError('Could not compute Fourier transform for ' + str(expr)) return result
def verify_5a(answer): import sympy x = sympy.Symbol('x', real=True) k = sympy.Symbol('k', real=True) func = sympy.exp(-x**2) solution = sympy.fourier_transform(func, x, k) return answer == solution
def fourier_sympy(expr, t, f): result = sym.fourier_transform(expr, t, f) if expr != 0 and result == 0: # There is a bug in SymPy where it returns 0. raise ValueError('Could not compute Fourier transform for ' + str(expr)) if isinstance(result, sym.FourierTransform): raise ValueError('Could not compute Fourier transform for ' + str(expr)) return result
from sympy import Piecewise, Abs from sympy.abc import W, n from matplotlib.backend_bases import KeyEvent import matplotlib.pyplot as plt def on_key(event:KeyEvent): if event.key == 'escape': plt.close() #%% DTFT # 三角波序列 xn = Piecewise((0, (n < -1) | (n > 1)), (n+1, n < 0), (1-n, n >= 0)) # xW = fourier.dtft(xn) xW = sy.fourier_transform(xn, n, W) # 因为dtft不能计算,使用ft来绘图 print('xn: ', [xn.subs(n, j).evalf() for j in range(5)]) print('xW: ', [Abs(xW.subs(W, j).evalf()) for j in range(5)]) fig = plt.figure('Discrete Time Fourier Transform') fig.canvas.mpl_connect('key_press_event', on_key) ax = fig.add_subplot(1, 2, 1) xn_range = np.linspace(-2, 2, 51) xn_points = [xn.subs(n, j).evalf() for j in xn_range] ax.stem(xn_range, xn_points, linefmt='g-', basefmt='o', use_line_collection=True) ax = fig.add_subplot(1, 2, 2) xW_range = (np.linspace(-2*5, 2*5, 255)) xW_points = [Abs(xW.subs(W, j).evalf()) for j in xn_range]*5 ax.plot(xW_range, xW_points) ax.set_xlabel(r'$|X(e^{j\Omega})|-\Omega$') plt.show()
def update_spectrum(self): self.spectrum = fourier_transform(self.autocorrelation, tau, omega/(2*pi))
# In[130]: w = sympy.symbols("omega") # In[131]: f = sympy.exp(-a * t**2) # In[132]: help(sympy.fourier_transform) # In[133]: F = sympy.fourier_transform(f, t, w) # In[134]: F # In[135]: sympy.inverse_fourier_transform(F, w, t) # ## Versions # In[136]: get_ipython().magic(u'reload_ext version_information')
h = ax.plot_surface(x,y,z, cmap = 'jet', edgecolor='k') plt.colorbar(h) ax.set_xlabel('X', fontweight='bold', fontsize=14) ax.set_ylabel('Y', fontweight='bold', fontsize=14) ax.set_zlabel('Z', fontweight='bold', fontsize=14) ax.set_title('Spherical Bessel function', fontweight='bold', fontsize=16) plt.show() import sympy as sp from sympy import fourier_transform, exp,symbols from sympy.abc import x, k a=fourier_transform(exp(-x**2), x, k) s=symbols('s') Ori=(s)*exp(-(x**2)/(s**2)) FT=fourier_transform(Ori,x,k) a.subs({k:1}).evalf() from scipy.special import legendre N = 1000 xval = np.linspace(-1,1,N) def frank(x,n): leg = legendre(n) P_n = leg(x) return P_n
g2t_con = conjugate(g2t) g3t_con = conjugate(g3t) # 高斯函数前三阶导数的能量归一化因子 C0 = sqrt(1 / integrate(g0t * g0t_con, (t, -oo, +oo))) C1 = sqrt(1 / integrate(g1t * g1t_con, (t, -oo, +oo))) C2 = sqrt(1 / integrate(g2t * g2t_con, (t, -oo, +oo))) C3 = sqrt(1 / integrate(g3t * g3t_con, (t, -oo, +oo))) # 能量归一化后的高斯小波 gauss0 = C0 * g0t gauss1 = (-1)**2 * C1 * g1t gauss2 = (-1)**3 * C2 * g2t gauss3 = (-1)**4 * C3 * g3t # 能量归一化后的高斯小波的傅里叶变换 ftg0 = fourier_transform(gauss0, t, f) ftg1 = fourier_transform(gauss1, t, f) ftg2 = fourier_transform(gauss2, t, f) ftg3 = fourier_transform(gauss3, t, f) # 能量归一化后的高斯小波的中心频率 fc0 = integrate(f * ftg0 * conjugate(ftg0), (f, 0, +oo)) / integrate(ftg0 * conjugate(ftg0), (f, 0, +oo)) fc1 = integrate(f * ftg1 * conjugate(ftg1), (f, 0, +oo)) / integrate(ftg1 * conjugate(ftg1), (f, 0, +oo)) fc2 = integrate(f * ftg2 * conjugate(ftg2), (f, 0, +oo)) / integrate(ftg2 * conjugate(ftg2), (f, 0, +oo)) fc3 = integrate(f * ftg3 * conjugate(ftg3), (f, 0, +oo)) / integrate(ftg3 * conjugate(ftg3), (f, 0, +oo))