-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMCMC.m
78 lines (57 loc) · 3.23 KB
/
MCMC.m
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function [ parameters ] = MCMC( measurements, model, parameters, sigma_algorithm, scheme_comparaison, number_iteration )
% Proceed to the Metropolis-Hasting algorithm
% Outpout : parameters.scheme, parameters.coefficients (si besoin,
% parameters.coefficients_upwind, _downwind, _center)
q_algorithm=makedist('Normal','mu',0,'sigma',sigma_algorithm); % distribution normale centrée en 0
if ~scheme_comparaison
total_acceptance = 0;
N=length(parameters.coefficients(1,:));
for i=1:number_iteration % à chaque itération, on fait :
compteur = 0;
for k=1:N % pour chaque échantillon, on fait :
[ parameters, compteur ] = markov_iteration( measurements, model, parameters, sigma_algorithm, q_algorithm, k, compteur );
end
acceptance=compteur/N;
total_acceptance = total_acceptance + acceptance;
calcul_effectue = i/number_iteration;
avancement = strcat({'Avancement: '}, {num2str(100*calcul_effectue)}, {'%'});
display(avancement);
end
acceptance_ratio = strcat({'Acceptance ratio: '},{num2str(100*total_acceptance/number_iteration)},{'%'});
display(acceptance_ratio);
else
% Localize each scheme
localization.center = find(~parameters.scheme); % indices correspondant au schéma centré
localization.upwind = find(~(1-parameters.scheme)); % idem pour l'amont
localization.downwind = find(~(1+parameters.scheme)); % idem pour l'aval
N=length(parameters.coefficients(1,:));
total_acceptance = 0;
total_acceptance_scheme = 0;
for i=1:number_iteration % à chaque itération, on fait :
compteur = 0;
compteur_scheme = 0;
for k=1:N % pour chaque échantillon, on fait :
[ parameters, compteur_scheme ] = exchange_scheme( parameters, k, compteur_scheme, localization);
% réalisation de l'itération
[ parameters, compteur ] = markov_iteration( measurements, model, parameters, sigma_algorithm, q_algorithm, k, compteur );
end
acceptance=compteur/N;
acceptance_scheme=compteur_scheme/N;
total_acceptance = total_acceptance + acceptance;
total_acceptance_scheme = total_acceptance_scheme + acceptance_scheme;
calcul_effectue = i/number_iteration;
avancement = strcat({'Avancement: '}, {num2str(100*calcul_effectue)}, {'%'});
display(avancement);
localization.center = find(~parameters.scheme); % indices correspondant au schéma centré
localization.upwind = find(~(1-parameters.scheme)); % idem pour l'amont
localization.downwind = find(~(1+parameters.scheme)); % idem pour l'aval
end
acceptance_ratio = strcat({'Acceptance ratio: '},{num2str(100*total_acceptance/number_iteration)},{'%'});
display(acceptance_ratio);
acceptance_ratio_scheme = strcat({'Acceptance ratio scheme: '},{num2str(100*total_acceptance_scheme/number_iteration)},{'%'});
display(acceptance_ratio_scheme);
parameters.coefficients_upwind = parameters.coefficients(:,localization.upwind);
parameters.coefficients_downwind = parameters.coefficients(:,localization.downwind);
parameters.coefficients_center = parameters.coefficients(:,localization.center);
end
end