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

Continued Fraction Evaluation

Boost , Math Toolkit 2.5.0 , Internal tools

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
Synopsis
#include <boost/math/tools/fraction.hpp>
namespace boost{ namespace math{ namespace tools{
template <class Gen, class U>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_b(Gen& g, const U& tolerance, boost::uintmax_t& max_terms)
template <class Gen, class U>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_b(Gen& g, const U& tolerance)
template <class Gen, class U>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_a(Gen& g, const U& tolerance, boost::uintmax_t& max_terms)
template <class Gen, class U>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_a(Gen& g, const U& tolerance)
//
// These interfaces are present for legacy reasons, and are now deprecated:
//
template <class Gen>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_b(Gen& g, int bits);
template <class Gen>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_b(Gen& g, int bits, boost::uintmax_t& max_terms);
template <class Gen>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_a(Gen& g, int bits);
template <class Gen>
typename detail::fraction_traits<Gen>::result_type
   continued_fraction_a(Gen& g, int bits, boost::uintmax_t& max_terms);
}}} // namespaces
Description

Постоянные фракции являются общим методом приближения. Все эти функции оценивают постоянную долю, описанную аргументом типа генератор. Функции с суффиксом «_a» оценивают долю:

и те, у кого есть суффикс "_b", оценивают долю:

Эта последняя форма несколько более естественна, поскольку она соответствует обычному определению постоянной доли, но обратите внимание, что первое значение a, возвращенное генератором, отбрасывается. Кроме того, часто первые значения a и b в непрерывной части имеют различные определяющие уравнения к оставшимся терминам, что может сделать «_a» более уместной.

Тип генератора должен быть функциональным объектом, поддерживающим следующие операции:

Выражение

Описание

Gen::result_type

Тип, который является результатом ссылки оператора(). Это может быть арифметический тип или std::pair<> арифметических типов.

g()

Возвращает объект типа Gen::result_type.

Каждый раз, когда этот оператор называется, возвращается следующая пара a и b значений. Или, если тип результата_ является арифметическим типом, то следующее значение b возвращается и все значения a предполагается 1.

Во всех выполняемых функциях оценки фракций параметр толерантность является требуемой в результате точностью, оценка фракции будет продолжаться до тех пор, пока последний срок оценки не оставит относительную ошибку в результате менее толерантность. Удаленные интерфейсы принимают ряд цифр точности здесь, внутренне они просто конвертируют это в терпимость и передний вызов.

Если задан параметр max_terms, то будет сделан не более max_terms, а на выходе будет установлен max_terms. Этот объект особенно полезен при профилировании постоянной доли для конвергенции.

Implementation

Внутренне эти алгоритмы все используют модифицированный алгоритм Ленца: обратитесь к нумерным рецептам в C++, W. H. Press et all, глава 5 (особенно 5.2 Оценка непрерывных фракций, p 175 - 179) для получения дополнительной информации, также Lentz, W.J. 1976, Applied Optics, vol. 15, pp. 668-671.

Examples

Соотношение золотого фи = 1.618033989... может быть вычислено из простейшей продолжительной части всего:

Мы начинаем с определения функции генератора:

template <class T>
struct golden_ratio_fraction
{
   typedef T result_type;
   result_type operator()
   {
      return 1;
   }
};

Золотое соотношение затем может быть вычислено для двойной точности, используя:

continued_fraction_a(
   golden_ratio_fraction<double>(),
   std::numeric_limits<double>::epsilon());

Тем не менее, более привычным является определение как a, так и b при оценке специальных функций с помощью постоянных фракций, например, функция загара определяется:

Поэтому его генераторный объект будет выглядеть так:

template <class T>
struct tan_fraction
{
private:
   T a, b;
public:
   tan_fraction(T v)
      : a(-v*v), b(-1)
   {}
   typedef std::pair<T,T> result_type;
   std::pair<T,T> operator()()
   {
      b += 2;
      return std::make_pair(a, b);
   }
};

Обратите внимание, что если континуант вычитается из условий b, как это происходит здесь, то все условия a, возвращенные генератором, будут отрицательными. Функция тангента теперь может быть оценена с помощью:

template <class T>
T tan(T a)
{
   tan_fraction<T> fract(a);
   return a / continued_fraction_b(fract, std::numeric_limits<T>::epsilon());
}

Обратите внимание, что на этот раз мы используем версию «_b» для оценки доли: мы удаляем ведущий a термин во время оценки фракции, поскольку он отличается от всех остальных.


PrevUpHomeNext

Статья Continued Fraction Evaluation раздела Math Toolkit 2.5.0 Internal tools может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Internal tools ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:13:52/0.023867845535278/1