Extreme Optimization Numerical Libraries for .NET
Разнообразных библиотек для создания .NET-приложений со времён появления этой платформы написано уже немало. Некоторые из них можно назвать библиотеками общего назначения, некоторые, в общем-то, довольно специфичны и узко специализированы. К таким относится и та библиотека, о которой я сейчас хочу вам рассказать. Итак, встречайте - Extreme Optimization Numerical Libraries for .NET.
Математика - царица всех наук
Внедрять в свои приложения элементы высшей математики (хотя в наше время называть высшей математикой те её разделы, которые так называют в ВУЗах, уже не совсем правильно) приходится гораздо чаще, чем это может показаться. Во многих экономических приложениях требуется поддержка статических расчётов, а уж про различные инструменты для инженеров и говорить не приходится. Даже графические программы нередко используют алгоритмы, основанные на физических формулах для цвета, в которых фигурируют различные интегралы. Приложения для работы со звуком и видео тоже не исключение - в них, как минимум, есть реализация быстрого преобразования Фурье. Так что не у дел, как видите, остаются только разные web-сервисы, да и то далеко не все.
Каждый раз, конечно, когда разработчики сталкиваются с необходимостью реализации каких-то алгоритмов в своих приложениях, причём алгоритмов достаточно сложных и не слишком хорошо знакомых тому, кто должен будет их кодировать, приходится выбирать, как поступить - самостоятельно реализовать их или же купить специальную библиотеку какого-либо стороннего производителя, которая справится с поставленной задачей заведомо быстрее. На мой взгляд, при создании серьёзных приложений имеет смысл покупать проверенные библиотеки известных разработчиков, а не изобретать велосипед самостоятельно - как правило, такая изобретательская деятельность приносит не такие хорошие результаты, как хотелось бы самим изобретателям. Не помню когда, но точно помню, что такое было уже - я уже высказывал в "Компьютерных вестях" свои взгляды на вопросы покупки сторонних компонентов приложения и на целесообразность создания собственных библиотек под один конкретный проект. Думаю, вы сами понимаете, что с той публикации мои взгляды поменялись мало, как и реальное положение дел - изобретение велосипеда и его отладка могут вылиться в большие убытки, в то время как покупка хороших сторонних компонентов способна приблизить вашу разработку к тому сроку, в который вы её должны представить, и при этом даже поднять её качество.
Что за математика предлагается?
Что ж, давайте уже перейдём к разговору непосредственно о самой библиотеке Extreme Optimization Numerical Libraries for .NET. Потому что общие разговоры о разных библиотеках - это, безусловно, и хорошо, и полезно, и, будем надеяться, даже интересно, но, тем не менее, статья всё-таки посвящена именно этой библиотеке.
Для начала, само собой, о том, где именно эту библиотеку можно найти. Сделать это, конечно же, можно с помощью Всемирной сети, если зайти на сайт, расположенный по адресу www.extremeoptimization.com. Адрес сайта, как видите, запомнить не так уж и сложно, хотя и коротким его вряд ли можно назвать. Перед скачиванием 17,5-мегабайтного дистрибутива пробной версии библиотеки вас попросят заполнить небольшую регистрационную форму. Без этого, к сожалению, скачать библиотеку не получится.
Что же за математику реализовали разработчики Extreme Optimization Numerical Libraries for .NET в своём детище? О, всякого разного ими было реализовано немало. Всё это подразделено на три большие части: базовая математика, матричная и векторная алгебра, статистика. В базовую математику входят: поддержка комплексных чисел, численное интегрирование и дифференцирование, специальные функции, оптимизация (поиск минимумов и максимумов) функций одной или нескольких переменных, быстрое преобразование Фурье (одномерное и двумерное), интерполяция (сплайнами, кубическая, бикубическая, линейная). К векторной и матричной алгебре разработчиками, как несложно догадаться, было отнесено выполнение различных операций над действительными и комплексными векторами и матрицами - и при этом поддерживается три различных типа матриц, поддерживается также факторизация матриц различными методами. Что касается статистики, то библиотека поддерживает 29 разных видов статистических распределений, умеет строить линейную и нелинейную регрессии, поддерживает 14 различных тестов для определения правильности статистических гипотез, имеет четыре разных генератора случайных чисел, поддерживает кластерный анализ.
Так что, как видите, если свой аналог MathCAD'а или другого математического пакета написать с использованием одной только Extreme Optimization Numerical Libraries for .NET и не получится (всё-таки поддержка символьных вычислений в библиотеке не предусмотрена), то, по крайней мере, мощное приложение для различных численных расчётов с её помощью написать на C# или каком-то другом .NET-совместимом языке вполне по силам большинству разработчиков.
Копнём поглубже...
Конечно, список поддерживаемых библиотекой математических операций - вещь полезная и познавательная, однако один он не может дать исчерпывающих сведений о том программном продукте, о котором мы с вами сейчас ведём разговор. Давайте посмотрим на него под немного другим углом - какими ещё отличительными особенностями, кроме поддержки многих разделов математики, он обладает?
Во-первых, к тому списку возможностей, который я привёл выше, нужно добавить наличие множества встроенных в библиотеку важных математических констант (как вы сами понимаете, они не заканчиваются на числе Пи и числе Эйлера). Что касается комплексных чисел, то для их реализации были использованы типы данных с двойной точностью (double precision), что даёт возможность использовать их в самых высокоточных расчётах. Все функции, имеющиеся в стандартном .NET'овском namespace под названием System.Math, расширены библиотекой до поддержки работы с комплексными числами, при этом отдельно поддерживается комплексная бесконечность в качестве одного из возможных значений.
Численное интегрирование может быть выполнено методом Симпсона или методом Ромберга, а также адаптивным методом Гаусса. Если вы не в курсе, чем отличаются эти методы, то перед применением библиотеки Extreme Optimization Numerical Libraries for .NET лучше прочтите какой-нибудь учебник по численным методам - без него можно наломать немало дров. Поддерживается работа с несобственными (имеющими бесконечные границы) сходящимися интегралами. Оптимизация возможна даже для функций, имеющих точки разрыва.
Работа с кривыми, как и положено в .NET-библиотеке, реализована с использованием объектно-ориентированного подхода. То есть, переводя эту фразу на русский язык, можно сказать, что каждая кривая в библиотеке - это отдельный объект, с которым можно работать путём применения его собственных методов. О том, что Extreme Optimization Numerical Libraries for .NET поддерживает различные типы кривых и разные методы интерполяции, я, кажется, уже говорил выше.
При решении уравнений библиотека может искать как действительные, так и комплексные их корни (это относится, в первую очередь, к тем уравнениям, в которых левая часть - многочлен). Можно решать системы линейных алгебраических уравнений, а также системы уравнений нелинейных - эта возможность появилась в последней версии библиотеки.
Для быстрого преобразования Фурье в Extreme Optimization Numerical Libraries for .NET предусмотрены три различные реализации: одна написана полностью на managed-коде, а две другие - на родном платформенном коде, 32-битном и 64-битном для использования, соответственно, на разных вариантах платформ.
Что касается поддержки различных специфических функций, то в библиотеке, о которой мы с вами сейчас ведём речь, она реализована на весьма приличном уровне. Поддерживаются различные функции из комбинаторики, гамма- и бета-функции, гиперболические и обратные гиперболические функции, функции Бесселя, а также экспоненциальные, тригонометрические и логарифмический интегралы. Если вам нужно реализовать поддержку этих функций у себя в приложении, то с использованием Extreme Optimization Numerical Libraries for .NET за этим дело не станет.
Разработчики уверяют, что библиотека полностью соответствует всем правилам и рекомендациям, которые корпорация Microsoft даёт в отношении библиотек, расширяющих функциональность стандартных модулей .NET Framework'а. Этим требованиям и рекомендациям отвечают и иерархия классов в Extreme Optimization Numerical Libraries for .NET, и использование параметров в методах, и имена методов, и многое другое, что образует очень важную часть любой библиотеки.
Стоит также отметить, что вместе с библиотекой разработчики получают очень неплохой набор документации к ней и различных примеров, написанных на трёх основных языках для платформы .NET: C#, Visual Basic .NET и Managed C++. Впрочем, даже если вы хотите писать программу на каком-то другом языке - скажем, том же Delphi.NET или совсем недавно представленном корпорацией Microsoft языке F#, то никто не мешает вам это сделать - в конце концов, все языки для платформы .NET довольно схожи, и разобраться в документации будет довольно просто.
Резюме
Что ж, давайте, пожалуй, подведём итоги всему тому, что было сказано выше об Extreme Optimization Numerical Libraries for .NET - мощной математической библиотеке для разработки .NET-приложений.
Ну, во-первых, как вы сами можете увидеть, поддерживает эта библиотека много всего, а потому, если вам действительно требуется мощная математическая библиотека, то стоит обратить на неё внимание. Во-вторых, стоит заметить, что благодаря хорошей документации и примерам она довольно просто осваивается. В-третьих, благодаря тому, что часть её написана не на managed, а на native коде, работать всё будет быстро.
Но есть несколько "но". Самое главное - это цена библиотеки. То есть, если вы не вполне уверены в том, что вам потребуется сколько-нибудь значительная часть всего того, что может Extreme Optimization Numerical Libraries for .NET, то, возможно, более удачным путём будет поиск какой-нибудь библиотеки попроще и подешевле. Ещё один немаловажный фактор - это необходимость наличия у разработчика хотя бы приблизительного представления о численных методах и об их возможностях, а также об особенностях использования некоторых из них. Впрочем, думаю, с этими оговорками разобраться на практике не так уж и сложно.
Вадим СТАНКЕВИЧ