与线性规划不同,非线性规划的目标函数和约束都不一定是线性的
因此最优解也不一定在可行域边界上,一般而言用迭代算法得到的也只是局部最优解
标准模型如下: \[
\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