Untitled
unknown
python
5 years ago
1.8 kB
10
Indexable
# -*- coding: utf-8 -*-
"""
Created on Fri May 14 23:20:01 2021
@author: lenovo
"""
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
from pylab import meshgrid
from numpy import arange
import numpy as np
import sys
def f(x):
return 4 * x ** 4 - 4 * x ** 3 - 24 * x ** 2 + 16 * x + 52
def anti_gradient_f(x):
return 16 * x ** 3 - 12 * x ** 2 - 48 * x + 16
def steepest_descent(f, anti_gradient_f, initial_x, n_iterations=100,
alpha=0.001, minimum_error=1e-14, epsilon=1e-14):
x_list = []
y_list = []
compute_new_x = lambda gradient_f, current_x, alpha: current_x - alpha * gradient_f
current_x = initial_x
delta_f = epsilon
k = 0
try:
while k < n_iterations and not(minimum_error and delta_f < epsilon):
delta_f = f(current_x)
x_list.append(current_x)
y_list.append(delta_f)
current_x = compute_new_x(anti_gradient_f(current_x), current_x, alpha)
delta_f -= f(current_x)
delta_f = abs(delta_f)
print("Iteration", k, "-> x =", current_x, "with value f(x) =", f(current_x))
k += 1
return np.array(x_list), np.array(y_list)
except OverflowError as error:
print("Iteration", k, "-> Overflow")
sys.exit()
x = arange(-5.0, 5.0, 0.01)
Z = f(x)
fig = plt.figure()
plt.plot(x, Z, color='red')
x_list, y_list = steepest_descent(f, anti_gradient_f, -5)
for i in range(len(x_list) - 1):
plt.quiver(x_list[i], y_list[i], x_list[i + 1] - x_list[i], y_list[i + 1] - y_list[i], scale_units='xy', angles='xy', scale=1, color='blue')
plt.title('$f(x, y) = 4 * x ^ 4 - 4 * x ^ 3 - 24 * x ^ 2 + 16 * x + 52$')
plt.show()Editor is loading...