ipopt+cppad求解遇到sqrt时求解失败
BUG解决方案
在使用ipopt和cppad进行优化求解时,发现对优化变量或者对优化变量所得的的变量进行开方时(使用math.sqrt)会发现程序崩溃,求解失败。我的猜想是
x
\sqrt x
x的导数为
1
2
x
\frac{1}{2\sqrt x}
2x1,当x为0时,则会出现非法值。
故重点来了,解决方案为,强行把x为0的值变成一个很小的值,如:
if(x==0){
x=1e-10;
}
BUG求助
解决完这个问题,我还有一个关于ipopt的bug,解决了bug但是不知道是什么原因导致的bug,希望有大神看到可以指点一二。
Bug描述:
程序中对优化变量使用math.atan2(y,x),如果y为负数,则math.atan2(y,x)也为负数,对math.atan2(y,x)+2*M_PI转为正数后会求解失败,但是使用math.atan2(-y,x)返回正数时就不会求解失败,非常的玄学。