Skip to content

Instantly share code, notes, and snippets.

@Kiruha01
Created June 1, 2022 14:02
Show Gist options
  • Save Kiruha01/e2a822472082a57ea030c6cd1683ba22 to your computer and use it in GitHub Desktop.
Save Kiruha01/e2a822472082a57ea030c6cd1683ba22 to your computer and use it in GitHub Desktop.
Метод Дэвидона-Флетчера-Пауэлла
import math
h = 0.01
x1 = - 2
eps = 1e-3
#f = x * x + 4 * x * math.sin(x) + math.cos(x)
# выбор x1 и x2 для оптимального _x
def opt(w, a, b, c, h) :
print(w,a,b,c)
if w < a :
c = b
while a > w :
a -= h
elif w > c :
a = b
while c < w :
c += h
elif w < b :
c = b
elif w > b :
a = b
else :
w = b
return a, w, c
def fun(a) :
return a * a + 4 * a * math.sin(a) + math.cos(a)
def find_min (h, x1):
k = 0
x2 = x1 + h
f1 = fun(x1)
f2 = fun(x2)
if f1 > f2:
x3 = x1 + 2 * h
_x = x2
else:
x3 = x1 - h
_x = x1
f3 = fun(x3)
# предварительно минимум функции в
# минимальном из трех значений
# а искомый минимум в максимальном
fmin = min(f1, f2, f3)
f_x = max(f1, f2, f3)
# сортировка трех точек - выстраивание по порядку
x1, x2, x3 = sorted([x1, x2, x3])
# цикл итераций
while abs((fmin - f_x) / f_x) > eps :
# определение граничных точек x1 и x2
# для _x -"наилучшего" аргумента
# должно быть x1 < _x < x2
x1, x2, x3 = opt(_x, x1, x2, x3, h)
f1 = fun(x1)
f2 = fun(x2)
f3 = fun(x3)
# нахождение минимума из трех функций
tmp = sorted([(f1, x1), (f2, x2),(f3, x3)])
fmin, xmin = tmp[0]
# определение коэф. для квадратичной аппроксимации
a1 = (f2 - f1) / (x2 - x1)
a2 = (1 / (x3 - x2)) * (((f3 - f1) / (x3 - x1)) - ((f2 - f1) / (x2 - x1)))
# определение _x и значения f(_x)
_x = (x2 + x1) / 2 - a1 / (2 * a2)
f_x = fun(_x)
return f1, f2, f3, fmin, _x
print(find_min(h, x1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment