黃金分割法(Golden Section Search)是一種用於一維單峯函數極小值搜索的數值優化方法。在計算點到三階(三次)Bezier曲線的最短距離時,可以將問題轉化為一個單變量優化問題:尋找參數 t∈[0,1] 使得點到曲線的距離最小。由於距離函數通常在區間 [0,1] 上是單峯的(或可近似為單峯),因此適合使用黃金分割法進行求解。

1. 三次 Bezier 曲線定義

給定四個控制點 P₀, P₁, P₂, P₃(每個點為二維或三維向量),三次 Bezier 曲線的參數方程為:

B(t) = (1 − t)³ P₀ + 3(1 − t)² t P₁ + 3(1 − t) t² P₂ + t³ P₃,  t ∈ [0, 1]

2. 距離平方函數(目標函數)

設給定點為 Q,則點 Q 到曲線上點 B(t) 的歐氏距離平方為:

f(t) = ‖B(t) − Q‖²
= (Bₓ(t) − Qₓ)² + (Bᵧ(t) − Qᵧ)²  (二維情形)

注:使用距離平方 f(t) 而非距離 D(t) = √f(t),因為兩者在最小值點處取得相同的 t,且 f(t) 更光滑、計算更高效。

3. 黃金分割法(Golden Section Search)原理

黃金分割法用於在區間 [a, b] 上尋找單峯函數 f(t) 的極小值點。其核心思想是通過不斷縮小區間,保持兩個內點按黃金比例分佈。

定義黃金比例常數:
φ = (√5 − 1) / 2 ≈ 0.6180339887

初始區間:a = 0, b = 1
設置容差 ε(如 1e−6)作為終止條件。

算法步驟如下:

  1. 計算區間長度:L = b − a
  2. 設置兩個內點:
    c = b − φ·L
    d = a + φ·L
  3. 計算函數值:f(c) 和 f(d)
  4. 迭代直到 |b − a| < ε:
    - 若 f(c) < f(d),則極小值在 [a, d] 內 → 令 b = d, d = c, L = b − a, c = b − φ·L
    - 否則,極小值在 [c, b] 內 → 令 a = c, c = d, L = b − a, d = a + φ·L
  5. 返回 t* ≈ (a + b)/2 作為最優參數

4. 完整計算流程

  1. 輸入:控制點 P₀P₁P₂P₃;查詢點 Q;容差 ε
  2. 定義函數 f(t) = ‖B(t) − Q‖²,其中 B(t) 按三次 Bezier 公式計算
  3. 在區間 [0, 1] 上對 f(t) 應用黃金分割法,求得最優參數 t*
  4. 最短距離為 √f(t*),最近點為 B(t*)

5. 注意事項

  • f(t) 在 [0,1] 上不一定嚴格單峯(可能存在多個局部極小值),但在多數實際應用中表現良好。若需全局最優,可結合多起點搜索或先採樣粗略定位。
  • 黃金分割法僅適用於一維優化,此處因 Bezier 曲線由單參數 t 控制,故適用。
  • 所有運算均為標量和向量運算,易於編程實現(如 Python、C++、MATLAB 等)。