ipopt+cppad求解遇到sqrt时求解失败

在利用IPopt和CppAD进行数值优化时,遇到开方操作对优化变量产生非法值导致程序崩溃的问题。解决方案是当检测到变量x为0时,将其设置为一个极小值(如1e-10)。另一个bug涉及到math.atan2函数,当y为负数时,atan2(y,x)+2*M_PI会导致求解失败,但使用math.atan2(-y,x)则不会。

BUG解决方案

在使用ipopt和cppad进行优化求解时,发现对优化变量或者对优化变量所得的的变量进行开方时(使用math.sqrt)会发现程序崩溃,求解失败。我的猜想是x\sqrt xx的导数为12x\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)返回正数时就不会求解失败,非常的玄学。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值