Advertisement
evgeniya_polyntseva

penalty_method

May 29th, 2020
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.91 KB | None | 0 0
  1. import math
  2. import sympy
  3. import sympy as sym
  4. from sympy.abc import *
  5. # импортируем метод деформируемого многогранника
  6. import nelder
  7.  
  8. x, y, r = sym.symbols('x y r')
  9.  
  10.  
  11. def penalty_method(x0, y0):
  12.     eps = 1e-5
  13.     r = 1
  14.     C = 10
  15.  
  16.     print("Итерация\tштраф\t\tЗначение функции в точке\t\tКоордината x\t\tКоордината y\n")
  17.     for i in range(0, 30):
  18.         # пункт а: y - x => -1 или x-y<=1
  19.         g = x - y - 1
  20.         if g.subs({x: x0, y: y0}) <= 0:
  21.             shtraf_a = 0
  22.         else:
  23.             shtraf_a = (0.5 * (abs(g) + g)) ** 2
  24.  
  25.         # пункт б: x=-y
  26.         h = (x + y)
  27.         shtraf_b = h ** 2
  28.         shtraf = shtraf_a
  29.         # shtraf = shtraf_b
  30.         f = 2 * (x - y) ** 2 + 14 * (y - 3) ** 2
  31.         rs = r ** 2 * (shtraf)
  32.         # составляем вспомогательную и штрафные функции
  33.         fxr = f + rs
  34.         pxr = rs
  35.         # находим минимум вспомогательной функции при помощи метода деформируемого многогранника
  36.         m = nelder.nelder_mead(fxr, x0, y0)
  37.         (xr, yr) = (m[0], m[1])
  38.         if pxr == False:
  39.             print(i + 1, '\t\t\t', r * C, '\t\t\t\t', "%.10f" % (f.subs({x: xr, y: yr})), '\t\t\t\t', "%.10f" % xr,
  40.                   '\t\t\t' "%.10f" % yr)
  41.             print("Расчёт окончен")
  42.             break
  43.  
  44.         elif pxr.subs({x: x0, y: y0}) <= eps:
  45.             print(i + 1, '\t\t\t', r * C, '\t\t\t\t', "%.10f" % (f.subs({x: xr, y: yr})), '\t\t\t\t', "%.10f" % xr,
  46.                   '\t\t\t' "%.10f" % yr)
  47.             print("Расчёт окончен")
  48.             break
  49.  
  50.         else:
  51.             r = C * r
  52.             rs += rs
  53.             print(i + 1, '\t\t\t', r, '\t\t\t\t', "%.10f" % (f.subs({x: x0, y: y0})), '\t\t\t\t', "%.10f" % x0,
  54.                   '\t\t\t' "%.10f" % y0)
  55.             (x0, y0) = (xr, yr)
  56.             continue
  57.  
  58.  
  59. print(penalty_method(2, -5))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement