📌 目录

  1. scipy.optimize 简介
  2. 单变量函数最小值:minimize_scalar
  3. 多变量函数最小值:minimize
  4. 非线性方程求根:root
  5. 曲线拟合:curve_fit
  6. 示例:抛物线拟合与参数估计
  7. 示例:非线性方程组求解
  8. 出站链接与参考资料

1. scipy.optimize 简介

scipy.optimize 模块提供:

  • 最优化方法(无约束、有约束)
  • 最小值搜索(单变量、多变量)
  • 求解方程(单根、多元组)
  • 最小二乘拟合、曲线拟合
  • 边界条件、Jacobian 支持

广泛应用于数据建模、物理模拟、机器学习调参等领域。


2. 单变量函数最小值:minimize_scalar

用于求解单变量函数的最小值。

示例:f(x) = (x – 3)² + 4 的最小值

from scipy.optimize import minimize_scalar

f = lambda x: (x - 3)**2 + 4
res = minimize_scalar(f)

print("最小值点 x =", res.x)
print("最小值 f(x) =", res.fun)

✅ 理论最小值应出现在 x=3 处,对应 f(x)=4。


3. 多变量函数最小值:minimize

用于优化多个变量组成的函数,支持多种算法(BFGS, Nelder-Mead, L-BFGS-B 等)。

示例:Rosenbrock 函数(优化经典函数)

import numpy as np
from scipy.optimize import minimize

def rosen(x):
    return sum(100.0*(x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)

x0 = np.array([1.3, 0.7])
res = minimize(rosen, x0, method='BFGS')

print("最优点 x =", res.x)
print("最小值 f(x) =", res.fun)


4. 非线性方程求根:root

用于解任意非线性方程组。

示例:解 x³ – 1 = 0

from scipy.optimize import root

f = lambda x: x**3 - 1
sol = root(f, x0=1.0)

print("根 x =", sol.x)

可解出 x ≈ 1。


5. 曲线拟合:curve_fit

基于最小二乘法,拟合自定义函数曲线,广泛用于科学建模。

示例:y = a * e^(b*x) 拟合

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

def model(x, a, b):
    return a * np.exp(b * x)

# 生成带噪声数据
x = np.linspace(0, 4, 50)
y = 2.5 * np.exp(1.3 * x) + np.random.normal(0, 4, 50)

# 拟合
popt, _ = curve_fit(model, x, y)
a_fit, b_fit = popt

# 预测值
y_fit = model(x, a_fit, b_fit)

plt.scatter(x, y, label='原始数据')
plt.plot(x, y_fit, 'r-', label='拟合曲线')
plt.legend()
plt.title(f"拟合结果: a={a_fit:.2f}, b={b_fit:.2f}")
plt.show()


6. 示例:抛物线拟合与参数估计

def parabola(x, a, b, c):
    return a * x**2 + b * x + c

x_data = np.linspace(-5, 5, 100)
y_data = 2 * x_data**2 + 3 * x_data + 4 + np.random.normal(0, 3, 100)

params, _ = curve_fit(parabola, x_data, y_data)
print("拟合参数 a, b, c =", params)


7. 示例:非线性方程组求解

解:

x² + y² = 1  
x² - y = 0

def system(vars):
    x, y = vars
    return [x**2 + y**2 - 1, x**2 - y]

guess = [1, 0.5]
sol = root(system, guess)
print("解 x, y =", sol.x)


🔗 出站链接与参考资料

📘 官方文档

🎓 学习资源