You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Scipy库minimize函数求解并联电路优化问题返回错误结果

问题分析与解决

你的问题核心在于目标函数是非凸的三次函数,而scipy.optimize.minimize的trust-constr方法是局部优化算法,当初始点选择不当时,很容易陷入局部极小值,而非全局最优。

约束条件简化

先拆解你的线性约束:
从矩阵A=[[1,0,1],[0,-1,-1],[-1,1,0]]和V=[100,-100,0],可以推导出:

  • x1 + x3 = 100
  • x2 + x3 = 100 → x1 = x2
  • x3 = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:18:20