Zastanawiałem się, czy można zastosować automatyczną bibliotekę różnicowania Boost:

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

Aby funkcjonować, które zwracają wartości std::complex<double>?


Na przykład , rozważ całodobową kompleksową funkcję:

 #include <complex>

 std::complex<double> complex_function(double a, double c){
     // Assuming a < 0
     return exp(sqrt(std::complex(a, 0.0))) + sin(c);
 }

Jak mogę wziąć pochodną Wrt do a lub c przy użyciu Boost's {x2}}? Czy to w ogóle jest możliwe?

3
mark 23 październik 2020, 04:24

1 odpowiedź

Najlepsza odpowiedź

Czy [to] jest możliwe, aby zastosować automatyczną bibliotekę różnicowania Boost do funkcji, które zwracają wartości std::complex<double>?

Nie w chwili obecnej.

Wersja, która może wyglądać na coś takiego:

// THIS DOES NOT COMPILE - FOR DISCUSSION ONLY
#include <boost/math/differentiation/autodiff.hpp>

#include <iostream>
#include <complex>

namespace ad = boost::math::differentiation;

template <typename T0, typename T1>
auto complex_function(T0 a, T1 c){
  // Assuming a < 0
  return exp(sqrt(complex(a, 0.0))) + sin(c);  // DOES NOT COMPILE
}

int main() {
  auto const a = ad::make_fvar<double, 2>(-3);
  auto const c = 0.0;
  auto const answer = complex_function(a, c);
  return 0;
}

Wymaga to complex do zdefiniowania typów szablonów autodiff::fvar, podobnie jak inne funkcje matematyczne (exp, sqrt itp.) Mają przeciążenia w bibliotece Autodiff, i są nazywane przez ADL.

Jak @ user14717 wskazał w komentarzach, jest to szczególny przypadek autododify vector-vector, ponieważ wartość powrotowa nie jest pojedynczym obciętym wielomianem Taylor, ale raczej krotka.

1
Matt 23 październik 2020, 14:58