您的位置:

用Python如何找到函数的最小值

一、穷举法求解最小值

穷举法是一种最朴素的找到函数最小值的方法。其基本思想是:先取一个范围内的值,然后把函数在该范围内的值都计算出来,最后找到计算结果最小的值。这个范围和步长的选择会影响结果的准确性和计算速度。

下面是一个使用穷举法求解函数最小值的示例代码:

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 值和最小值。