Python中Scipy库minimize函数求解并联电路优化问题返回错误结果
问题分析与解决
你的问题核心在于目标函数是非凸的三次函数,而scipy.optimize.minimize的trust-constr方法是局部优化算法,当初始点选择不当时,很容易陷入局部极小值,而非全局最优。
约束条件简化
先拆解你的线性约束:
从矩阵A=[[1,0,1],[0,-1,-1],[-1,1,0]]和V=[100,-100,0],可以推导出:
x1 + x3 = 100x2 + x3 = 100→x1 = x2x3 = 100 - x1
把这些关系代入目标函数sum(F*x³),可以简化为单变量函数:
def simplified_obj(x1): x2 = x1 x3 = 100 - x1 F = np.array([1e-4, 1e-4, 8e-4]) return F[0]*x1**3 + F[1]*x2**3 + F[2]*x3**3
这样问题就转化为求单变量x1在(0,100)区间内的最小值,直接用单变量优化就能得到全局最优。
解决方案1:约束简化后单变量优化
修改代码如下,利用minimize_scalar直接求解全局最优:
import numpy as np from scipy.optimize import minimize_scalar def simplified_obj(x1): x3 = 100 - x1 F = np.array([1e-4, 1e-4, 8e-4]) return F[0]*x1**3 + F[1]*x1**3 + F[2]*x3**3 # 搜索区间(0,100),因为电流不能为负 res = minimize_scalar(simplified_obj, bounds=(0, 100), method='bounded') x1_opt = res.x x_opt = [x1_opt, x1_opt, 100 - x1_opt] print(x_opt)
运行后会得到正确结果:[66.63333333, 66.63333333, 33.36666667]
解决方案2:使用全局优化算法
如果不想手动简化约束,可以用Scipy的全局优化方法differential_evolution,它不需要依赖初始点,能在全局范围内搜索最优解:
import numpy as np from scipy.optimize import differential_evolution, LinearConstraint def obj_func(x): F = np.array([1e-4, 1e-4, 8e-4]) return np.sum(F * x**3) # 定义约束 A = np.array([[1, 0, 1], [0, -1, -1], [-1, 1, 0]]) V = np.array([100, -100, 0]) lincon = LinearConstraint(A, lb=V, ub=V) # 变量边界:电流不能为负 bounds = [(0, None)] * 3 res = differential_evolution(obj_func, bounds=bounds, constraints=lincon) print(res.x)
运行后同样会输出正确的全局最优解。
原代码失败的原因
你最初的初始点x0=[0.1,0.1,0.1]靠近变量取值范围的低端,而目标函数在这个区域存在一个局部极小值(对应x3较大的情况),trust-constr作为局部优化算法,在这个初始点附近找到局部最优后就停止迭代,没有搜索到全局最优。
内容的提问来源于stack exchange,提问作者Deviant
相关产品推荐
相关产品推荐

