Python实现非凸函数f(x)=sin(x)/x的极值求解
本文使用Python代码,通过10次随机采样不同的初始值x0,分别使用梯度下降法和梯度上升法求解非凸函数f(x) = sin(x)/x 的极小值和极大值,并通过一阶导数和二阶导数验证这些点是否为极值点。
1. 梯度下降法求解极小值
import numpy as np
def f(x):
return np.sin(x) / x
def f_prime(x):
return (x * np.cos(x) - np.sin(x)) / x**2
def f_double_prime(x):
return (-2 * x * np.cos(x) + 2 * np.sin(x) + x * np.sin(x)) / x**3
def gradient_descent(x0, learning_rate, iterations):
x = x0
for i in range(iterations):
x -= learning_rate * f_prime(x)
return x
np.random.seed(0)
x0_list = np.random.uniform(1, 20, 10)
converged_points = []
for x0 in x0_list:
x_min = gradient_descent(x0, 0.1, 1000)
converged_points.append(x_min)
print('Converged points:', converged_points)
# 验证是否为极小值点
for x in converged_points:
if f_double_prime(x) > 0:
print('The point', x, 'is not a local minimum.')
else:
print('The point', x, 'is a local minimum.')
代码首先定义了非凸函数f(x),以及其一阶导数f'(x)和二阶导数f''(x)的计算方法。然后,使用梯度下降法实现了gradient_descent函数,其中x0为初始值,learning_rate为学习率,iterations为迭代次数。最后,使用随机生成的10个初始值执行10次梯度下降法,并将收敛到的极小值点存储在converged_points列表中。
通过输出的结果,可以观察这10次梯度下降是否都收敛到同一个解,并通过一阶导数和二阶导数验证这些点是否为极小值点。如果某个点的二阶导数大于0,则该点不是局部极小值点,反之则是。
2. 梯度上升法求解极大值
import numpy as np
def f(x):
return np.sin(x) / x
def f_prime(x):
return (x * np.cos(x) - np.sin(x)) / x**2
def f_double_prime(x):
return (-2 * x * np.cos(x) + 2 * np.sin(x) + x * np.sin(x)) / x**3
def gradient_ascent(x0, learning_rate, iterations):
x = x0
for i in range(iterations):
x += learning_rate * f_prime(x)
return x
np.random.seed(0)
x0_list = np.random.uniform(1, 20, 10)
converged_points = []
for x0 in x0_list:
x_max = gradient_ascent(x0, 0.1, 1000)
converged_points.append(x_max)
print('Converged points:', converged_points)
# 验证是否为极大值点
for x in converged_points:
if f_double_prime(x) < 0:
print('The point', x, 'is not a local maximum.')
else:
print('The point', x, 'is a local maximum.')
代码与梯度下降法的代码类似,只是将梯度下降的更新公式改为梯度上升的更新公式。通过输出的结果,可以观察这10次梯度上升是否都收敛到同一个解,并通过一阶导数和二阶导数验证这些点是否为极大值点。如果某个点的二阶导数小于0,则该点不是局部极大值点,反之则是。
总结
本文使用Python代码实现了非凸函数f(x) = sin(x)/x 的极值求解,并通过梯度下降法和梯度上升法验证了求解结果。需要注意的是,由于函数是非凸的,因此梯度下降法和梯度上升法可能会收敛到不同的局部极值点。可以通过尝试不同的初始值和学习率来寻找全局极值点。
原文地址: https://www.cveoy.top/t/topic/bZEv 著作权归作者所有。请勿转载和采集!