Вечный цикл в python matplotlib
Есть у меня программа для реализации метода оптимизации с использованием производных.
Но у меня возникла очень критическая ошибка
Во время выполнения программы происходить вечный цикл, и программа перестает работать у меня.
Вот сам код
import numpy as n
import matplotlib.pyplot as pl
def f(x):
return 3 * x ** 2 + (12 / (x ** 3 + 1e-7) ) - 5
def fp(x):
return 6 * x - (36 / (x ** 4 + 1e-7) )
def fpp(x):
return 6 * (1 + 24 / x ** 5)
x5 = n.linspace(0.5, 2.5, 100)
F1 = f(x5)
F2 = fp(x5)
pl.plot(x5, F1, 'g--', label='Fun1')
pl.plot(x5, F2, 'g--', label='Fun2')
pl.grid()
pl.legend()
pl.show()
print('метод Ньютона-Рафсона')
x1 = 1
e = 1e-3
n = 1
x2 = x1 - fp(x1) / fpp(x1)
while abs(fp(x2) > e):
x1 = x2
x2 = x1 - fp(x1) / fpp(x1)
n += 1
print('n =', n, 'f =', f(x2), 'x =', x2)
print('метод середньої точки (пошук Больцано)')
n = 0
x = 0
d = 1
e = 1e-3
L = x - d
R = x + d
y = fp(x)
while (fp(L) * y) > 0 and (fp(R) * y) > 0:
L = L - d
R = R + d
if (fp(L) * y) < 0:
R = x
else:
L = x
y1 = fp(L)
y2 = fp(R)
if y1 * y2 >= 0:
print('Корнів немає')
else:
n = 0
x = (L + R) / 2
y3 = fp(x)
while abs(y3) > e:
x = (L + R) / 2
y3 = fp(x)
if y1 * y3 < 0:
R = x
else:
L = x
n += 1
print('n =', n, 'f =', f(x), 'x =', x)
print('метод січних (метод хорд)')
x = 0
d = 1
e = 1e-3
n = 0
L = x - d
R = x + d
y = fp(x)
while fp(L) * y > 0 and fp(R) * y > 0:
L = L - d
R = R + d
if fp(L) * y < 0:
R = x
y1 = fp(L)
y2 = fp(R)
else:
L = x
x = R - fp(R) * (R - L) / (fp(R) - fp(L))
n = 1
y3 = fp(x)
while abs(y3) > e:
if y1 * y3 < 0:
R = x
else:
L = x
x = R - fp(R) * (R - L) / (fp(R) - fp(L))
y3 = fp(x)
y1 = fp(L)
y2 = fp(R)
n += 1
print('n =', n, 'f =', f(x), 'x =', x)
# FIXME PLEASE!!!!!!
print('метод оптимізації з використанням кубічної апроксимації')
x = 0
d = 1
e1 = 1e-3
e2 = 1e-3
y = fp(x)
L = x - d
R = x + d
while (fp(L) * y) > 0 and (fp(R) * y) > 0:
L = L - d
R = R + d
if (fp(L) * y) < 0:
R = x
else:
L = x
n = 0
print('n =', n, 'f =', f(x), 'x =', x)
while abs(f(x)) > e1 or abs(fp(x)) > e2:
z = 3 * (f(L) - f(R) / (R - L)) + fp(L) + fp(R)
b = (z ** 2 - fp(L) * fp(R)) ** (1 / 2)
m = (fp(R) + b - z) / (fp(R) - fp(L) + 2 * b)
print('n =', n, 'f =', f(x), 'x =', x)
if m < 0:
x = R
else:
if m > 1:
x = L
else:
x = R - m * (R - L)
while f(x) > f(L):
x = x - 0.5 * (x - L)
print('n =', n, 'перехід до наступної точки')
if fp(L) * fp(x) < 0:
R = x
else:
L = x
n += 1
print('n =', n, 'f =', f(x), 'x =', x)
Буду рад помощи.
Спасибо за внимания