Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Computing the Fifth Root

Boost , Math Toolkit 2.5.0 , Examples of Root-Finding (with and without derivatives)

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Теперь предположим, что мы хотим найтипятый кореньиз числаа.

Уравнение, которое мы хотим решить:

  f(x) =x5-a

Если ваша дифференциация немного ржавая (или вы столкнулись с функцией, сложность которой делает дифференциацию сложной), то вы можете получить помощь, например, с бесценного сайтаWolframAlpha.

Например, вход в комменд:<differentiate x^ 5>

Язык Вольфрама:<D[x^ 5,x]>

Вывод:<d/dx(x ^5)=5 x^ 4>

Чтобы получить второй дифференциал, введите:<second differentiatex ^5>

Команды Wolfram Language<D[x^ 5,{x, 2}]>

Чтобы получить результат:<d^ 2/dx^2(x ^5)=20 x^ 3>

Чтобы получить эталонное значение, мы можем ввести:<fifth root 3126>

или:<N[3126^(1/5),50]>

Чтобы получить результат с точностью 50 десятичных цифр:

50003199590478625588206333405631053401128722314376

(Мы также можем получить эталонное значение, используямноготочный корень).

1-я и 2-я производные x5являются:

  f'(x) = 5x4

  f''(x) = 20x3

Используя эти выражения для производных, функтор:

template <class T>
struct fifth_functor_2deriv
{
  // Functor returning both 1st and 2nd derivatives.
  fifth_functor_2deriv(T const& to_find_root_of) : a(to_find_root_of)
  { /* Constructor stores value a to find root of, for example: */ }
  std::tuple<T, T, T> operator()(T const& x)
  {
    // Return both f(x) and f'(x) and f''(x).
    T fx = boost::math::pow<5>(x) - a;    // Difference (estimate x^3 - value).
    T dx = 5 * boost::math::pow<4>(x);    // 1st derivative = 5x^4.
    T d2x = 20 * boost::math::pow<3>(x);  // 2nd derivative = 20 x^3
    return std::make_tuple(fx, dx, d2x);  // 'return' fx, dx and d2x.
  }
private:
  T a;                                    // to be 'fifth_rooted'.
}; // struct fifth_functor_2deriv

Теперь наша пятая функция:

template <class T>
T fifth_2deriv(T x)
{
  // return fifth root of x using 1st and 2nd derivatives and Halley.
  using namespace std;                  // Help ADL of std functions.
  using namespace boost::math::tools;   // for halley_iterate.
  int exponent;
  frexp(x, &exponent);                  // Get exponent of z (ignore mantissa).
  T guess = ldexp(1., exponent / 5);    // Rough guess is to divide the exponent by five.
  T min = ldexp(0.5, exponent / 5);     // Minimum possible value is half our guess.
  T max = ldexp(2., exponent / 5);      // Maximum possible value is twice our guess.
  // Stop when slightly more than one of the digits are correct:
  const int digits = static_cast<int>(std::numeric_limits<T>::digits * 0.4);
  const boost::uintmax_t maxit = 50;
  boost::uintmax_t it = maxit;
  T result = halley_iterate(fifth_functor_2deriv<T>(x), guess, min, max, digits, it);
  return result;
}

Полный код этого примера находится по адресуroot_finding_example.cppиroot_finding_n_example.cpp.


PrevUpHomeNext

Статья Computing the Fifth Root раздела Math Toolkit 2.5.0 Examples of Root-Finding (with and without derivatives) может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Examples of Root-Finding (with and without derivatives) ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:54:28/0.0038268566131592/0