Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.07 KB | None | 0 0
  1. #####################################
  2. # PROJET OPTIMISATION
  3. # - Yannis Benabbi
  4. #####################################
  5.  
  6. # Définition des objets
  7.  
  8. class Fonction:
  9. """
  10. Contient la fonction, son gradient, et sa hessienne.
  11. L'objet peut être appelé directement
  12. """
  13. def __init__(self, f, grad = None, hess = None):
  14. self.f = f
  15. self.grad = grad
  16. self.hess = hess
  17.  
  18. def __call__(self, x):
  19. return self.f(x)
  20.  
  21.  
  22.  
  23. class Vecteur:
  24.  
  25. def __init__(self, v):
  26. if type(v) == type([]):
  27. self.v = v
  28. else:
  29. self.v = [v]
  30.  
  31. def __getitem__(self, param:int):
  32. return self.v[param]
  33.  
  34. def norme(self):
  35. return (reduce(lambda a,b: a+b**2, self.v))**0.5
  36.  
  37.  
  38. # Fonctions et variables définies par l'utilisateur
  39.  
  40. def f1(x:Vecteur):
  41. """
  42. Description :
  43. Fonction 1 de test sur laquelle sera appliquée les différents algorithmes
  44.  
  45. Paramètres : Element de R3
  46. Sortie : Element de R
  47. """
  48. return Vecteur(2*(x[0]+x[1]+x[2]-3)**2+(x[0]-x[1])**2+(x[1]-x[2])**2)
  49.  
  50.  
  51. def f2(x:Vecteur):
  52. """
  53. Description :
  54. Fonction 2 de test sur laquelle sera appliquée les différents algorithmes
  55.  
  56. Paramètres : Element de R2
  57. Sortie : Element de R
  58. """
  59. return 100*(x[1]-x[0]**2)**2 + (1-x[0])**2
  60.  
  61.  
  62. def gradf1(x:Vecteur):
  63. """
  64. Description :
  65. Gradient de f1
  66.  
  67. Paramètres : Element de R3
  68. Sortie : Element de R3
  69. """
  70. return [
  71. 4*(x[0]+x[1]+x[2]-3)+2*(x[0]-x[1]),
  72. 4*(x[0]+x[1]+x[2]-3)-2*(x[0]-x[1])+2*(x[1]-x[2]),
  73. 4*(x[0]+x[1]+x[2]-3)-2*(x[1]-x[2])
  74. ]
  75.  
  76. def gradf2(x:Vecteur):
  77. """
  78. Description :
  79. Gradient de f2
  80.  
  81. Paramètres : Element de R2
  82. Sortie : Element de R2
  83. """
  84. return [
  85. -400 * x[0] * (x[1] - x[0] ** 2) + 2*x[0],
  86. 200 * (x[1] - x[0]**2)
  87. ]
  88.  
  89. def hessf1(x:Vecteur):
  90. """
  91. Description :
  92. Gradient de f1
  93.  
  94. Paramètres : Element de R3
  95. Sortie : Element de R3
  96. """
  97. return [
  98. [
  99. 6,
  100. 2,
  101. 4
  102. ],
  103. [
  104. 2,
  105. 8,
  106. 2
  107. ],
  108. [
  109. 4,
  110. 2,
  111. 6
  112. ]
  113. ]
  114.  
  115. def hessf2(x:Vecteur):
  116. """
  117. Description :
  118. Gradient de f2
  119.  
  120. Paramètres : Element de R2
  121. Sortie : Element de R2
  122. """
  123. return [
  124. [
  125. -400 * (-3 * x[0]**2 + x[1]) + 2,
  126. -400 * x[0] * x[1]
  127. ],
  128. [
  129. -200 * 2*x[0],
  130. 200
  131. ]
  132. ]
  133.  
  134. x011 = Vecteur([1,0,0])
  135. x012 = Vecteur([10,3,-2.2])
  136. x021 = Vecteur([-1.2,1])
  137. x022 = Vecteur([10, 0])
  138. x023 = Vecteur([0,1/200 + 1/10**12])
  139.  
  140.  
  141.  
  142. F1 = Fonction(f1, gradf1, hessf1)
  143. print(x012[1])
  144.  
  145.  
  146. # Fonctions d'optimisation sans contraintes
  147.  
  148. def NewtonLocal(f:Fonction, x0):
  149.  
  150. def condArret(k, xk, xkp1):
  151.  
  152. eps1 = 0.001 * (f.grad(x0).norme() + 10**(-8))
  153. eps2 = 0.001 * xk.norme() + 10**(-8)
  154. eps3 = 0.001 * f(xk).norme() + 10**(-8)
  155.  
  156. condArretVoulu = f.grad(xk).norme() < eps1
  157. condArretIterMax = k > 10000
  158. condArretPointe = (xkp1 - xk).norme() < eps2
  159. condArretPlateau = (f(xkp1) - f(xk).norme) < eps3
  160.  
  161. return (xkp1 is None or (not condArretVoulu and not condArretIterMax and not condArretpointe and not condArretplateau))
  162.  
  163. xk = x0
  164. xkp1 = None
  165. k = 0
  166. while (condArret(k,xk,xkp1)):
  167. k = k+1
  168.  
  169. return 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement