SciPy解非线性规划

与线性规划不同,非线性规划的目标函数和约束都不一定是线性的

因此最优解也不一定在可行域边界上,一般而言用迭代算法得到的也只是局部最优解

标准模型如下: \[ \min f(\vec x) \\ \text{s.t.} \begin{cases} g_i(\vec x) \geq 0,\ \ \ i=1,2,...,m, \\ h_i(\vec x) = 0,\ \ \ i=1,2,...,l, \end{cases} \] scipy.optimize.minimize可以解决非线性规划问题

用法:

minimize(fun,x0,bounds=None,constraints=None)

其中fun为目标函数,输入一个向量\(\vec x\)返回对应值

x0为迭代初值,决定是否能取到全局最优解

bounds与线性规划的linprog一样

constraints为约束条件,具体实现为单个dict或dict的序列,每个dict应有两个键值:

  • type:字符串'eq''ineq'之一,表示该约束为等号约束或不等号约束

  • fun:函数,传入向量\(\vec x\),返回约束式的左值,在可行解中该值大于等于0(不等号约束)/等于0(等号约束)

    特别地,若有一系列约束为线性约束,则可将一系列右值视为一个向量,利用numpy.array重载的比较符号,

    将这些约束缩为一个,即lambda x:b-A@x