การหาค่าต่ำสุดของฟังก์ชันสเกลาร์ (Scalar Function) เป็นปัญหา Optimization ช่วยปรับปรุงคุณภาพคำตอบ ใช้ใน Curve Fitting, Root Finding ฯลฯ
SciPy มีหลาย Method สำหรับ Univariate/Minimization เช่น fmin_bfgs (BFGS - ใช้ Gradient), minimize_scalar (Brent, Golden, Bounded) และ minimize (Multivariate)
ตัวอย่างโค้ด (ใช้ fmin_bfgs)
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
def my_func(a):
return a*2 + 20 * np.sin(a)
# สร้างข้อมูลสำหรับพลอต
x_vals = np.linspace(-10, 10, 400)
y_vals = my_func(x_vals)
plt.plot(x_vals, y_vals)
plt.title("Function: 2a + 20*sin(a)")
plt.xlabel("a")
plt.ylabel("f(a)")
plt.grid(True)
plt.show()
# หาค่าต่ำสุดด้วย BFGS
result = optimize.fmin_bfgs(my_func, 0)
print("Optimum at:", result)
ผลลัพธ์
Optimization terminated successfully.
Current function value: -23.241676
Iterations: 4
Function evaluations: 18
Gradient evaluations: 6
[-1.67096375]
คำอธิบาย
นำเข้า matplotlib, scipy.optimize, numpy
กำหนดฟังก์ชัน f(a) = 2a + 20·sin(a)
พลอตกราฟเพื่อดูรูปร่างฟังก์ชัน
ใช้
fmin_bfgs(BFGS Algorithm) หาค่าต่ำสุด เริ่มจาก initial guess = 0ผลลัพธ์: ค่าต่ำสุด ≈ -23.24 ที่ a ≈ -1.671
วิธีอื่นที่แนะนำ (SciPy ใหม่กว่า)
# สำหรับ Univariate Function - ใช้ minimize_scalar (แนะนำ)
result = optimize.minimize_scalar(my_func, method='brent')
print(result.x, result.fun)
# หรือ bounded method หากมีขอบเขต
result = optimize.minimize_scalar(my_func, bounds=(-10, 10), method='bounded')
ตารางเปรียบเทียบ Method สำหรับ Scalar Minimization
| Method | เหมาะสำหรับ | ต้องการ Gradient? |
|---|---|---|
| Brent | Univariate, Smooth, Unbounded | ไม่ |
| Golden | Univariate, Bracketed | ไม่ |
| Bounded | Univariate, มีขอบเขตชัดเจน | ไม่ |
| BFGS | Multivariate, Smooth | ใช่ (ประมาณค่าได้) |
| Nelder-Mead | Multivariate, Non-smooth | ไม่ |