Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import sympy
- import sympy as sym
- from sympy.abc import *
- # импортируем метод деформируемого многогранника
- import nelder
- x, y, r = sym.symbols('x y r')
- def penalty_method(x0, y0):
- eps = 1e-5
- r = 1
- C = 10
- print("Итерация\tштраф\t\tЗначение функции в точке\t\tКоордината x\t\tКоордината y\n")
- for i in range(0, 30):
- # пункт а: y - x => -1 или x-y<=1
- g = x - y - 1
- if g.subs({x: x0, y: y0}) <= 0:
- shtraf_a = 0
- else:
- shtraf_a = (0.5 * (abs(g) + g)) ** 2
- # пункт б: x=-y
- h = (x + y)
- shtraf_b = h ** 2
- shtraf = shtraf_a
- # shtraf = shtraf_b
- f = 2 * (x - y) ** 2 + 14 * (y - 3) ** 2
- rs = r ** 2 * (shtraf)
- # составляем вспомогательную и штрафные функции
- fxr = f + rs
- pxr = rs
- # находим минимум вспомогательной функции при помощи метода деформируемого многогранника
- m = nelder.nelder_mead(fxr, x0, y0)
- (xr, yr) = (m[0], m[1])
- if pxr == False:
- 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,
- '\t\t\t' "%.10f" % yr)
- print("Расчёт окончен")
- break
- elif pxr.subs({x: x0, y: y0}) <= eps:
- 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,
- '\t\t\t' "%.10f" % yr)
- print("Расчёт окончен")
- break
- else:
- r = C * r
- rs += rs
- print(i + 1, '\t\t\t', r, '\t\t\t\t', "%.10f" % (f.subs({x: x0, y: y0})), '\t\t\t\t', "%.10f" % x0,
- '\t\t\t' "%.10f" % y0)
- (x0, y0) = (xr, yr)
- continue
- print(penalty_method(2, -5))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement