Как «нормализовать» (?) Вектор после fft в MATLAB? - PullRequest
1 голос
/ 02 июня 2019

Я хочу перейти от реального пространства репр. в импульсном пространстве репр. У меня есть оператор Гамильтона (модель Андерсона), и я вычислил некоторую энтропию его собственных состояний (это работает, я вижу, чего хочу). Далее я хочу перейти к импульсу repr. используя fft, и теперь мои собственные состояния в импульсном пространстве не нормализуются (?). Например. если я вычислю сумму собственных состояний ^ 2, она должна быть 1, но она не работает.

Я попытался суммировать собственные значения ^ 2 и нормализовал их, но это не работает (я показываю код без каких-либо неудачных попыток).

N=100; %dim of matrix
Nx=15; %number of points
%because of log scale
xmin = -3.0;
xmax =  3.0;
dx = (xmax - xmin)/(Nx-1);
x = zeros(1,Nx); %x axis pre
ss = zeros(1,Nx); %entropy pre
spp=zeros(1,Nx); %entropy in Fourier space pre
eps=1.0e-6;

for ix=1:Nx
    %log scale
    x(ix) = xmin + (ix-1)*dx;
    xx = 10.0^x(ix);

    average_s=0;
    average_spp=0;
    %anderson modell
    W=xx;
    r=rand(1,N)*W-(W/2);
    A=diag(ones(1,N-1),1)+diag(ones(1,N-1),-1)+diag(r);
    %diagonalization
    [V,D]=eig(A);
    %PROBLEM HERE:
    %Fourier transformation
    P=fft(V)/(sqrt(2*pi)*N);
    P=abs(P);
    for j=1:N
        four_sum=0; square_sum=0; entropy=0;
        four_sum_p=0; square_sum_p=0; entropyp=0;
        for i=1:N
            %Fou
            probp=(P(i,j)).^2;
            square_sum_p=square_sum_p+probp;
            if probp>eps
                entropyp=entropyp-probp*log(probp);
            end;
            four_sum_p=four_sum_p+probp.^2;

            %Real
            prob=V(i,j).^2;
            square_sum=square_sum+prob;
            if prob>eps
                entropy=entropy-prob*log(prob);
            end;
            four_sum=four_sum+prob.^2;
        end
        qp=square_sum_p.^2/(four_sum_p);
        average_spp=average_spp+entropyp-log(qp);

        q=square_sum.^2/(four_sum);
        average_s=average_s+entropy-log(q);
    end
    ss(ix)=average_s/N;
    spp(ix)=average_spp/N;
end
plot(x,ss,x,spp);

Структурная энтропия в реальном пространстве (вектор ss) имеет правильную форму, но в импульсном пространстве (spp) после fft это не то, что я хочу, и она не нормируется.

1 Ответ

0 голосов
/ 03 июня 2019

Что произойдет, если вы напишите

P = fft(V) / sqrt(N); 

Потому что, когда я читаю справочную документацию FFT в Matlab, она показывает, что FFT

         N   
X(k) =  Sum  x(n) * exp( -i*2*pi* (k-1) * (n-1)/N ),    1 <= k <= N
        n=1

Но ваша матрица собственных векторовV является унитарным, и когда вы переключаетесь в импульсное пространство с помощью БПФ, вам нужно снова получить унитарную матрицу, поэтому вам нужно, чтобы дискретное преобразование Фурье (DFT) было унитарным оператором (DFT - это просто матрица показателей, как вы можетесм. на матричном уравнении ниже).Поэтому, чтобы сделать DFT унитарным преобразованием, вам нужна формула

enter image description here

Если вы возьмете две разные строки матрицы дискретного преобразования Фурье, скажем, строки k и m, и образуя их эрмитово-точечное произведение, вы получаете

enter image description here

А когда вы расширяете и упрощаете его

enter image description here

Когда вы смотрите на эту сумму ближе

enter image description here enter image description here

Таким образом, ДПФ является унитарной матрицей, поэтому он преобразует нормализованные собственные состояния гамильтонина в представлении положения в соответствующие нормализованные собственные состояния гамильтониана в представлении импульса.

...