1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
function [ possible_lens_placement, possible_lens_set, possible_sample_energy, pick_of_n_best_lens_placements, index ] = mode_match( q0, qf, Ltot, lambda, lens_permutations )
%MODE_MATCH Summary of this function goes here
% Detailed explanation goes here
n_perms = size(lens_permutations,1);
n_shuffles=20; %number of random placements of lenses
%Initialize sample arrays
N = n_perms * n_shuffles;
possible_lens_placement = zeros(N,3);
possible_lens_set = zeros(N,3);
possible_sample_energy = zeros(N,1);
initial_rand_lens_placement=zeros(N,3);
lens_size = .03; % physical size of the lens
for ip = 1:n_perms
f3=lens_permutations(ip,3);
x3=Ltot-f3; % last lense transfer collimated region to focused spot
for is = 1:n_shuffles
possible_lens_set((ip-1)*n_shuffles + is,:) = lens_permutations(ip,:);
initial_rand_lens_placement_tmp = sort(lens_size+(x3-2*lens_size)*rand(1,2));
initial_rand_lens_placement((ip-1)*n_shuffles + is,:) = [initial_rand_lens_placement_tmp, x3];
end
end
parfor i = 1:N
fitness_simplified=@(x) fitness(q0, qf, Ltot, x, possible_lens_set(i,:), lambda );
[x_sol, energy]=fminsearch(fitness_simplified, initial_rand_lens_placement(i,:), optimset('TolX',1e-8,'TolFun',1e-8,'MaxFunEvals',1e8,'MaxIter',200));
possible_lens_placement(i,:) =x_sol;
possible_sample_energy(i) = energy;
end
%Sorting possible solution according to energy
[possible_sample_energy, index] = sort(possible_sample_energy);
possible_lens_placement = possible_lens_placement(index,:);
possible_lens_set = possible_lens_set(index,:);
%Truncate other possible solutions to an accuracy of n decimal places
n=4;
possible_lens_placement_trunc = round(possible_lens_placement*10^n)./10^n;
[possible_lens_placement_uniq, index] = unique(possible_lens_placement_trunc,'rows','stable'); %Unique solutions only
pick_of_n_best_lens_placements = min(5,size(possible_lens_placement_uniq,1));
end
|