Advertisement
Guest User

LABA 4

a guest
Dec 12th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.82 KB | None | 0 0
  1. import pylab
  2. from mpl_toolkits.mplot3d import Axes3D
  3. import numpy as np
  4. from scipy.optimize import minimize, fsolve, Bounds
  5. import matplotlib.pyplot as plt
  6.  
  7. def makeData(): # данные для 3D графика
  8.     x = np.arange(-5, 5, 0.1)
  9.     y = np.arange(-5, 5, 0.1)
  10.     xgrid, ygrid = np.meshgrid(x, y)
  11.     zgrid = 3 * (ygrid + xgrid * xgrid)**2 + (ygrid * ygrid - 1)**2
  12.     return xgrid, ygrid, zgrid
  13.  
  14. def f(x): # целевая функция
  15.     return 3 * (x[1] + x[0] * x[0])**2 + (x[1] * x[1] - 1)**2
  16.  
  17. def system(x): # система для нахождения лямбды и точки минимума
  18.     r = [0., 0., 0.]
  19.     r[0] = 12*(x[1]+x[0]**2)*x[0]+4*(x[0]**2-1)*x[0]-0.5*x[2]
  20.     r[1] = 6*(x[1]+x[0]**2) - x[2]
  21.     r[2] = -(x[1]+0.5*x[0]+0.5)
  22.     return r
  23.  
  24. # отрисовка допустимой области
  25. figure, ax = plt.subplots()
  26. x1 = np.arange(-5, 5, 0.01)
  27. y1 = -0.5 * x1 - 0.5
  28. y3 = -0.8 + 0 * x1
  29. t = np.linspace(0, 2*np.pi, 100)
  30. plt.plot( -1 + np.sqrt(1.2) * np.cos(t) , 2 + np.sqrt(12) * np.sin(t) )
  31. plt.grid(color='lightgray',linestyle='--')
  32. ax.plot(x1, y1, linestyle='solid')
  33. ax.plot(x1, y3, linestyle='solid')
  34.  
  35.  
  36. for i in  np.arange(-10,10,0.1):
  37.     for j in np.arange(-10,10,0.1):
  38.         if (j + 0.5*i+0.5) > 0 and j + 0.8 > 0 and -10*(i+1)**2-(j-2)**2+12 > 0:
  39.             ax.scatter(i,j, s = 10, c = 'red')
  40.  
  41. # отрисовка 3D графика
  42. fig = pylab.figure()
  43. axes = Axes3D(fig)
  44. x2, y2, z2 = makeData()
  45. axes.plot_surface(x2, y2, z2, alpha = 0.3)
  46.  
  47. # применение minimize
  48. bnds = Bounds ([-np.inf, -np.inf], [np.inf, np.inf])
  49. ineq_cons = {'type': 'ineq',
  50.              'fun': lambda x: np.array ([(x[1]+0.5*x[0]+0.5),
  51.                                          (-10*(x[0]+1)**2-(x[1]-2)**2+12),
  52.                                          (x[1]+0.8)]),
  53.              'jac': lambda x: np.array ([[(0.5),(1.0)],
  54.                                          [(-20*(x[0]+1)),(-2*(x[1]-2))],
  55.                                          [(0.0),(1.0)]])
  56.             }
  57. x0 = np.array([10.0, 10.0])
  58. res = minimize(f, x0, method='SLSQP',
  59.                 constraints=[ineq_cons], options={'ftol': 1e-9, 'disp': True},
  60.                 bounds=bnds)
  61.  
  62. # рисуем получившуюся точку минимума на 3D графике
  63. axes.scatter(res.x[0], res.x[1], f(res.x), s = 5, c = 'red')
  64.  
  65. # выводим справку-результат минимизации
  66. print('x = ' + str(res.x[0]) + ', y = ' + str(res.x[1]) + ', z(x,y) =' + str(f(res.x)))
  67. ax.scatter(res.x[0], res.x[1])
  68.  
  69. # решаем систему (стационарность функции Лагранжа) и выводим результат
  70. ress = fsolve(system, (-1, 1, 1))
  71. print()
  72. print('After solution the system:')
  73. print(ress)
  74.  
  75. # вывод графиков
  76. pylab.show()
  77. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement