0% ont trouvé ce document utile (0 vote)
27 vues13 pages

Optimisation

Ce compte rendu de TP présente des travaux sur l'optimisation non linéaire, en utilisant MATLAB pour visualiser des fonctions et appliquer diverses méthodes d'optimisation. Les résultats montrent que la méthode de Newton est plus rapide et efficace que la méthode du gradient, bien que cette dernière soit plus robuste. Le TP a permis d'approfondir la compréhension des concepts d'optimisation et de développer des compétences pratiques dans la résolution de problèmes complexes.

Transféré par

aansaya2002
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
27 vues13 pages

Optimisation

Ce compte rendu de TP présente des travaux sur l'optimisation non linéaire, en utilisant MATLAB pour visualiser des fonctions et appliquer diverses méthodes d'optimisation. Les résultats montrent que la méthode de Newton est plus rapide et efficace que la méthode du gradient, bien que cette dernière soit plus robuste. Le TP a permis d'approfondir la compréhension des concepts d'optimisation et de développer des compétences pratiques dans la résolution de problèmes complexes.

Transféré par

aansaya2002
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

République Algérienne démocratique et populaire

Ministère de l’enseignement supérieur et de la recherche scientifique

Université M’hamed BOUGARA Boumerdes


Faculté de Technologie
Département génie mécanique

Compte rendu du TP Optimisation

Réalisé par :
 M’zala Aya
 Ansar Aya karima

Année universitaire : 2024/2025


1. Introduction et but de TP :

Ce travail pratique (TP) porte sur l'optimisation non linéaire et explore diverses techniques et
méthodes pour résoudre des problèmes complexes. À travers une série d'exercices, nous avons
utilisé MATLAB pour visualiser des fonctions, analyser leur convexité, et appliquer des
méthodes de gradient et de Newton pour identifier les minima locaux. Les exercices abordent
également la minimisation de volumes et l'utilisation de méthodes de calcul avancées, telles
que les algorithmes génétiques et la méthode Fmincon, pour trouver des solutions optimisées.
L'objectif de ce TP est de renforcer notre compréhension des concepts théoriques et de
développer nos compétences pratiques en optimisation.

2. Optimisation linéaire :
2.1. Résoudre le problème en utilisant la méthode de graphe :

Min z = 2x1 + 4x2


x1 ≥ 6 x1=6
x1 ≤ 10 x1=10
x2 ≤ 4 x2=4
x2 ≥ 1 x2=1
2x1 - 2x2 ≥ 4
2x1 - 2x2 = 4 : A(0 ; 2) ; B(6 ;4)
4,5x1 + 6x2 ≥ 16
4,5x1 + 6x2 = 16 : C(1 ; 2,22) ; D(2,6 ; 0)
x1 ,x2 ≥ 0
2.2. A l’aide de simplexe résoudre le problème :
 Programme sur Matlab :
% Coefficients de la fonction objectif (à maximiser)
c = [-7, -9, -18, -17, -5, -10, -20, -15, -11, -8];

% Coefficients des contraintes


A = [2, 4, 5, 7, 5, 10, 3, 8, 9, 5;
1, 1, 2, 2, 3, 4, 5, 2, 1, 0;
1, 2, 3, 3, 2, 5, 7, 0, 1, 1;
2, 4, 5, 7, 4, 5, 0, 8, 1, 0;];

% Limites des ressources


b = [41, 14, 21, 54];

% Options pour l'algorithme du simplexe


options = optimoptions('linprog', 'Algorithm', 'dual-simplex', 'Display', 'iter');

% Résolution du problème
[x, fval] = linprog(c, A, b, [ ], [ ], zeros(size(c)), [ ], options);

% Affichage des résultats


disp('Quantités produites des produits :');
disp(x);
disp('Bénéfice total :');
disp(-fval);

 Résultats :

2.3. A l’aide de simplexe resoudre le probleme :


 Programme :

% Définir les coefficients de la fonction objective


f = -[3 5 -2 4 6 -1 2 -3 7 2];
% Définir les coefficients des contraintes
A = [2 -3 1 4 2 1 -1 5 -2 3;
1 -1 2 1 -1 4 2 1 -3 5;
4 2 1 -3 5 1 2 -1 3 4;
3 2 5 -1 -1 2 4 -2 6 1;
2 3 -1 4 1 -2 3 5 -2 1;
1 2 3 -1 4 2 -1 3 6 1;
1 -1 2 3 1 4 2 -1 -3 5;
3 2 1 3 5 1 2 -1 3 4];
b = [15; 20; 25; 10; 8; 30; 12; 18];

% Définir les bornes inférieures et supérieures


lb = zeros(10, 1); % Les variables doivent être non négatives
ub = [ ]; % Pas de bornes supérieures

% Résoudre le problème de programmation linéaire


[x, fval, exitflag, output] = linprog(f, A, b, [ ], [ ], lb, ub);

% Afficher les résultats


disp('Solution:')
disp(x)
disp('Valeur de la fonction objective:')
disp(-fval)

 Résultats :

3. Optimisation non lineaire :


3.1. A l’aide de programme Matlab :
Dessin de la fonction :
 Programme :
% Définir les intervalles
x = -5:0.2:5;
y = -5:0.2:5;
[X, Y] = meshgrid(x, y);

% Définir la fonction
f = (X + 1).^4 - cos(Y + 1);

% Tracer la fonction
figure;
surf(X, Y, f);
title('f(x, y) = (x + 1)^4 - cos(y + 1)');
xlabel('x');
ylabel('y');
zlabel('f(x, y)');

 Résultat :
Convexité :
 Programme :
syms x y;
% Définir la fonction
f = (x + 1)^4 - cos(y + 1);

% Calculer les dérivées partielles secondes


f_xx = diff(f, x, 2);
f_yy = diff(f, y, 2);
f_xy = diff(diff(f, x), y);

% Afficher les dérivées partielles secondes


disp('Dérivée seconde par rapport à x (f_xx):');
disp(f_xx);
disp('Dérivée seconde par rapport à y (f_yy):');
disp(f_yy);
disp('Dérivée croisée (f_xy):');
disp(f_xy);

% Calculer la matrice Hessienne


H = [f_xx, f_xy; f_xy, f_yy];
disp('Matrice Hessienne:');
disp(H);

% Calculer les valeurs propres de la matrice Hessienne


eig_H = eig(H);
disp('Valeurs propres de la matrice Hessienne:');
disp(eig_H);

 Résultats :
Analyse de la convexité :
 12(x+1)2 est toujours positive ou nulle.
 Cos (y+1) oscille netre -1 et 1 , pouvant etre positive ou négative.
Donc , la fonction n’est pas globalement convexe

-Dans le même graphe, pour les deux méthodes, tracer l’évolution de x en


fonction d’itération.
-Dans le même graphe, pour les deux méthodes, tracer l’évolution de l’erreur en
fonction d’itération.
Programme :
% Initialisation des points de départ et des paramètres
x0 = [1; 1];
tol = 1e-4;
max_iter = 100;

% Définition de la fonction et de ses dérivées


f = @(x) (x(1) + x(2))^2 + 1;
grad_f = @(x) [2 * (x(1) + x(2)); 2 * (x(1) + x(2))];
hess_f = @(x) [2, 2; 2, 2];

