FastNFT / FNFT

Fast numerical computation of (inverse) nonlinear Fourier transforms
https://fastnft.github.io/FNFT/
GNU General Public License v2.0
42 stars 12 forks source link

FNFT when input is A sech(t), where A = N+1/2 (N = 1, 2, 3,... ) #75

Closed xuchuang7916 closed 1 year ago

xuchuang7916 commented 1 year ago

Hello Dr. Sander Wahls, I find when the input waveform Asech(t) has amplitude A = 1.5, or 2.5, 3.5..., as shown in the figures below, the continuous spectrum is extremely high, which seems strange as this may violate the Parseval Identity for NFT, and if these FNFT results are fed into iFNFT, it won't return the original waveform (this also happens when A is close to 1.5).

So A = N+1/2 (N = 1, 2, 3,... ) seems to be a critical number? but many references only give the NFT result when A = N and N+|α| (α<1/2) there is a ref. I'm not sure what the NFT result should be theoretically in "A = N+1/2" cases. Could you please have a look at it? Thanks a lot.

9cb240290cf7146e3970333b8dc4b29

55fbf5de23be781d851da49b3908ce8

wahls commented 1 year ago

Dear @xuchuang7916 ,

What is happening here is that a new eigenvalue is being "born" at A=N+1/2. The corresponding zero of a(lambda) is exactly on the real line and will move up into the upper half-plane if you increase A.

The reflection coefficient b/a therefore has a pole, which is difficult to deal with numerically. Many theoretical results on the inverse NFT simply exclude such cases case because it complicates things. There is often a condition like |a(xi)|>0, which is violated if a(xi) has a real zero. I would not expect it to violate the Parseval relation, though.

Numerically, you can somehow improve things by using b(xi) instead of the reflection coefficient. Try this:

T = [-10, 10];
D = 1024;
kappa = +1;

ep_t = (T(2) - T(1)) / (D - 1);
t = T(1):ep_t:T(2);
q = 2.5j*sech(t);

M = 2*D;
[XI xi] = mex_fnft_nsev_inverse_XI(D, T, M);

[contspec, bound_states, normconsts] = mex_fnft_nsev(q, T, XI, kappa, 'M', M, 'cstype_ab');
b = contspec(M+1:end);
q2 = mex_fnft_nsev_inverse(b, XI, bound_states, normconsts, D, T, kappa, 'cstype_b_of_xi');

plot(t, abs(q), t, abs(q2), '--');

The result is not perfect, but pretty good. Hope this helps.

Best, Sander

xuchuang7916 commented 1 year ago

Dear Dr. @wahls Wonderful! Thanks a lot for your reply and explanation. I attempted using b_contspec only in iFNFT, but without adding the optional input 'cstype_b_of_xi', so I failed. So only b(xi) is also enough for inverse NFT? We don't necessarily need to use the true contspec, i.e., b(xi)/a(xi)?

Do you mean sth like "an integral of a boundless function is not necessarily boundless" when you say "I would not expect it to violate the Parseval relation, though"? such as $$\int_0^1 1/\sqrt{1-x^2} dx = \pi/2$$ image By the way, I would like to ask two more questions.

  1. the difference between 'residuals' and 'normconsts' in _mex_fnft_nsev_ function. The former is written in the function of mex_fnftnsev, the latter in the mex_fnft_nsev_example.m. They are also defined as different things in mex_fnft_nsev_inverse_. I can only guess one of them means the discrete spectrum coefficient. % [contspec, bound_states, normconsts] = MEX_FNFT_NSEV(q, T, XI, kappa) %%% Compute the nonlinear Fourier transform %%% [contspec, bound_states, residuals] = mex_fnft_nsev(q, T, XI, kappa);
  2. is there a way to let _mex_fnftnsev return the b_discSpec and a'_discSpec, just similar to what 'cstype_ab' does for contspec?

Thanks a lot.

wahls commented 1 year ago

Dear @xuchuang7916,

You're welcome. Using b(xi)/a(xi) to represent the continuous spectrum and (lambda_k, b_k/a'_k) to represent the discrete spectrum is one possibility to define the NFT, but one can also define it instead using b(xi) for the continuous spectrum and (lambda_k, b_k) for the discrete spectrum. That is done e.g. in the book of Faddeev and Takhtajan ("Hamiltonian Methods in the Theory of Soliton"). They are equivalent.

Regarding the Parseval relation, yes, this is what I meant. Lemma 2 in our paper https://www.mdpi.com/1099-4300/22/6/639 actually provides a proof for this point in the context of b-modulation. There is also an illustration in Figure 5.

The residues ("residuals" is actually a typo) correspond to using b_k/a'_k for the discrete spectrum. Norming constants correspond to using b_k instead. FNFT supports both cases.

Although mex_fnft_nsev internally computes both b(xi) and a'(xi) when the reflection coefficient is desired, it currently cannot return these values to the user.

Best, Sander

xuchuang7916 commented 1 year ago

Dear @wahls Thanks a lot for your kind help and detailed explanation! That's an ocean of mathematics haha, I admire these works a lot, and you guys for diving into so much! Let me try to get some engineering intuition from the ocean's surface.

Regards, Chuang

wahls commented 1 year ago

Thanks, and good luck.