Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.86 KB | None | 0 0
  1. import sys
  2.  
  3.  
  4. def get_num(min_val, max_val):
  5.     while True:
  6.         try:
  7.             num = float(input().strip())
  8.             if num <= min_val:
  9.                 print("Введенное число должно быть больше " + str(min_val))
  10.             elif num >= max_val:
  11.                 print("Введенное число должно быть меньше " + str(max_val))
  12.             else:
  13.                 return num
  14.         except ValueError:
  15.             print("Неверные входные данные! Повторите ввод")
  16.  
  17.  
  18. def func(x):
  19.     return x * x * x - 3 * x - 3
  20.  
  21.  
  22. def find_point(a, b):
  23.     a1 = a
  24.     b1 = b
  25.     eps = 0.0000000001
  26.     while b1 - a1 >= eps:
  27.         delta = (b1 - a1) / 4
  28.         u1 = (a1 + b1 - delta) / 2
  29.         u2 = (a1 + b1 + delta) / 2
  30.         i1 = func(u1)
  31.         i2 = func(u2)
  32.         if i1 <= i2:
  33.             b1 = u2
  34.         if i1 >= i2:
  35.             a1 = u1
  36.     return (b1 + a1) / 2
  37.  
  38.  
  39. def find_golden_point(a, b):
  40.     eps = 0.0000000001
  41.     phi = (5 ** 0.5 - 1) / 2
  42.     u1 = (b - a) * phi ** 2 + a
  43.     u2 = (b - a) * phi + a
  44.     i1 = func(u1)
  45.     i2 = func(u2)
  46.     while b - a > eps:
  47.         if i1 > i2:
  48.             a = u1
  49.             u1 = u2
  50.             i1 = i2
  51.             u2 = phi * (b - a) + a
  52.             i2 = func(u2)
  53.         else:
  54.             b = u2
  55.             u2 = u1
  56.             u1 = a + (b - a) * phi ** 2
  57.             i2 = i1
  58.             i1 = func(u1)
  59.     u = (a + b) / 2
  60.     return u
  61.  
  62.  
  63. # ПАРАБОЛ
  64. def find_point_parabola(a, b):
  65.     u_0 = (b - a) / 2
  66.     n = 1000
  67.     h = (b - a) / n
  68.     eps = 0.00000001
  69.     w = eps * 100
  70.     w_pred = 0
  71.  
  72.     while abs(w - w_pred) > eps:
  73.         f0 = func(u_0)
  74.         u_1 = u_0 + h
  75.         f1 = func(u_1)
  76.  
  77.         if f1 < f0:
  78.             u_2 = u_1 + h
  79.         else:
  80.             u_1 = u_0 - h
  81.             f1 = func(u_1)
  82.             u_2 = u_1 - h
  83.         f2 = func(u_2)
  84.         w_pred = w
  85.         w = -0.5 * ((f1 - f0) * (u_2 ** 2) + (f0 - f2) * (u_1 ** 2) + (f2 - f1) * (u_0 ** 2)) / \
  86.             ((f0 - f1) * u_2 + (f2 - f0) * u_1 + (f1 - f2) * u_0)
  87.         u_0 = w
  88.  
  89.     return w
  90.  
  91.  
  92. # ГРАДИЕНТНЫЙ
  93. def func2(x, y):
  94.     # return 3 * x * x + 4 * y * y + 1
  95.     return (8 * x * x + 5 * y * y + 10) ** 0.5
  96.  
  97.  
  98. def func2_deriv_x(x, y):
  99.     return 16 * x
  100.     # return (func2(x + 0.0000001, y) - func2(x - 0.0000001, y)) / (2 * 0.0000001)
  101.  
  102.  
  103. def func2_deriv_y(x, y):
  104.     return 10 * y
  105.     # return (func2(x, y + 0.0000001) - func2(x, y - 0.0000001)) / (2 * 0.0000001)
  106.  
  107.  
  108. def norma(x, y):
  109.     # return (x * x + y * y) ** 0.5
  110.     return (func2_deriv_x(x, y) ** 2 + func2_deriv_y(x, y) ** 2) ** 0.5
  111.  
  112.  
  113. def find_gradient():
  114.     x0 = 10
  115.     y0 = 20
  116.     h = 0.00001
  117.     f0 = func2(x0, y0)
  118.     eps = 0.0000000001
  119.  
  120.     while True:
  121.         grad_x_prev = func2_deriv_x(x0, y0)
  122.         grad_y_prev = func2_deriv_y(x0, y0)
  123.  
  124.         x1 = x0 - h * grad_x_prev
  125.         y1 = y0 - h * grad_y_prev
  126.  
  127.         grad_x = func2_deriv_x(x1, y1)
  128.         grad_y = func2_deriv_y(x1, y1)
  129.         if norma((grad_x - grad_x_prev), (grad_y - grad_y_prev)) < eps:
  130.             break
  131.         f1 = func2(x1, y1)
  132.         if f1 > f0:
  133.             h = h / 10
  134.         else:
  135.             x0 = x1
  136.             y0 = y1
  137.             f0 = f1
  138.     print("Точка: (" + str(format(x0, ".7f")) + ", " + str(format(y0, ".7f")) + ")")
  139.     print("Значение функции: " + str(func2(x0, y0)))
  140.     return x0, y0
  141.  
  142.  
  143. # print("Функция: x^3 - 3x + 1")
  144.  
  145.  
  146. find_gradient()
  147. print("Введите левую границу")
  148. a = get_num(sys.float_info.max * (-1), sys.float_info.max)
  149.  
  150. print("Введите правую границу")
  151. b = get_num(a, sys.float_info.max)
  152.  
  153. print("Точка минимума: " + str(find_point_parabola(a, b)))
  154. print("Значение функции: " + str(func(find_point_parabola(a, b))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement