二次规划问题(qp)和序列二次规划问题(sqp)的简单理解

这篇具有很好参考价值的文章主要介绍了二次规划问题(qp)和序列二次规划问题(sqp)的简单理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二次规划

二次规划问题(qp)是目标函数为二次函数,约束条件为线性约束的问题,可以简化为初中数学进行表达,即:

已知目标函数为:

f ( x ) = x 2 − 2 ∗ x + 1 f(x)=x^2-2*x+1 f(x)=x22x+1

x x x需满足约束条件

0 < x < 2 0<x<2 0<x<2

f ( x ) f(x) f(x) x x x为多少时取最小值

以上即为最简单的一维的二次规划表达例子,扩展到高维的话,则 x x x为向量矩阵形式,但原理是一样的。

对于高维二次规划问题,求解过程并不像初中数学那样简单,因此会采用其他的方法,如内点法和有效集法等。

对于工程师而言,我们在编写代码的时候,并不关心二次规划问题的求解细节,所以一般是把二次规划问题建立好后,直接调用三方库进行求解。

目前常用的c++求解库是qpoases和osqp,MATLAB的话有个quadprog可用于求解qp。

二次规划问题是一个典型的非线性规划问题,与非线性规划相对的概念是线性规划,对,就是高中数学的学的那个。

二次规划问题还是一个典型的凸优化问题。凸优化问题(Convex optimization problem)要求目标函数为凸函数,而且定义域为凸集。这里的定义域指的就是约束,简单理解就是 x 2 − 1 < 0 x^2-1<0 x21<0就是凸集, x 2 − 1 > 0 x^2-1>0 x21>0就是非凸集。另外,凸优化还要求等式约束均为仿射函数。凸优化问题的特点是局部最优解就是全局最优解。

注意: 只要目标函数不是二次函数,或约束不是线性约束,满足其中任意一个,则此问题就不是二次规划问题。非二次规划问题可能是凸问题,也可能是非凸问题。

非二次规划问题求解思路如下:

  1. 当目标函数仍为二次函数,但约束为非线性约束时,我们可采用ipopt三方库直接求解,或者用序列二次规划(sqp)进行求解,下节详细介绍。

  2. 当目标函数不为二次函数,且约束为非线性约束时,我们似乎只能采用ipopt三方库进行求解了。

序列二次规划

当二次规划的约束为非线性约束时,通常会采用sqp进行求解,用连续求解qp的方法来得到非线性约束条件下的最优解,上述的qpoases和osqp均无法直接求解非线性约束问题,所以如果使用这两个库的话,
只能采用sqp的方法求解,sqp会求解一连串的qp问题。注意,sqp是结果,而不是原因,只有在非线性约束的情况下才会考虑sqp求解,如果问题本身就是线性约束,则直接用qp解就行。

我们将上述qp问题进行改造,得到一个非线性优化问题:

已知目标函数为:

f ( x ) = x 2 − 2 ∗ x + 1 f(x)=x^2-2*x+1 f(x)=x22x+1

x x x需满足约束条件

x 2 < 0.5 x^2<0.5 x2<0.5

f ( x ) f(x) f(x) x x x为多少时取最小值

