优化器接口

非线性规划(NLP)求解器

Pockit 目前支持 IPOPT 和 Scipy 求解器。如果可用,总是应该选择 IPOPT。

使用 ipopt.solvescipy.solve 函数调用求解问题。

[v2_0, ..., v2_{n_p - 1}, v2_sp], info = ipopt.solve(
    S, # 系统
    [v_0, ..., v_{n_p - 1}, v_sp], # 每个阶段对应的初值猜测,最后为系统参数的初值猜测
    optimizer_options=optimizer_options # dict 类型,直接传递给底层优化器
)
# 返回:
# [v2_0, ..., v2_{n_p - 1}, v2_sp]: 各个阶段对应的计算结果 Variable 对象
# info: 优化器的原始返回对象,用于提取其他信息

若系统只有一个阶段且没有系统参数,也可简化为

v2, info = ipopt.solve(
    S, # 系统
    v, # 每个阶段对应的初值猜测,最后为系统参数的初值猜测
    optimizer_options=optimizer_options # dict 类型,直接传递给底层优化器
)
# 返回:
# [v2_0, ..., v2_{n_p - 1}, v2_sp]: 各个阶段对应的计算结果 Variable 对象
# info: 优化器的原始返回对象,用于提取其他信息

稀疏线性方程求解器

IPOPT 使用内点法求解非线性规划问题,其利用稀疏线性方程求解器计算线搜索方向。 对于内点法,每个迭代步所求解的线性方程组几乎总是病态的。稀疏线性方程求解器对计算的收敛性和速度至关重要。

线性方程求解器可以通过 optimizer_options 参数传递给 IPOPT 求解器,参数选择详见 IPOPT 文档