Advertisement
Sephinroth

Методы оптимизации

Oct 7th, 2020 (edited)
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.00 KB | None | 0 0
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3.  
  4. def F(x):
  5.     return x*x-10*x+2
  6.  
  7.  
  8. def PP(a, b, eps, x, y):
  9.     #метод поразрядного поиска
  10.     h = 0.001
  11.     flag = False
  12.     for i in np.arange(a, b, h):
  13.         x.append(i)
  14.         x.append(i + h)    
  15.         if F(x[-2]) < F(x[-1]):
  16.             if h < eps and not flag:
  17.                 x_ans = x[-2]
  18.                 flag = True
  19.             else:
  20.                 h /= -4
  21.                
  22.     y = [F(i) for i in x]
  23.     plt.plot (x, y)
  24.     plt.grid(True)
  25.     plt.show()
  26.     print("Метод поразрядного поиска: \nx* = ", x_ans, "\ny_min = ", F(x_ans))
  27.  
  28. def Dych(a, b, eps, x, y):
  29.     #метод дихотомии
  30.     delta = eps/10
  31.     for i in np.arange(a, b, delta):
  32.         x.append(i)
  33.     y = [F(i) for i in x]
  34.     h = (b-a)/2
  35.     x_ans = a
  36.     while h > eps:
  37.         h = (b-a)/2
  38.         x1 = (a+b-delta)/2
  39.         x2 = (a+b+delta)/2
  40.         if F(x1) <= F(x2):
  41.             b = x2
  42.         else:
  43.             a = x1
  44.         if h <= eps:
  45.             x_ans = (a+b)/2        
  46.     print("\nМетод дихотомии: \nx* = ", x_ans, "\ny_min = ", F(x_ans), '\n')        
  47.    
  48. def GoldenRatio(a, b, eps, x, y):
  49.     #метод золотого сечения
  50.     for i in np.arange(a, b, eps/10):
  51.         x.append(i)
  52.     y = [F(i) for i in x]
  53.     h = (b-a)/2
  54.     tau = (5**(1/2) - 1) / 2
  55.     h = (b-a)/2
  56.     while h > eps:
  57.         x1 = a + (3 - 5**(1/2))/2 * (b - a)
  58.         x2 = a + (5**(1/2) - 1)/2 * (b - a)
  59.         if F(x1) <= F(x2):
  60.             b = x2
  61.             h *= tau
  62.         else:
  63.             a = x1
  64.             h *= tau
  65.         x_ans = (a+b)/2        
  66.     print("Метод золотого сечения: \nx* = ", x_ans, "\ny_min = ", F(x_ans))        
  67.    
  68. def main():
  69.     a = 3
  70.     b = 6
  71.     eps = 0.01
  72.     x = []
  73.     y = []
  74.     PP(a, b, eps, x, y)
  75.     Dych(a, b, eps, x, y)
  76.     GoldenRatio(a, b, eps, x, y)
  77.  
  78. if __name__ == "__main__":    
  79.     main()    
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement