Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีหาค่าต่ำสุดของ Scalar Function ด้วย SciPy ใน Python

การหาค่าต่ำสุดของฟังก์ชันสเกลาร์ (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?
BrentUnivariate, Smooth, Unboundedไม่
GoldenUnivariate, Bracketedไม่
BoundedUnivariate, มีขอบเขตชัดเจนไม่
BFGSMultivariate, Smoothใช่ (ประมาณค่าได้)
Nelder-MeadMultivariate, Non-smoothไม่