![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Legendre (and Associated) PolynomialsBoost , Math Toolkit 2.5.0 , Polynomials
|
![]() |
Caution |
---|---|
Определение связанного с ним многочлена Legendre, используемое здесь, включает ведущий термин фазы Кондона-Шортли (-1)м. Это соответствует определению, данному Абрамовичем и Стегуном (8.6.6) и используемомуMathworldиMathematica's LegendreP. Однако использование в литературе не всегда включает этот фазовый термин, и, как ни странно, спецификация для связанной функции Legendre в C++ TR1 (assoc_legendre) также опускает его, несмотря на то, что он использует Абрамовица и Стегуна в качестве окончательного арбитра по этим вопросам. Смотри: Вайсштейн, Эрик У. «Легендра Полиномиал». MathWorld — Wolfram Web Resource(недоступная ссылка — история). Abramowitz, M. and Stegun, I. A. «Функции Легендра» и «Ортогональные полиномы» (Ch. 22 in Chs. 8 and 22 in Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th print). New York: Dover, pp. 331-339 and 771-802, 1972. |
template <class T> calculated-result-type legendre_q(unsigned n, T x); template <class T, class Policy> calculated-result-type legendre_q(unsigned n, T x, const Policy&);
Возвращает значение многочлена Legendre, который является вторым решением дифференциального уравнения Legendre, например:
Требуется -1<= x<= 1, иначеdomain_errorназывается.
Следующий график иллюстрирует первые несколько функций Legendre второго рода:
template <class T1, class T2, class T3> calculated-result-type legendre_next(unsigned l, T1 x, T2 Pl, T3 Plm1);
Реализует три термина рекуррентного отношения для многочленов Legendre, эта функция может быть использована для создания последовательности значений, оцененных в том жеx, и для повышенияl. Это отношение повторяемости относится к Легендарным Полиномиалам как первого, так и второго рода.
Например, мы могли бы создать вектор первых 10 полиномиальных значений, используя:
double x = 0.5; // Abscissa value vector<double> v; v.push_back(legendre_p(0, x)); v.push_back(legendre_p(1, x)); for(unsigned l = 1; l < 10; ++l) v.push_back(legendre_next(l, x, v[l], v[l-1])); // Double check values: for(unsigned l = 1; l < 10; ++l) assert(v[l] == legendre_p(l, x));
Формально аргументами являются:
Степень последнего вычисленного полинома.
значение абсциссы
Значение полинома оценивается на уровнеl.
Значение полинома оценивается на уровнеl-1.
template <class T1, class T2, class T3> calculated-result-type legendre_next(unsigned l, unsigned m, T1 x, T2 Pl, T3 Plm1);
Реализует три термина рекуррентного отношения для ассоциированных многочленов Legendre, эта функция может быть использована для создания последовательности значений, оцененных при том жеx, и для повышенияl.
Например, мы могли бы создать вектор первых многочленных значений m+10, используя:
double x = 0.5; // Abscissa value int m = 10; // order vector<double> v; v.push_back(legendre_p(m, m, x)); v.push_back(legendre_p(1 + m, m, x)); for(unsigned l = 1; l < 10; ++l) v.push_back(legendre_next(l + 10, m, x, v[l], v[l-1])); // Double check values: for(unsigned l = 1; l < 10; ++l) assert(v[l] == legendre_p(10 + l, m, x));
Формально аргументами являются:
Степень последнего вычисленного полинома.
Порядок ассоциированного полинома.
значение абсциссы
Значение полинома оценивается на уровнеl.
Значение полинома оценивается на уровнеl-1.
Следующая таблица показывает пиковые ошибки (в единицах эпсилона) для различных областей входных аргументов. Обратите внимание, что только результаты для самого широкого типа с плавающей запятой в системе приведены, поскольку более узкие типы имеютфактически нулевую ошибку.
Table 6.32. Error rates for legendre_p
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Легендарные полиномы: малые значения |
Макс = 211ε (Средний = 20,4ε) |
Max = 0,732ε (Mean = 0,0619ε) |
Макс = 69.2ε (Средний = 9.58ε) |
Макс = 69,2ε (Средний = 9,58ε) |
Легендарные полиномы: большие значения |
Макс = 300ε (Средний = 33.2ε) |
Макс = 0,632ε (Средний = 0,0693ε) |
Макс = 699ε (Mean = 59.6ε) |
Макс = 699ε (Средний = 59.6ε) |
Table 6.33. Error rates for legendre_q
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Легендарные полиномы: малые значения |
Макс = 46.4ε (Средний = 7.32ε) |
Макс = 0,612ε (Средний = 0,0517ε) |
Макс = 50,9ε (Средний = 9ε) |
Макс = 50,9ε (Средний = 8,98ε) |
Легендарные полиномы: большие значения |
Макс = 4.6e+003ε (Средний = 366ε) |
Max = 2.49ε (Mean = 0.202ε) |
Макс = 5,98e+03ε (Средний = 478ε) |
Макс = 5,98e+03ε (Средний = 478ε) |
Table 6.34. Error rates for legendre_p (associated)
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Полиномы Легенды: Малые Значения |
Макс = 121ε (Средний = 7.14ε) |
Макс = 0,999ε (Средний = 0,05ε) |
Макс = 175ε (Mean = 9.88ε) |
Макс = 77.7ε (Средний = 5.59ε) |
Обратите внимание, что самые худшие ошибки происходят, когда порядок увеличивается, значения, превышающие ~ 120, очень маловероятны для получения разумных результатов, особенно в связанном полиномиальном случае, когда степень также велика. Кроме того, относительные ошибки могут расти произвольно, когда функция очень близка к корню.
Используется смесь точечных тестов значений, рассчитанных с помощью functions.wolfram.com, и случайно сгенерированных тестовых данных: тестовые данные были вычислены с использованиемNTL::RRс 1000-битной точностью.
Эти функции реализуются с использованием устойчивых трех терминов рекуррентных отношений. Эти отношения гарантируют низкую абсолютную ошибку, но не могут гарантировать низкую относительную ошибку вблизи одного из корней полиномов.
Статья Legendre (and Associated) Polynomials раздела Math Toolkit 2.5.0 Polynomials может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Polynomials ::
реклама |