Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. from math import *
  2. from numpy import *
  3.  
  4. f = lambda x1, x2, x3: - x1 * x2 * x3
  5.  
  6. # >= 0
  7. ge = [
  8. lambda x1, x2, x3: x1,
  9. lambda x1, x2, x3: x2,
  10. lambda x1, x2, x3: x3,
  11. ]
  12.  
  13. # <= 0
  14. le = [
  15. lambda x1, x2, x3: x1 - 42,
  16. lambda x1, x2, x3: x2 - 42,
  17. lambda x1, x2, x3: x3 - 42,
  18. lambda x1, x2, x3: x1 + 2 * x2 + 2 * x3 - 72
  19. ]
  20.  
  21. # == 0
  22. eq = [
  23.  
  24. ]
  25.  
  26. eps_barrier = 1e-2
  27.  
  28. x0 = array([1.0, 1.0, 1.0])
  29. eps = 1e-4
  30. eps_min = 1e-7
  31. dx = 1e-7
  32.  
  33. ###
  34. r0 = 10.0
  35. z = 4.0
  36. phi = lambda x: min(0.0, x) ** 2 # -min(0.0, x)
  37. phi_eq = lambda x: x ** 2 # abs(x)
  38.  
  39.  
  40. def min_range(f, x_0, h):
  41. x_k, f_k, a, b = [0] * 4
  42. k = 2
  43.  
  44. a, x_k, f_k = x_0, x_0 + h, f(x_0 + h)
  45.  
  46. while True:
  47. x_k_prev, f_k_prev = x_k, f_k
  48. x_k = x_0 + 2 ** (k - 1) * h
  49. f_k = f(x_k)
  50. if isnan(f_k):
  51. return a, x_k_prev
  52. if f_k_prev <= f_k:
  53. return a, x_k
  54. else:
  55. a = x_k_prev
  56. k += 1
  57.  
  58.  
  59. def dih(f, a, b, eps, delta):
  60. while (b - a) / 2.0 >= eps:
  61. x_1 = (a + b) / 2.0 - delta
  62. x_2 = (a + b) / 2.0 + delta
  63. if f(x_1) <= f(x_2):
  64. b = x_2
  65. else:
  66. a = x_1
  67.  
  68. return (a + b) / 2.0
  69.  
  70. def grad(f, x):
  71. res = zeros(x.size)
  72. for i in range(x.size):
  73. t = x[:]
  74. t[i] += dx
  75. ft = f(t)
  76. t[i] -= 2 * dx
  77. res[i] = (ft - f(t)) / (2 * dx)
  78.  
  79. return res
  80.  
  81.  
  82. def m3(f, xk, H):
  83. k = 0
  84. g = None
  85. beta = 0.0
  86. while True:
  87. print("\nшаг 1: k =", k)
  88. gm1 = g
  89. g = grad(f, xk)
  90. norm = sqrt(g.dot(g))
  91. print("\tшаг 2: градиент =", g, ", |g| = ", norm)
  92. if norm <= eps:
  93. print("\tшаг 3: ||grad|| < eps, {", norm, "<", eps, "} остановка")
  94. print("\tшаг 12:\n\tx* =", xk)
  95. print("\tf(x*) =", f(xk))
  96. return xk
  97. if k != 0:
  98. sk = xk - xkm1
  99. print("\tшаг 5: sk = ", sk)
  100. yk = g - gm1
  101. print("\tшаг 6: yk = ", yk)
  102. H = H - H.dot(outer(yk, yk)).dot(H) / yk.dot(H).dot(yk) + outer(sk, sk) / yk.dot(sk)
  103. print("\tшаг 7: H = \n", H)
  104. p = -H.dot(g)
  105. print("\tшаг 8: p = ", p)
  106. tf = lambda alpha: f((xk + alpha * p))
  107. a, b = min_range(tf, 0.0, eps_min)
  108. print("\tшаг 9: одномерная минимизация:\n\t\tотрезок локализации минимума: [", a, ';', b, ']')
  109. alpha = dih(tf, a, b, eps_min, eps_min / 10.0)
  110. print("\t\tak =", alpha)
  111. xkm1 = xk
  112. xk = xk + alpha * p
  113. print("\tшаг 10: x(k+1) = xk + ak * g = ", xk)
  114. print("\tf(xk) = ", f(xk))
  115.  
  116. # костыль
  117. if alpha <= eps_min:
  118. break
  119.  
  120. k += 1
  121. print("\tшаг 11: k = k + 1 = ", k)
  122.  
  123. return xk
  124.  
  125.  
  126. # m3(x0, H)
  127.  
  128. P = lambda x, rk: rk * (
  129. sum(
  130. list(map(lambda t: phi(t(*x)), ge))
  131. ) +
  132. sum(
  133. list(map(lambda t: phi(-t(*x)), le))
  134. ) +
  135. sum(
  136. list(map(lambda t: phi_eq(t(*x)), eq))
  137. ))
  138.  
  139.  
  140. def alg(xk, r, z):
  141. k = 1
  142. while True:
  143. F = lambda x: f(*x) + P(x, r ** k)
  144. H = identity(xk.size)
  145. xrk = m3(F, xk.copy(), H)
  146.  
  147. p = P(xrk, r ** k)
  148.  
  149. print("P: ", p)
  150.  
  151. if p < eps_barrier:
  152. return xrk
  153. else:
  154. r *= z
  155. xk = xrk
  156. k += 1
  157.  
  158.  
  159. x = alg(x0, r0, z)
  160. print(*list(map(lambda x: "%.8f" % x, x)))
  161. print(f(*x))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement