Написать программу о поиске экстремума функции одной переменной методом золотого сечениям на 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)