% Méthode du gradient
x_grad = x0;
x_grad_history = x0';
error_grad_history = [];
for iter = 1:max_iter
grad = grad_f(x_grad);
x_grad = x_grad - 0.01 * grad;
x_grad_history = [x_grad_history; x_grad'];
error_grad_history = [error_grad_history; norm(grad)];
if norm(grad) < tol
break;
end
end

% Méthode de Newton avec régularisation


lambda = 1e-4;
x_newton = x0;
x_newton_history = x0';
error_newton_history = [];
for iter = 1:max_iter
grad = grad_f(x_newton);
hess = hess_f(x_newton) + lambda * eye(size(hess_f(x_newton)));
x_newton = x_newton - hess \ grad;
x_newton_history = [x_newton_history; x_newton'];
error_newton_history = [error_newton_history; norm(grad)];
if norm(grad) < tol
break;
end
end

% Tracer l'évolution de x
figure;
plot(x_grad_history(:, 1), '-o', 'DisplayName', 'Méthode du gradient');
hold on;
plot(x_newton_history(:, 1), '-x', 'DisplayName', 'Méthode de Newton');
title('Évolution de x en fonction de l''itération');
xlabel('Itération');
ylabel('x');
legend;
% Tracer l'évolution de l'erreur
figure;
plot(error_grad_history, '-o', 'DisplayName', 'Méthode du gradient');
hold on;
plot(error_newton_history, '-x', 'DisplayName', 'Méthode de Newton');
title('Évolution de l''erreur en fonction de l''itération');
xlabel('Itération');
ylabel('Erreur');
legend;

conclusion :
1. Évolution de \( x \) :
- Méthode du gradient : Convergence progressive et lente.
- Méthode de Newton : Convergence rapide.

2. Évolution de l'erreur :
- Méthode du gradient : Diminution régulière mais lente.
- Méthode de Newton : Diminution rapide, atteignant presque zéro rapidement.

En résumé :
- Méthode de Newton : Plus rapide et efficace, mais nécessite une matrice Hessienne bien
conditionnée.
- Méthode du gradient : Plus robuste et simple, mais plus lente.

3.2. Présenter graphiquement la fonction de test de Rosenbrock et la


fonction Rastrigin. Trouver ses points min à l’aide de la méthode
GA et Fminsearch en remplissant le tableau ci- dessus

% Configuration pour l'utilisation de la méthode GA

options = optimoptions('ga', 'Display', 'iter', 'PlotFcn', @gaplotbestf);

% Fonction de test de Rosenbrock

rosenbrock = @(x) 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

% Utilisation de la méthode GA pour Rosenbrock

[x_rosen_GA, fval_rosen_GA] = ga(rosenbrock, 2, [], [], [], [], [-20, -20], [20,
20], [], options);

% Fonction de test Rastrigin

rastrigin = @(x) 10*length(x) + sum(x.^2 - 10*cos(2*pi*x));

% Utilisation de la méthode GA pour Rastrigin

[x_rastrigin_GA, fval_rastrigin_GA] = ga(rastrigin, 2, [], [], [], [], [-20, -20],


[20, 20], [], options);
Tableau 1 Fonction Rosenbrock (- Fonction Rastrigin ( -20<=xi<=20)
20<=xi<=20)
Méthode Solution x F(x) Solution x F(x)
GA [1 , 1] 0 [0,0] 0
Fminsearch [0,990,0,981] 1,0094 e-04 [0,0] 0

3.3. Design d’un ressort


% Fonction objective
function V = objective(x)
N = x(1);
D = x(2);
d = x(3);
V = (N + 2) * D * d^2;
end

% Contraintes
function [c, ceq] = constraints(x)
N = x(1);
D = x(2);
d = x(3);

g1 = 1 - (D^3 * d) / (71785 * N^4);


g2 = (4 * D^2 - D * d) / (12566 * (D * d^3 - d^4)) + 1 / (5108 * d^2) - 1;
g3 = 1 - (140.45 * D) / (d^2 * N);
g4 = (D + d) / 1.5 - 1;

c = [g1; g2; g3; g4];


ceq = [];
end
% Paramètres initiaux
x0 = [4, 0.6, 0.3];
% Bornes des variables
lb = [2, 0.25, 0.05];
ub = [8, 1.2, 3];
% Options de l'optimisation
options = optimoptions('fmincon', 'Algorithm', 'sqp', 'Display', 'iter');
% Appel de la fonction d'optimisation
[x, fval] = fmincon(@objective, x0, [], [], [], [], lb, ub, @constraints, options);
% Affichage des résultats
disp('Résultats optimaux:');
disp(['N (nombre de spires actives) = ', num2str(x(1))]);
disp(['D (diamètre de la spire) = ', num2str(x(2))]);
disp(['d (diamètre du fil) = ', num2str(x(3))]);
disp(['Volume minimisé du ressort = ', num2str(fval)]);

 résultat :

3.4. Rendement hydraulique local d’un profil d’aube


 Programme :

% Fonction pour calculer le rendement hydraulique


function eta_H = rendement_hydraulique(beta_m, alpha_m, epsilon1, epsilon2)
eta_H = (tan(beta_m - epsilon1) + tan(alpha_m - epsilon2)) / (tan(beta_m) + tan(alpha_m));
end

% Paramètres
epsilon1 = 1;
epsilon2 = 1.5;
beta_m_range = [16.45, 70]; % en degrés
alpha_m_range = [16.12, 53.91]; % en degrés

% Convertir les degrés en radians pour les calculs trigonométriques


beta_m_range = deg2rad(beta_m_range);
alpha_m_range = deg2rad(alpha_m_range);

% Calculer le rendement hydraulique pour les bornes


eta_H_min = rendement_hydraulique(beta_m_range(1), alpha_m_range(1), epsilon1, epsilon2);
eta_H_max = rendement_hydraulique(beta_m_range(2), alpha_m_range(2), epsilon1, epsilon2);

% Affichage des résultats


fprintf('Rendement hydraulique minimum : %.4f\n', eta_H_min);
fprintf('Rendement hydraulique maximum : %.4f\n', eta_H_max);

 Résultat :

conclusion :
En conclusion, ce TP nous a permis d'approfondir notre compréhension de l'optimisation non
linéaire à travers une série d'exercices pratiques variés. L'utilisation de MATLAB et de différentes
méthodes d'optimisation nous a permis de visualiser et de résoudre des problèmes complexes de
manière efficace. Chaque méthode utilisée, des algorithmes de gradient aux algorithmes
métaheuristiques, a présenté des avantages spécifiques et a contribué à notre apprentissage global.
Ce TP a été un excellent moyen de mettre en pratique nos connaissances théoriques et de
développer nos compétences en résolution de problèmes, nous préparant ainsi à des défis futurs
dans le domaine de l'optimisation.

Vous aimerez peut-être aussi