求解步骤如下:

  1. 因为约束为非线性约束,所以先将约束进行线性化,约束原方程为 c ( x ) = x 2 c(x)=x^2 c(x)=x2,这里我们选择在 x = 10 x=10 x=10的位置进行线性化,根据泰勒展开 f ( x ) = f ( x 0 ) + f ′ ( x 0 ) 1 ! ( x − x 0 ) f(x)=f(x_0)+\frac{f'(x_0)}{1!}(x-x_0) f(x)=f(x0)+1!f(x0)(xx0)
    我们可以得到 c ( x ) = 20 x − 100 c(x)=20x-100 c(x)=20x100,所以原约束条件变成了 20 x − 100 < 0.5 20x-100<0.5 20x100<0.5

  2. 步骤1将非线性约束转换成了线性约束,因此是标准qp,可以用三方库进行第一次qp求解,求解得到一个最优 x x x值,这里解出来最优解为 x = 1 x=1 x=1,记录此时目标函数值 f 1 = 0 f1=0 f1=0

  3. 将非线性约束在第2步解出的 x x x处进行线性化,线性化后原约束变成了 2 x − 1 < 0.5 2x-1<0.5 2x1<0.5,调用第三方库解第二次qp,这里解出来最优解为 x = 0.75 , x=0.75, x=0.75记录此时目标函数值 f 2 = 0.0625 f2=0.0625 f2=0.0625

  4. 比较 f 1 f1 f1 f 2 f2 f2的值的差距,发现差了0.0625,假设我们判断收敛的阈值为两次qp间解算的目标函数值差距不能超过0.001,则此时判断sqp并未收敛,继续计算

  5. 将非线性约束在第3步解出的 x x x处进行线性化,调用第三方库解第三次qp,这里解出来最优解为 x = 0.7083 , x=0.7083, x=0.7083记录此时目标函数值 f 3 = 0.085 f3=0.085 f3=0.085

  6. 将非线性约束在第5步解出的 x x x处进行线性化,调用第三方库解第四次qp,这里解出来最优解为 x = 0.7071 , x=0.7071, x=0.7071记录此时目标函数值 f 4 = 0.086 f4=0.086 f4=0.086

  7. 将非线性约束在第6步解出的 x x x处进行线性化,调用第三方库解第五次qp,这里解出来最优解为 x = 0.7071 , x=0.7071, x=0.7071记录此时目标函数值 f 5 = 0.086 f5=0.086 f5=0.086

  8. 比较 f 4 f4 f4 f 5 f5 f5的值的差距,发现差距不到0.001了,此时我们认为sqp已经收敛了,此时得到的最优解 x x x即为整个sqp问题的最优解

仍无法理解的问题: 为什么连续求解qp直至最后收敛,其结果就是问题最优解,这个证明是怎么来的,有什么简单的理解方法吗? 欢迎大家讨论补充。文章来源地址https://www.toymoban.com/news/detail-433715.html

到了这里,关于二次规划问题(qp)和序列二次规划问题(sqp)的简单理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简单理解什么是序列化

    序列化的目的就是为了对象可以在网络层进行传输, 比如通过后端传给前端数据。 我们以Java为例。 序列化就是把对象转化为可传输的字节序列过程,这个字节序列可以是字符串,比如JSON格式的字符串,把内存中的java对象转化成JSON格式的字符串的过程,就是序列化的过程。

    2024年02月02日
    浏览(43)
  • 【MPC】①二次规划问题MATLAB求解器quadprog

    二次规划是指约束为线性的二次优化问题。在Matlab中,quadprog是具有线性约束的二次目标函数求解器。 min ⁡ x 1 2 x T H x + f T x mathop {min }limits_x frac{1}{2}{{bf{x}}^{bf{T}}}{bf{Hx}} + {{bf{f}}^{bf{T}}}{bf{x}} x min ​ 2 1 ​ x T H x + f T x 其实H是Hessian 阵,是n乘n的对称阵。 1、海森矩阵的正

    2024年01月25日
    浏览(42)
  • 【数学建模】二次规划求解约束极值问题(Python+Gurobi实现)

    目录 1 概述 2 算例及Python代码实现 2.1 算例 2.2 方法1 2.3 方法1求解结果 2.4 方法2         根据约束条件的不同,二次规划可分为等式约束二次规划问题和不等式约束二次规划问题。等式约束二次规划问题即只含有等式约束,常见的解法有直接消去法、广义消去法、拉格朗日

    2024年02月08日
    浏览(70)
  • 动态规划课堂5-----子序列问题(动态规划 + 哈希表)

    目录 引言: 例题1:最长递增子序列 例题2:最长定差子序列 例题3:最长的斐波那契子序列的长度 例题4:最长等差数列 例题5:等差数列划分II-子序列 结语: 要想解决子序列问题那么就要理解子序列和子数组的区别,二者的定义如下。 子序列: 是由数组派生而来的序列,

    2024年03月13日
    浏览(74)
  • 代码随想录 动态规划-子序列问题-子序列(连续)

    目录 674.最长连续递增序列  718.最长重复子数组 53.最大子数组和  674. 最长连续递增序列 简单 给定一个未经排序的整数数组,找到最长且  连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列  可以由两个下标  l  和  r ( l r )确定,如果对于每个  l = i r ,都

    2024年04月09日
    浏览(51)
  • 动态规划---最长连续子序列问题

    最长连续子序列问题算是动态规划问题中的一个小分支,这里单独写一篇文章介绍。至于动态规划基础问题和详细的处理步骤我在我的另一篇文章中详细介绍过。具体解决步骤请移步观看——动态规划基础篇。如果想了解01背包问题和滚动数组相关内容请移步观看——动态规

    2024年02月15日
    浏览(36)
  • 动态规划:子序列问题(C++)

    动态规划往期文章: 动态规划入门:斐波那契数列模型以及多状态 动态规划:路径和子数组问题 1.最长递增子序列(中等) 链接 :最长递增子序列 题目描述 做题步骤 状态表示 对于线性dp,我们通常采用下面两种表示: (1)以某个位置为结尾,…… (2)以某个位置为起点,……

    2024年02月08日
    浏览(46)
  • C++ 求解最长公共子序列(不仅仅求出其大小)(简单易懂!!!)(动态规划)

    求解两个数组的最长公共子序列我们需要用到的知识点有:动态规划dp,递归算法 先来说说动态规划dp 很多初学者在学习动态规划的时候总是百思不得其解,什么是动态规划呢,其实总结来说就是程序将计算过的结果记录下来,在下次使用到这条记录的时候不需要再次计算,

    2024年02月04日
    浏览(43)
  • 【动态规划】求最长递增子序列问题

    最长递增子序列(Longest Increasing Subsequence, LIS ) 子序列:对于任意序列s,它的子序列是通过删除其中零个或多个元素得到的另⼀个序列 注:剩余元素的相对顺序保持不变 给定n个整数组成的序列 s [ 1... n ] s[1...n] s [ 1... n ] ,求最长递增子序列LIS(的长度) 8 3 6 1 3 5 4 7 假设

    2024年02月03日
    浏览(50)
  • 动态规划(子序列问题) 力扣 c++

    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包