一、前言
很久没更新过了,这次更新一下关于forcespro和casadi的使用心得。
二、学习方法
建议先学forcespro,因为它的文档相对来说比较完整,更易学习。至于forcespro的许可证以及安装,我前面的文章里有,其它的查使用手册即可,一般用的非凸优化就是那个high-level,对着它的例子学就行。
接下来建议再补充学习一个casadi,你会发现有了forcespro的基础以后就很好学习casadi,并且会发现就定义而言,casadi的各种定义更加灵活,用的也算顺手。
但后面你会发现,forcespro实在是太快了,还得是它。
三、心得和小技巧
1、Forcespro的一个错误理解
注意:这里是一个错误理解。我之前因为领会了casadi的灵活性,然后又有一个优化问题在forcespro下实现的效果非常奇怪,而在casadi下正常导致了一个错误理解。后面发现了正确原因,但是当时真是没想到,误以为是另一个错误原因。接下来描述一下这个错误理解。
因为forcespro的定义都是分阶段的,从1到N。(这里其实是一个技巧,就是forcespro的目标函数、不等式等是可以分阶段定义的,比如1到3一个目标函数,3到N一个目标函数,定义方法是xxx{i})然后赛车场景为了全局最优一般是定义为最后一个阶段N的进度最多。所以当时我以为是因为Forcespro的求解是一个阶段一个阶段的求解,所以没有实现不了这种类型的全局最优,然后我以为casadi的灵活性保证了它可以定义为这种全局最优。但事实上,Forcespro和Casadi的求解方式是一样的,一次计算出所有变量。
2、一些技巧和心得
(1)可以分阶段定义目标函数、不等式等
(2)可以把
FORCES_NLP(model, codeoptions, output);
这一部分和调用分开
[output, exitflag, info] = FORCESNLPsolver(problem);
前一部分定义model,生成代码。而后一部分是对代码的调用。这样可以使主函数不用每次都重复生成代码的部分(要接近一分钟),当然,如果你调整了优化问题的结构,就需要重新生成代码,如果只是调整了实时参数,那就可以舒舒服服继续使用主函数。
(3)forcepro比casadi的优点之一是可以输出exitflag。在casadi你同样可以查看求解质量,但是没办法让它输出一个flag。而forcespro可以输出这个flag从而你可以用if语句干点别的事,根据求解质量执行一些操作。
(4)优化问题的排查,这是一个非常重要的点。无论多简单的优化问题,哪怕是已经在casadi实现的问题改写成forcepro,一定要一步一步开始。具体步骤是:[1]先只设置目标函数和动态方程[2]变量约束[3]不等式约束一个一个来[4]其它拓展。注意:一旦有一步出问题,问题一定就在那一步,千万别跳过它继续。我的一个血的教训就是vmin的设置问题,它使得最终的效果非常之离谱,而我因为没一步一步来,过了半年才找到这个离谱的错误,还是在我午睡的时候突然意识到的。