def nsev_inverse_example2(): """nsev_inverse_example: create a N=2.2 Satsuma-Yajima pulse from nonlinear spectrum.""" D = 1024 M = 2 * D Tmax = 15 tvec = np.linspace(-Tmax, Tmax, D) # calculate suitable frequency bonds (xi) rv, xi = nsev_inverse_xi_wrapper(D, tvec[0], tvec[-1], M) xivec = xi[0] + np.arange(M) * (xi[1] - xi[0]) / (M - 1) # analytic field: chirp-free N=2.2 Satsuma-Yajima pulse q = 2.2 / np.cosh(tvec) # semi-analytic nonlinear spectrum bound_states = np.array([0.7j, 1.7j]) disc_norming_const_ana = [1.0, -1.0] cont_b_ana = 0.587783 / np.cosh(xivec * np.pi) * np.exp(1.0j * np.pi) # call the function res = nsev_inverse(xivec, tvec, cont_b_ana, bound_states, disc_norming_const_ana, cst=1, dst=0) print("\n----- options used ----") print(res['options']) print("\n------ results --------") print("FNFT return value: %d (should be 0)" % res['return_value']) # compare result to analytic function print("nsev-inverse example: Satsuma-Yajima N=2.2") print("Difference analytic - numeric: sum((q_ana-q_num)**2) = %.2e (should be approx 0) " % np.sum( np.abs(q - res['q']) ** 2)) return res
def nsev_inverse_example(): """Mimics the C example for calling fnft_nsev_inverse.""" print("\nnsev inverse example") # set values M = 2048 D = 1024 tvec = np.linspace(-2, 2, D) T1 = tvec[0] T2 = tvec[-1] alpha = 2.0 beta = 0.55 gamma = np.sqrt( np.abs(alpha)**2 + np.abs(beta)**2) kappa = 1 # get the frequency intervall suited for the given time vector rv, XI = nsev_inverse_xi_wrapper(D, T1, T2, M) Xi1 = XI[0] Xi2 = XI[1] xivec = XI[0] + np.arange(M) * (XI[1] - XI[0]) / (M - 1) # set continuous spectrum contspec = alpha / (xivec - beta * 1.0j) # set discrete spectrum bound_states = np.array([1.0j * beta]) normconst_or_residues = np.array([-1.0j * alpha / (gamma + beta)]) # call function res = nsev_inverse(xivec, tvec, contspec, bound_states, normconst_or_residues) # print results print("\n----- options used ----") print(res['options']) print("\n------ results --------") print("FNFT return value: %d (should be 0)" % res['return_value']) print("Total number of samples calculated: %d" % D) print("some samples:") for i in range(0, D, 64): print(" %d : q(t=%.5f) = %.5e + %.5e j " % (i, tvec[i], np.real(res['q'][i]), np.imag(res['q'][i]))) res['Xi'] = np.array([Xi1,Xi2]) return res
def setUp(self): D = 512 M = 2 * D Tmax = 15 tvec = np.linspace(-Tmax, Tmax, D) rv, xi = nsev_inverse_xi_wrapper(D, tvec[0], tvec[-1], M) xivec = xi[0] + np.arange(M) * (xi[1] - xi[0]) / (M - 1) # semi-analytic nonlinear spectrum bound_states = np.array([0.7j, 1.7j]) disc_norming_const_ana = [1.0, -1.0] cont_b_ana = 0.587783 / np.cosh(xivec * np.pi) * np.exp(1.0j * np.pi) self.xivec = xivec self.tvec = tvec self.cont_b_ana = cont_b_ana self.bound_states = bound_states self.disc_norming_const_ana = disc_norming_const_ana self.expected = { 'qsamprange': [0, -1, 40], 'q_both': np.array( [1.34282821e-06 + 5.90905693e-16j, 1.40927340e-05 + 6.69759843e-16j, 1.47533087e-04 - 8.49415093e-16j, 1.54437857e-03 + 1.22641929e-16j, 1.61660017e-02 + 2.70942564e-15j, 1.68966183e-01 + 9.95269660e-15j, 1.52429449e+00 + 1.04462643e-14j, 9.88595941e-01 + 1.57705840e-14j, 9.97145517e-02 + 6.45254951e-15j, 9.53104365e-03 + 1.87953249e-15j, 9.10510486e-04 - 5.58634639e-16j, 8.69798167e-05 - 7.22303874e-16j, 8.30772437e-06 + 9.63333629e-16j]), 'q_disc': np.array( [5.09548061e-09 - 0.j, 1.36459139e-07 - 0.j, 3.65443384e-06 - 0.j, 9.78673225e-05 - 0.j, 2.62101136e-03 - 0.j, 7.03972926e-02 - 0.j, 1.69330859e+00 - 0.j, 9.18642908e-01 + 0.j, 3.35346003e-02 + 0.j, 1.25083775e-03 + 0.j, 4.67066469e-05 + 0.j, 1.74405899e-06 + 0.j, 6.51243941e-08 + 0.j]), 'q_cont': np.array( [1.15243924e-07 - 6.57512209e-16j, 1.27802639e-06 + 7.04459178e-16j, 1.34080356e-05 + 2.15209454e-16j, 1.40365068e-04 - 1.10360319e-15j, 1.46934384e-03 + 4.21307084e-16j, 1.53587945e-02 + 2.81885851e-15j, 1.38560954e-01 + 1.43110043e-14j, 8.98666443e-02 + 8.74350146e-15j, 9.06369089e-03 + 2.14242869e-15j, 8.66276590e-04 - 1.04369988e-16j, 8.27537156e-05 - 9.43644219e-16j, 7.90416963e-06 + 6.57722413e-16j, 7.51076324e-07 + 6.32640626e-16j]), 'q_none': np.array( [[0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j]])}