使用Julia中的NLsolve使用扭结函数进行根查找

时间:2017-04-30 21:29:15

标签: optimization julia nonlinear-optimization nonlinear-functions

我目前正在尝试使用Julia中mcpsolve()包的NLsolve函数来解决具有向下不连续性的函数的互补问题。对于特定参数,该函数被复制here,下面的数字指的是该图的三个面板。

不幸的是,算法并不总是返回内部解决方案,即使它存在:

  • 在(1)中,当从0开始时,算法保持为0,认为边界约束绑定,
  • 在(2)中,当从0开始时,算法在向下跳跃之前停止,即使解决方案位于此点的右侧。

无论使用何种方法 - 信任区域或牛顿方法,都会出现这些问题。理想情况下,算法会在停止之前在整个集合中寻找潜在的解决方案。

我想知道你们中的一些人是否曾经使用过类似的功能,并找到了一个巧妙的解决方案来绕过这些问题。注意

  • 从解决方案的右侧开始不会解决这些问题,因为它们也会出现在其他参数化中 - 请参阅(3)这次,
  • 不知道先验在参数空间中发生特定情况。

作为说明性示例,请考虑以下代码。请注意,该函数更平滑,但在此处算法无法找到解决方案。

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(),因为问题最初是互补问题。

非常感谢您的帮助。

0 个答案:

没有答案