Julia 茱莉亚的例子?

Julia 茱莉亚的例子?,julia,Julia,Julia的ForwardDiff文档表明,可以使用DiffResultsAPI一次性计算函数值、梯度和Hessian,但没有示例。DiffResults包本身也没有示例,也没有文档可言。这个用例是不言而喻的:假设我有一个向量参数x的函数f,我想用牛顿方法最小化它。下面是一种直截了当的方法,在这种方法中,事情会被重新计算三次——我如何使用衍射结果来编写它呢 function NewtMin(f, x0, eps) fgrad = x-> ForwardDiff.gradient(f

Julia的
ForwardDiff
文档表明,可以使用
DiffResults
API一次性计算函数值、梯度和Hessian,但没有示例。
DiffResults
包本身也没有示例,也没有文档可言。这个用例是不言而喻的:假设我有一个向量参数
x
的函数
f
,我想用牛顿方法最小化它。下面是一种直截了当的方法,在这种方法中,事情会被重新计算三次——我如何使用
衍射结果来编写它呢

function NewtMin(f, x0, eps)
    fgrad = x-> ForwardDiff.gradient(f, x)
    fhess = x-> ForwardDiff.hessian(f, x)
    oldval = f(x0)
    newx = x0 - fhess(x0)\fgrad(x0)
    newval = f(newx)
    while abs(newval - oldval) > eps
        oldval = newval
        newx = newx - fhess(newx)\fgrad(newx)
        newval = f(newx)
    end
    return newx
end

中的
衍射结果.jl
文档中有一些示例

这是一个使用衍射结果对Newtmin的简单重写,它在julia v0.6.4中运行。但我想它可以进行重构和优化,使其更加优雅和性能

using ForwardDiff
using DiffResults

function NewtMin(f, x0, eps)
    result = DiffResults.HessianResult(x0)
    ForwardDiff.hessian!(result, f, x0)
    fhess_x0 = DiffResults.hessian(result)
    fgrad_x0 = DiffResults.gradient(result)
    oldval = DiffResults.value(result)
    newx = x0 - fhess_x0\fgrad_x0
    newval = f(newx)
    while abs(newval - oldval) > eps
        oldval = newval
        ForwardDiff.hessian!(result, f, newx)
        fhess_newx = DiffResults.hessian(result)
        fgrad_newx = DiffResults.gradient(result)
        newx = newx - fhess_newx\fgrad_newx
        newval = f(newx)
    end
    return newx
end

foo(x) = sum(x.^2)

NewtMin(foo, [1.,1.,1.], 0.01) 
## which should give a correct result at [0., 0., 0.] 

谢谢那很容易!