Написать программу о поиске экстремума функции одной переменной методом золотого сечениям на Python

Нужна помощь в написании программы, для нахождения экстремума функции методом золотого сечения на Python

#Function
f = lambda x: 4 - x ** 2 - 0.2 * x ** 3

#Initial guess
x1 = -4; xu = -2

print ('x \t\t ea \t\t xopt')
ea = 100; i = 1
#Create initial interior pts. x1 & x2 & Evaluate Function at each point
R = (5 ** 0.5 - 1) / 2
D = R * (xu - x1)
x1 = x1 + D
x2 = xu - D
f1 = f(x1)
f2 = f(x2)

#Golden-Section Search Method
while ea > 0.001:
    if f1 < f2:
        x1 = x2
        x2 = x1
        f2 = f1
        x1 = x1 + R*(xu - x1)
        f1 = f(x1)
    else:
        xu = x1
        x1 = x2
        f1 = f2
        x2 = xu - R*(xu-x1)
        f2 = f(x2)

    if f1 < f2:
        xopt = x1
    else:
        xopt = x2

    ea = (1 - R) * abs((xu - x1) / xopt) * 100
    print (i, ea, xopt)
    i += 1

Ответы (2 шт):

Автор решения: GrAnd

Сдаётся мне, что когда вы срисовывали алгоритм, то не заметили, что есть переменная x1 (икс-один), а есть xl (икс-эль). На это ещё как бы намекает тот факт, что для x1 есть парная x2. И есть xu (upper), для которой, по-хорошему, должна быть xl (lower).
Ну и, получившийся, "дурацкий" кусок кода

x1 = x2
x2 = x1

тоже намекает, что что-то тут не то.

В коде ниже xl и xu написаны с большой буквы (чтобы они чуточку больше выделялись).

#Function
f = lambda x: 4 - x ** 2 - 0.2 * x ** 3

#Initial guess
Xl = -4; Xu = -2

print (' x       ea         xopt')
ea = 100; i = 1
#Create initial interior pts. x1 & x2 & Evaluate Function at each point
R = (5 ** 0.5 - 1) / 2
D = R * (Xu - Xl)
x1 = Xl + D
x2 = Xu - D
f1 = f(x1)
f2 = f(x2)

#Golden-Section Search Method
while ea > 0.001:
    if f1 < f2:
        Xl = x2
        x2 = x1
        f2 = f1
        x1 = Xl + R*(Xu - Xl)
        f1 = f(x1)
    else:
        Xu = x1
        x1 = x2
        f1 = f2
        x2 = Xu - R*(Xu - Xl)
        f2 = f(x2)

    if f1 < f2:
        xopt = x1
    else:
        xopt = x2

    ea = (1 - R) * abs((Xu - Xl) / xopt) * 100
    print (f"{i:>2}   {ea:>8.5f}   {xopt:>10.7f}")
    i += 1
 x       ea         xopt
 1   14.58980   -3.2360680
 2    9.01699   -3.2360680
 3    5.38726   -3.3475242
 4    3.32951   -3.3475242
 5    2.05775   -3.3475242
 6    1.27176   -3.3475242
 7    0.78983   -3.3312629
 8    0.48814   -3.3312629
 9    0.30169   -3.3312629
10    0.18645   -3.3312629
11    0.11515   -3.3336354
12    0.07117   -3.3336354
13    0.04398   -3.3336354
14    0.02718   -3.3336354
15    0.01680   -3.3332893
16    0.01038   -3.3332893
17    0.00642   -3.3332893
18    0.00397   -3.3332893
19    0.00245   -3.3333398
20    0.00152   -3.3333398
21    0.00094   -3.3333398

-

→ Ссылка
Автор решения: n1tr0xs

Согласно википедии:

def f(x):
    return 4 - x**2 - 0.2*x**3

# шаг 1
a = -4
b = -2
eps = .001
# шаг  2
while True:
    x1 = b - (b-a) / 1.618
    x2 = a + (b-a) / 1.618
    y1 = f(x1)
    y2 = f(x2)
    if y1 >= y2:
        a = x1
    else:
        b = x2
    # шаг 3
    if abs(b-a) < eps:
        x = (a+b) / 2
        break
print(x)
→ Ссылка