我目前正在尝试使用Julia中mcpsolve()
包的NLsolve
函数来解决具有向下不连续性的函数的互补问题。对于特定参数,该函数被复制here,下面的数字指的是该图的三个面板。
不幸的是,算法并不总是返回内部解决方案,即使它存在:
无论使用何种方法 - 信任区域或牛顿方法,都会出现这些问题。理想情况下,算法会在停止之前在整个集合中寻找潜在的解决方案。
我想知道你们中的一些人是否曾经使用过类似的功能,并找到了一个巧妙的解决方案来绕过这些问题。注意
作为说明性示例,请考虑以下代码。请注意,该函数更平滑,但在此处算法无法找到解决方案。
function f!(x,fvec)
if x[1] <= 1.8
fvec[1] = 0.1 * (sin(3*x[1]) - 3)
else
fvec[1] = 0.1 * (x[1]^2 - 7)
end
end
NLsolve.mcpsolve(f!,[0.], [Inf], [0.], reformulation = :smooth, autodiff = true)
再一次,将初始值设置为0以外的其他值只会推迟问题。此外,正如Halirutan所指出的,fzero
包中的Roots
可能会有效,但我宁愿使用mcpsolve()
,因为问题最初是互补问题。
非常感谢您的帮助。