Julia 朱莉娅:如何获得nlsolve或MINIMITION函数中的局部变量

Julia 朱莉娅:如何获得nlsolve或MINIMITION函数中的局部变量,julia,Julia,我想知道在优化或线性解算器的目标函数中导出局部变量的最佳实践是什么。例如,我有一个函数如下: function example(x) b = sum(x) return b * x' * x 然后我把这个函数发送到一个极小值。假设它收敛。我想在最后一次迭代中获得b的值。我怎样才能做到这一点 我有几个初步的解决办法: 用const-affix全球化b(用数组容器包装它)。 添加一个标志参数以指示是否输出b,然后使用指示符再次运行该函数。 将b的可变容器作为参数,并将其修改为函数的

我想知道在优化或线性解算器的目标函数中导出局部变量的最佳实践是什么。例如,我有一个函数如下:

function example(x)
    b = sum(x)
    return b * x' * x
然后我把这个函数发送到一个极小值。假设它收敛。我想在最后一次迭代中获得b的值。我怎样才能做到这一点

我有几个初步的解决办法:

用const-affix全球化b(用数组容器包装它)。 添加一个标志参数以指示是否输出b,然后使用指示符再次运行该函数。 将b的可变容器作为参数,并将其修改为函数的副作用。 我的理解是,全局变量有性能问题,所以我应该尽量避免;第二种方法是SureFire,但它需要额外的迭代,这听起来不是很有效(尽管在我的大多数应用程序中,成本足够低)。我目前正在使用第三种方法,到目前为止效果很好。但是,由于我是Julia的新手,我不确定它是否有一些隐藏的问题(例如,与其他包(如ForwardDiff)的兼容性?)


谢谢你的评论

使用ForwardDiff,您可能会遇到问题,因为函数是在双数上计算的。但是,如果您使用的是具体的数字,也许您可以在函数计算时使用多个分派来进行存储:

function store!(b::T, storage) where T<: AbstractFloat
...#store b in your storage
end
store!(b, storage) =nothing #does nothing on a ForwardDiff.Dual,for example

使用ForwardDiff,您可能会遇到问题,因为函数是在双数上计算的。但是,如果您使用的是具体的数字,也许您可以在函数计算时使用多个分派来进行存储:

function store!(b::T, storage) where T<: AbstractFloat
...#store b in your storage
end
store!(b, storage) =nothing #does nothing on a ForwardDiff.Dual,for example

听起来真的很聪明。谢谢!听起来真的很聪明。谢谢!