Boost自动微分应用失败

Application of Boost Automatic Differentiation fails

我想使用 boost autodiff 功能来计算复杂函数的二阶导数。

在 boost 帮助下,我可以看一下下面的例子:

#include <boost/math/differentiation/autodiff.hpp>
#include <iostream>

template <typename T>
T fourth_power(T const& x) {
    T x4 = x * x;  // retval in operator*() uses x4's memory via NRVO.
    x4 *= x4;      // No copies of x4 are made within operator*=() even when squaring.
    return x4;     // x4 uses y's memory in main() via NRVO.
}

int main() {
    using namespace boost::math::differentiation;

    constexpr unsigned Order = 5;                  // Highest order derivative to be calculated.
    auto const x = make_fvar<double, Order>(2.0);  // Find derivatives at x=2.
    auto const y = fourth_power(x);
    for (unsigned i = 0; i <= Order; ++i)
        std::cout << "y.derivative(" << i << ") = " << y.derivative(i) << std::endl;
    return 0;
}

我想利用这种可能性来计算我的 class 结构中的导数,但我不知道如何计算。这是我的 .cxx 文件的简化代码示例。我有一个参数方程,它分为两个函数以获得 x 和 y 坐标。 radius是一个成员变量。我想计算这个参数方程在 phi.

位置的二阶导数
#include <boost/math/differentiation/autodiff.hpp>

double
get_x_coordinate(const double phi) const {
    return (radius*cos(phi));
}

double
get_y_coordinate(const double phi) const {
    return (radius*sin(phi));
}

double
do_something(const double phi) const {
    auto const x = boost::math::differentiation::make_fvar<double, 2>(phi);
    auto fx = [this](auto x) { return get_x_coordinate(x); };
    auto fy = [this](auto x) { return get_y_coordinate(x); };
    auto const dx = fx(x);
    auto const dy = fy(x);
    return (dx.derivative(2)+dy.derivative(2));
}

此示例因以下错误而失败。

cannot convert argument 1 from boost::math::differentiation::autodiff_v1::detail::fvar<RealType,10>' to 'const double'

我无法更改 get_x_coordinate 和 get_y_coordinate 收到 const double 和 return double 因为我在其他位置的代码中使用它们。所以我真的不知道如何继续。

我也在用Visual studio 2017,我问自己和

有什么区别
#include <boost/math/differentiation/autodiff.hpp>

#include <boost/math/differentiation/autodiff_cpp11.hpp>

我用VS2017一定要用cpp11吗?两者都可以在我的增强版中使用。

感兴趣的函数将被转换成可以接受 double 或 boost fvar 参数的模板。请注意,boost 提供了适用于 fvar:

的标准库(例如 sin、cos)的三角函数的自定义实现
#include <boost/math/differentiation/autodiff.hpp>
#include <iostream>
#include <math.h>

constexpr double const radius{4.0};

template <typename T>
T get_x_coordinate(T const & phi)
{
    return radius * cos(phi);
}

int main()
{
    double const phi{2.0};
    auto const x{::boost::math::differentiation::make_fvar<double, 2>(phi)};
    auto const dx{get_x_coordinate(x)};
    ::std::cout << dx.derivative(2) << ::std::endl;
    return 0;
}

online compiler