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;
}
我想使用 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
:
#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;
}