MATLAB - расчет не дает исходную картину, когда сделано в обратном порядке - PullRequest
0 голосов
/ 02 июля 2019

Я работаю над проектом с электрическими полями, и мне нужно сделать несколько простых математических расчетов. Дано E_in (x, y) и E_m (x, y) , которые связаны

E_in = сумма (a_m. * E_m) ,

(где суммирование по индексу m ), мне нужно найти коэффициенты a_m . Для этого, интеграл

a_m = int (coni (E_m). * E_in dx dy) ,

следует оценить. Здесь coe (E_m) - комплексное сопряжение поля E_m. Теперь у меня есть E_m и E_in , заданные как 100x100 матрицами, и мой код выглядит следующим образом:

ПРИМЕЧАНИЕ: E_m.mat - это ячейка 1x312, которая включает в себя матрицу 100x100 в каждой ячейке. Вы можете просто создать несколько случайных комплексных матриц и попробовать это таким образом. Моя проблема не зависит от точных значений внутри этих матриц, как вы увидите ниже.

%% 1. INITIAL PARAMETERS
coreRadius = 100; pixel = 100; % load(E_m.mat,E_m)

%% 2. CREATE THE INPUT FIELD

% Gaussian input field
% taken from "Thomas Dideriksen - Custom 2D Gauss - Mathworks File Exchange", the link is:
% https://www.mathworks.com/matlabcentral/fileexchange/9556-custom-2d-gauss
inputField = MMFcreateGaussian([pixel,pixel], 100, 100, 0, 0, 6, [0,0]);

В этот момент график abs (inputField). ^ 2 дает ...

Input field E_in

%% 3. FIND THE WEIGHT OF EACH FIELD IN THE INPUT GAUSSIAN PROFILE
% i.e. solve the overlap integral in the second formula
% normalize each field
% Here, I want to make the absolute square of any field E_m to be equal to "1"

for i = 1:length(E_m)
    E_m{i} = E_m{i} ./ sqrt( sum( abs( E_m{i}(:) ).^2 ) );
end

% find the conjugate of each field
% This is necessary for finding a_m (check the first equation above)

for k = 1:length(E_m)
    conjE_m{k} = conj(E_m{k});  
end

% find all a_m's and try to re-create the original inputField above
for mode = 1:length(E_m)
    a_m{mode} = sum(sum( conjE_m{mode} .* inputField )); % finding a_m's in the second equation 
    outputField{mode} =  a_m{mode} .* E_m{mode};         % multiplying each a_m with the corresponding E_m 
end

% sum every field to obtain the total field
totalOutField = sum(cat(3,outputField{:}),3);

То, что я делал в последних строках, можно выразить формулой

E_out = сумма (a_m. * E_m) ,

, которое должно быть равным моему начальному полю ввода, то есть E_out = E_in . Таким образом, когда я строю график abs (totalOutField). ^ 2 , я должен получить ту же картинку, что и выше. Но вместо этого я получаю ...

output intensity profile

Итак, мой вопрос : В чем проблема в этом коде, так что мне не удается получить ту же картинку в обратном процессе? Спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...