一、窮舉法求解最小值
窮舉法是一種最樸素的找到函數最小值的方法。其基本思想是:先取一個範圍內的值,然後把函數在該範圍內的值都計算出來,最後找到計算結果最小的值。這個範圍和步長的選擇會影響結果的準確性和計算速度。
下面是一個使用窮舉法求解函數最小值的示例代碼:
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 值和最小值。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/152181.html