一、穷举法求解最小值
穷举法是一种最朴素的找到函数最小值的方法。其基本思想是:先取一个范围内的值,然后把函数在该范围内的值都计算出来,最后找到计算结果最小的值。这个范围和步长的选择会影响结果的准确性和计算速度。
下面是一个使用穷举法求解函数最小值的示例代码:
def func(x): return (x-1)**2 + 3 def search_min(func, start, end, step): min_x = start min_y = func(start) x = start while x <= end: y = func(x) if y < min_y: min_y = y min_x = x x += step return min_x, min_y min_x, min_y = search_min(func, -10, 10, 0.01) print("最小值的 x 值为:{}".format(min_x)) print("最小值为:{}".format(min_y))
代码中定义了一个函数 func(x),表示需要求解最小值的函数。然后使用参数 start, end 和 step 来控制计算范围和步长,函数 search_min() 就可以求得这个函数的最小值了。最后运行代码,可以得到最小值的 x 值和最小值。
二、梯度下降法求解最小值
梯度下降法是求解最小值比较常见的一种方法,它是一种迭代优化算法,通过不断地迭代,将函数的参数调整到最小值处,并返回最小值。梯度下降法的核心思想是,对于一个函数的任意一点,计算出该点的梯度(导数),将这个梯度与一个学习率(learning rate)相乘得到一个步长,然后沿着步长的方向移动一小步,就可以得到一个新的函数值。迭代多次后,就可以不断靠近最小值。
下面是一个使用梯度下降法求解最小值的示例代码:
import numpy as np def func(x): return (x-1)**2 + 3 def grad_func(x): return 2 * (x-1) def gradient_descent(func, grad_func, start, learning_rate=0.1, max_iters=1000, eps=1e-6): for i in range(max_iters): grad = grad_func(start) if np.abs(grad) < eps: break start -= learning_rate * grad return start, func(start) min_x, min_y = gradient_descent(func, grad_func, 10) print("最小值的 x 值为:{}".format(min_x)) print("最小值为:{}".format(min_y))
代码中定义了函数 func(x) 和 grad_func(x),分别表示需要求解最小值的函数和该函数的导数。然后使用参数 start, learning_rate, max_iters 和 eps 来控制初始值、学习率、最大迭代次数和精度,函数 gradient_descent() 就可以迭代求得这个函数的最小值了。最后运行代码,可以得到最小值的 x 值和最小值。
三、Scipy优化库求解最小值
Scipy 是 Python 的一个科学计算库,其中包含了一些常用的数学优化算法,可以用来求解函数的最小值。其中最常用的函数是 minimize(),它可以通过设置不同的方法来选择不同的优化算法,比如 BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法、CG(共轭梯度)算法、L-BFGS-B(限制L-BFGS)算法等等。
下面是一个使用 Scipy 库求解最小值的示例代码,使用了 BFGS 算法:
import scipy.optimize as opt def func(x): return (x-1)**2 + 3 res = opt.minimize(func, 0, method='BFGS') print("最小值的 x 值为:{}".format(res.x[0])) print("最小值为:{}".format(res.fun))
代码中的 func(x) 函数同上文一致,函数 minimize() 是 Scipy 库中的函数,用于求解函数最小值。传入 func 和初始值 0,然后指定使用 BFGS 算法来进行优化。运行代码,可以得到最小值的 x 值和最小值。