使用平方和优化求解倒立摆LQR吸引域时结果趋近于零的问题
问题诊断与解决方案建议
核心问题排查方向
1. 约束条件的处理偏差
你提到的s^2 + c^2 == 1是单位向量的固有性质,但在平方和(SOS)优化中,不能直接将等式约束硬编码为严格相等——这种做法会过度限制求解器的可行域,最终导致吸引域收缩至零。
- 正确处理方式:
- 变量替换:直接用角度偏差
θ作为状态变量,用sinθ和cosθ描述摆姿态,彻底消除冗余约束; - 乘子松弛:若必须保留
s, c变量,需将等式约束转化为(s^2 + c^2 - 1) * λ(s,c)(λ为任意多项式乘子),并将其加入Lyapunov函数导数的负定性条件中,让求解器自动处理约束松弛。
- 变量替换:直接用角度偏差
2. LQR价值函数的非线性适配问题
LQR价值函数基于线性化模型推导,而你用于SOS验证的是非线性原系统,直接套用可能存在适配性问题:
- 检查该价值函数在非线性系统下的导数符号:即使线性化系统稳定,非线性区域中函数导数可能不满足负定,迫使求解器只能找到极小的吸引域;
- 尝试给LQR价值函数添加高阶修正项,例如构造
V(x) = V_LQR(x) + V_high(x)(V_high(x)取二次或四次低次多项式),增强对非线性特性的适配能力。
3. SOS优化的数值稳定性问题
- 检查多项式次数设置:过高的多项式次数会引发数值病态,导致可行域收缩;可先降低次数(如从四次降至二次)测试效果;
- 调整边界约束:若初始搜索域设置过小,或约束惩罚系数过大,也会导致求解器返回零域;建议先放宽边界,再逐步缩小范围。
代码修正建议
针对你参考的示例代码,可做以下调整:
- 替换状态变量:
将s, c替换为角度偏差θ,直接用三角函数描述姿态,消除s^2 + c^2 == 1约束:theta = sp.Symbol('theta') s = sp.sin(theta) c = sp.cos(theta) - 重构约束形式(若保留
s,c):
将等式约束转化为乘子形式加入优化条件:lambda_poly = sp.Symbol('lambda') constraint = (s**2 + c**2 - 1) * lambda_poly sos_constraint = psos.sos(V_dot + constraint) - 调整Lyapunov函数:
在LQR价值函数基础上添加高阶修正项:V = V_lqr + 0.1 * theta**4 # theta为倒立摆直立状态的角度偏差
验证步骤
- 先移除
s^2 + c^2 == 1约束,测试求解器是否能输出非零吸引域; - 逐步加入乘子形式的约束,观察吸引域的变化趋势;
- 对修正后的Lyapunov函数做前向仿真,验证其在吸引域内的稳定性。
内容的提问来源于stack exchange,提问作者TheEmboldened
相关产品推荐
相关产品推荐

