# Python非线性优化 - 完整代码示例# 非线性优化求解目标函数为非线性时的最优化问题分无约束和有约束两类import numpy as npfrom scipy import optimize# 1. 无约束优化Rosenbrock 函数优化算法的标准测试函数# f(x,y) (1-x)² 100*(y-x²)², 全局最小值在 (1, 1)def rosenbrock(x):Rosenbrock 函数经典测试函数谷底平坦return (1 - x[0])**2 100 * (x[1] - x[0]**2)**2def rosenbrock_gradient(x):Rosenbrock 函数的梯度dfdx -2 * (1 - x[0]) - 400 * x[0] * (x[1] - x[0]**2)dfdy 200 * (x[1] - x[0]**2)return np.array([dfdx, dfdy])# 使用不同方法求解x0 np.array([-1.5, 1.0]) # 初始点# Nelder-Mead单纯形法导数免费res_nm optimize.minimize(rosenbrock, x0, methodNelder-Mead,options{xatol: 1e-8, fatol: 1e-8})print(Nelder-Mead 方法 (无需求导):)print(f 最优解: ({res_nm.x[0]:.6f}, {res_nm.x[1]:.6f}))print(f 函数值: {res_nm.fun:.2e})print(f 迭代次数: {res_nm.nfev})# BFGS拟牛顿法使用梯度res_bfgs optimize.minimize(rosenbrock, x0, methodBFGS,jacrosenbrock_gradient)print(f\nBFGS 方法 (梯度下降):)print(f 最优解: ({res_bfgs.x[0]:.6f}, {res_bfgs.x[1]:.6f}))print(f 函数值: {res_bfgs.fun:.2e})print(f 迭代次数: {res_bfgs.nfev})# Newton-CG牛顿法需要 Hessiandef rosenbrock_hessian(x):Rosenbrock 函数的 Hessian 矩阵h11 2 - 400 * x[1] 1200 * x[0]**2h12 -400 * x[0]h21 -400 * x[0]h22 200return np.array([[h11, h12], [h21, h22]])res_newton optimize.minimize(rosenbrock, x0, methodNewton-CG,jacrosenbrock_gradient, hessrosenbrock_hessian)print(f\nNewton-CG 方法 (使用 Hessian):)print(f 最优解: ({res_newton.x[0]:.6f}, {res_newton.x[1]:.6f}))print(f 函数值: {res_newton.fun:.2e})# 2. 有约束优化约束最小化# 目标: min f(x,y) (x-2)² (y-1)²# 约束: x² y² 1 (圆形约束)# x 0, y 0def objective_constrained(x):有约束问题的目标函数return (x[0] - 2)**2 (x[1] - 1)**2# 约束条件定义两种形式不等式约束和边界constraints [{type: ineq, fun: lambda x: 1 - x[0]**2 - x[1]**2} # x² y² 1]bounds [(0, None), (0, None)]# SLSQP 方法序列最小二乘规划res_slsqp optimize.minimize(objective_constrained, x0[0.5, 0.5],methodSLSQP, boundsbounds,constraintsconstraints)print(f\n有约束优化 (SLSQP):)print(f 最优解: ({res_slsqp.x[0]:.6f}, {res_slsqp.x[1]:.6f}))print(f 函数值: {res_slsqp.fun:.6f})print(f 约束满足: x²y² {res_slsqp.x[0]**2 res_slsqp.x[1]**2:.6f})# trust-constr 方法信赖域约束优化res_trust optimize.minimize(objective_constrained, x0[0.5, 0.5],methodtrust-constr, boundsbounds,constraintsconstraints)print(f\ntrust-constr 方法:)print(f 最优解: ({res_trust.x[0]:.6f}, {res_trust.x[1]:.6f}))print(f 函数值: {res_trust.fun:.6f})# 3. 全局优化避免陷入局部最优# Himmelblau 函数有 4 个等值局部极小点def himmelblau(x):Himmelblau 函数有 4 个局部极小点return (x[0]**2 x[1] - 11)**2 (x[0] x[1]**2 - 7)**2# 使用 basinhopping 全局优化x0_global np.array([0, 0])res_global optimize.basinhopping(himmelblau, x0_global,niter100, # 局部优化的迭代次数stepsize0.5, # 步长minimizer_kwargs{method: BFGS})print(f\n全局优化 (basinhopping):)print(f 最优解: ({res_global.x[0]:.6f}, {res_global.x[1]:.6f}))print(f 函数值: {res_global.fun:.6f})print(f 局部极小次数: {res_global.minimization_failures})# 4. 最小二乘优化least_squares 用于数据拟合# 拟合模型 y a * exp(-b * x) cnp.random.seed(42)x_data np.linspace(0, 5, 40)true_params [2.5, 0.8, 0.3]y_data true_params[0] * np.exp(-true_params[1] * x_data) true_params[2]y_data 0.1 * np.random.randn(40) # 添加噪声def model_func(params, x):指数衰减模型a, b, c paramsreturn a * np.exp(-b * x) cdef residuals(params, x, y):残差函数return y - model_func(params, x)# 使用 least_squares 拟合res_ls optimize.least_squares(residuals, x0[1.0, 0.5, 0.0],args(x_data, y_data),bounds([0, 0, -1], [10, 5, 5]) # 参数边界)print(f\n最小二乘拟合 (least_squares):)print(f 真实参数: a{true_params[0]}, b{true_params[1]}, c{true_params[2]})print(f 拟合参数: a{res_ls.x[0]:.4f}, b{res_ls.x[1]:.4f}, c{res_ls.x[2]:.4f})print(f 最终残差: {res_ls.cost:.6f})# 5. 优化算法对比不同初始点的影响print(f\n初始点对优化结果的影响 (Rosenbrock):)init_points [[-1.5, 1.0], [2.0, -1.0], [-0.5, -0.5], [3.0, 3.0]]for pt in init_points:res optimize.minimize(rosenbrock, pt, methodBFGS, jacrosenbrock_gradient)print(f 初始点 ({pt[0]:4.1f}, {pt[1]:4.1f}): 终点 ({res.x[0]:6.3f}, {res.x[1]:6.3f}), f{res.fun:.2e})# 6. 求解方程组root 函数# 求解方程组: x² y 5, x y² 3def equations(vars):x, y varseq1 x**2 y - 5eq2 x y**2 - 3return [eq1, eq2]sol_root optimize.root(equations, x0[1, 1])print(f\n方程组求解 (root):)print(f 解: x{sol_root.x[0]:.6f}, y{sol_root.x[1]:.6f})print(f 残差: {np.max(np.abs(equations(sol_root.x))):.2e})# 7. 带约束的非线性优化实战最小化曲面面积# 给定体积 V1求圆柱体的最小表面积# 目标: min 2πr² 2πrh# 约束: πr²h 1 (固定体积)# r 0, h 0def cylinder_area(params):圆柱体表面积r, h paramsreturn 2 * np.pi * r**2 2 * np.pi * r * hdef cylinder_volume_eq(params):体积约束r, h paramsreturn np.pi * r**2 * h - 1 # 应为 0# 解析解: r (1/(2π))^(1/3), h 2rconstraints_cyl [{type: eq, fun: cylinder_volume_eq}]bounds_cyl [(0.01, None), (0.01, None)]res_cyl optimize.minimize(cylinder_area, [0.5, 0.5],methodSLSQP,boundsbounds_cyl,constraintsconstraints_cyl)r_opt, h_opt res_cyl.xr_analytic (1 / (2 * np.pi))**(1/3)print(f\n圆柱体最小表面积 (V1):)print(f 最优 r{r_opt:.4f} (解析: {r_analytic:.4f}))print(f 最优 h{h_opt:.4f} (解析: {2*r_analytic:.4f}))print(f 最小面积{res_cyl.fun:.4f})print(f 体积检验{np.pi * r_opt**2 * h_opt:.6f})print(\n非线性优化总结根据问题特性选择合适方法)print(无约束用 BFGS有约束用 SLSQP/trust-constr全局优化用 basinhopping)