-
Notifications
You must be signed in to change notification settings - Fork 1
/
application_1_q2.m
125 lines (100 loc) · 3.73 KB
/
application_1_q2.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
%Donner les 20 valeurs propres de plus grand module
clc;
clear;
close all;
%Délai en secondes entre chaque graphique
delai_entre_graphiques = 10;
%Vrai si on doit afficher les graphiques
afficher_graphiques = 0;
%==================================================================
epsilon = 10e-10;
A = generer_matrice_laplacien();
fprintf("20 premières valeurs propres de plus grand module:\n")
for i=1:20
[lambda, u, A] = deflation_wielandt(A, epsilon);
fprintf("\t%f\n", lambda)
if(afficher_graphiques)
close all;
tracer_graphique(u, lambda, "(Valeurs propres de plus grand module)");
pause(delai_entre_graphiques);
end
end
fprintf("\n")
% ===================================================== %
% %
% %
% ENSEMBLE DES METHODES UTILITAIRES %
% %
% %
% ===================================================== %
% ==============================================================
% Dessine le vecteur propre u sous forme de graphique coloré
% ==============================================================
function tracer_graphique(u, lambda, s)
figure(1);
surf(reshape(u, [15 40]), 'FaceColor', 'interp');
title(sprintf("Graphique de l'onde pour \\lambda=%f u.a.\n%s", lambda, s));
xlabel('X');
ylabel('Y');
xlim([1 40]);
ylim([1 15]);
zlabel('Altitude (z)');
view(3);
set(gca, 'Ydir', 'reverse');
colormap(jet);
colorbar();
end
% =================================================
% Génère la matrice du Laplacien de l'onde
% =================================================
function [A] = generer_matrice_laplacien()
A = zeros(600, 600);
%On parcourt les lignes de la matrice
for i=1:600
%Coordonnées sur le plateau (15x40)
[i1, j1] = indiceVersCoords(i);
%Cas des bordures où il n'y a aucune variation d'altitude
if((i1 == 1 && j1 == 1) || (i1 == 1 && j1 >= 15) || j1 == 40 || i1 == 15 || (i1 == 11 && j1 >= 10 && j1 <= 17))
A(i, i) = 1;
%Cas des cases standards
else
nbVoisins = 0;
%On parcourt les colonnes de la matrice pour appliquer un coeff
%pour prendre en compte les voisins
for j=1:600
[i2, j2] = indiceVersCoords(j);
v = voisins(i1, j1, i2, j2);
nbVoisins = nbVoisins + v;
A(i, j) = v;
end
A(i, i) = -nbVoisins;
end
end
end
% =========================================================================
%Renvoie les coordonnées de l'intersection correspondant a l'indice donnee
%en parametre.
%Les intersections sont listées colonnes par colonnes, ainsi
%l'intersection 1 correspond aux coords (j=1, i=1), l'intersection 2
%correspond aux coords (j=1, i=2).
% =========================================================================
function [i, j] = indiceVersCoords(indice)
i = mod(indice - 1, 15) + 1;
j = floor((indice - 1) / 15) + 1;
end
% ===========================================================================
%Retourne vrai si les deux intersections (i1, j1) et (i2, j2) sont voisines
% ===========================================================================
function [b] = voisins(i1, j1, i2, j2)
b = 0;
delta_i = abs(i1 - i2);
delta_j = abs(j1 - j2);
%---------------------------------------
%On gère le cas général, les intersections adjacentes
%---------------------------------------
%On vérifie que les intersections sont côte à côte, l'expression équivalente à
%un xor évite de prendre les diagonales en compte
if((delta_i == 1 && delta_j == 0) || (delta_i == 0 && delta_j == 1))
b = 1;
end
end