Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.13 KB | None | 0 0
  1. import numpy as np
  2. from scipy.misc import derivative
  3. import math
  4.  
  5. def J(u):
  6.     return pow(u,5) - pow(u,3) - 8*u + 3
  7.  
  8. def dJ(u):
  9.     return 5 * pow(u,4) - 3 * u*u - 8
  10.  
  11.  
  12. def d2J(u):
  13.     return 20 * pow(u,3) - 6*u
  14.  
  15. def is_unimodal(a, b):
  16.     for i in np.arange(start=a + 1, stop=b - 1, step=1):
  17.         if derivative(lambda x: pow(x,5) - pow(x,3) - 8*x + 3, i, 2) < 0:
  18.             return False
  19.     return True
  20.  
  21. def is_convex(u1, u2, u3):
  22.     delta_m = J(u1) - J(u2)
  23.     delta_p = J(u3) - J(u2)
  24.     return delta_m >= 0 and delta_p >= 0 and delta_m + delta_p > 0
  25.  
  26. def find_convex_points(a, b, eps):
  27.     u1 = a
  28.     u2 = u1 + eps
  29.     u3 = u2 + eps
  30.     while u3 <= b:
  31.         if is_convex(u1, u2, u3):
  32.             return np.around([u1, u2, u3], 3)
  33.         u1 = u2
  34.         u2 = u3
  35.         u3 += eps
  36.  
  37. def parabola_min(u1, u2, u3):
  38.     delta_m = J(u1) - J(u2)
  39.     delta_p = J(u3) - J(u2)
  40.     numerator = (u3 - u2) ** 2 * delta_m - (u2 - u1) ** 2 * delta_p
  41.     denominator = 2 * ((u3 - u2) * delta_m + (u2 - u1) * delta_p)
  42.     return u2 + numerator / denominator
  43.  
  44. def parabola_method(u1, u2, u3):
  45.     global iterations
  46.     while u2 != parabola_min(u1, u2, u3):
  47.         w = parabola_min(u1, u2, u3)
  48.         iterations += 1
  49.         if w < u2:
  50.             if J(w) < J(u2):
  51.                 u3 = u2
  52.                 u2 = w
  53.             elif J(w) > J(u2):
  54.                 u1 = w
  55.             else:
  56.                 if J(u1) > J(u2):
  57.                     u3 = u2
  58.                     u2 = w
  59.                 else:
  60.                     u1 = w
  61.         else:
  62.             if J(w) < J(u2):
  63.                 u1 = u2
  64.                 u2 = w
  65.             elif J(w) > J(u2):
  66.                 u3 = w
  67.             else:
  68.                 if J(u3) > J(u2):
  69.                     u1 = u2
  70.                     u2 = w
  71.                 else:
  72.                     u3 = w
  73.     delta = 0.1
  74.     if J(u2 + delta) < J(u2) and J(u2 - delta) < J(u2):
  75.         return u2
  76.     while not is_convex(u1, u2 - delta, u3) and delta > 0:
  77.         iterations += 1
  78.         delta -= 0.01
  79.     return u2 - delta
  80.  
  81. def print_result(x, iterations):
  82.     print("u* = " + str(x) + "; J(u*) = " + str(J(x)) + "; кол-во итераций: " + str(iterations))
  83.  
  84.  
  85.  
  86. def bisectionmethod():
  87.     print("Введите a, b, e, d")
  88.     a, b, e, d = input().split()
  89.     a = float(a)
  90.     b = float(b)
  91.     e = float(e)
  92.     d = float(d)
  93.     n = 0
  94.     if (is_unimodal(a,b)):
  95.         while b-a >= e:
  96.             n+=1
  97.             u1 = (b+a-d)/2
  98.             u2 = (b+a+d)/2
  99.             J1 = J(u1)
  100.             J2 = J(u2)
  101.             if (J1 < J2):
  102.                 b = u2
  103.             elif (J1 > J2):
  104.                 b = u1
  105.             else:
  106.                 a = u1
  107.                 b = u2
  108.         u_inf = (b+a)/2
  109.         J_inf = J(u_inf)
  110.         print("u* = " + str(u_inf) + "; J(u*) = " + str(J_inf) + "; кол-во итераций: " + str(n))
  111.     else:
  112.         print("Функция не унимодальна на введенном отрезке!")
  113.  
  114. def goldensectionmethod():
  115.     print("Введите a, b, e")
  116.     a, b, e = input().split()
  117.     a = float(a)
  118.     b = float(b)
  119.     e = float(e)
  120.     n = 0
  121.     alfa = (math.sqrt(5) - 1)/2
  122.     alfa1 = (3 - math.sqrt(5)) / 2
  123.     u1 = a + alfa1*(b-a)
  124.     u2 = a + alfa*(b-a)
  125.     if (is_unimodal(a,b)):
  126.         while b-a >= e:
  127.             n+=1
  128.             J1 = J(u1)
  129.             J2 = J(u2)
  130.             if (J1 < J2):
  131.                 b = u2
  132.                 u2 = u1
  133.                 J2 = J1
  134.                 u1 = a + alfa1*(b-a)
  135.                 J1 = J(u1)
  136.             elif (J1 > J2):
  137.                 a = u1
  138.                 u1 = u2
  139.                 J1 = J2
  140.                 u2 = a +alfa*(b-a)
  141.                 J2 = J(u2)
  142.             else:
  143.                 b = u2
  144.                 a = u1
  145.                 u1 = a + alfa1 * (b - a)
  146.                 u2 = a + alfa * (b - a)
  147.                 J1 = J(u1)
  148.                 J2 = J(u2)
  149.         u_inf = (b + a) / 2
  150.         J_inf = J(u_inf)
  151.         print("u* = " + str(u_inf) + "; J(u*) = " + str(J_inf) + "; кол-во итераций: " + str(n))
  152.     else:
  153.         print("Функция не унимодальна на введенном отрезке!")
  154.    
  155. def newton(uk, eps):
  156.     global iterations
  157.     while abs(dJ(uk)) > eps:
  158.         uk -= dJ(uk) / d2J(uk)
  159.         iterations += 1
  160.     return uk
  161.  
  162.  
  163.  
  164. A = -2
  165. B = 2
  166. print("1: Метод деления отрезка пополам.")
  167. print("2: Метод золотого сечения.")
  168. print("3: Метод парабол.")
  169. print("4: Метод Ньютона.")
  170. option = int(input())
  171. if (option == 1):
  172.     bisectionmethod()
  173. elif (option == 2):
  174.     goldensectionmethod()
  175. elif (option == 3):
  176.     if is_unimodal(A, B):
  177.         iterations = 0
  178.         convex_points = find_convex_points(A, B, 0.1)
  179.         print("Найденная выпуклая тройка точек это", convex_points)
  180.         u = parabola_method(convex_points[0], convex_points[1], convex_points[2])
  181.         print_result(u, iterations)
  182. else:
  183.     if is_unimodal(A, B):
  184.         iterations = 0
  185.         u = newton(1, 0.01)
  186.         print_result(u, iterations)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement