Математическая библиотека для .NET

Немного рекламы

Скачать (исходники + скомпилированный release)

Эта библиотека выросла из библиотеки для комплексных чисел в .NET, которую сделал сначала. Потом туда же добавил преобразования Фурье, а потом, когда понадобилось сделать еще и аппроксимацию, то понял, что надо разбить библиотеку на отдельные сборки. Ниже кратко опишу все dll-ки и что в них находится. Использование этой библиотеки никаких вопросов вызвать не должно, да и в юнит-тестах всегда можно подсмотреть как что вызывать.

Complex.dll - комплексные числа

Сюда входят два класса - Complex, в котором, собственно, и содержатся все операции над числами, и Polar - вспомогательный класс для создания комплексных чисел в полярной системе координат (по модулю и аргументу).

Конструкторов у этих классов несколько:

public Complex (double re)
public Complex (double re, double im)
public Complex (Complex x)
public Complex (Polar x)

А для создания класса Polar есть следующие конструкторы:

public Polar (double r)
public Polar (double r, double phi)

Также есть операторы для преобразования между Polar, Complex и double.
Естественно, реализованы основные математические операции над комплексными числами, как то сложение, умножение, деление, получение комплексно-сопряженного числа, извлечение корня, включая извлечение корня из отрицательных double (Sqrt), извлечение корней n-ой степени (Radical), вычисление экспоненты комплексного числа (Exp), возведение в степень (Pow) и такие операции как Sin, Cos, arcsin (Asin), arccos (Acos) и вычисление натурального логарифма (Log).

Fourier.dll - преобразования Фурье

Заметьте, что здесь именно преобразованиЯ, а не только быстрое преобразование Фурье. Статический класс Fourier содержит следующие функции:

  • Прямое (FFT) и обратное (IFFT) быстрое преобразование Фурье. В качестве входного массива принимается double[] или Complex[], описанный выше.
  • Дискретное прямое (DFT) и обратное (IDFT) преобразование фурье (не быстрое, но для которого зато размер входного массива не обязательно должен равняться степени двойки).
  • Двумерное быстрое прямое (FFT2) и обратное (IFFT2) преобразование Фурье. В качестве входных массивов могут быть double[,] и Complex[,].
  • Двумерное дискретное прямое (DFT2) и обратное (IDFT2) преобразование Фурье.
  • Функция fftShift для представления полученных частот, с помощью быстрого преобразования Фурье, таким образом, чтобы нулевая частота оказалась в центре массива. Эта же функция проводит и обратную операцию. Так же есть перегруженная функция для схожей обработки результатов двумерного преобразования Фурье.

Approximation.dll - аппроксимация функций

В данный момент в этой сборке находятся два класса - Spline для аппроксимации (интерполяции, экстраполяции) массива кубическим сплайном и Polynomial для аппроксимации полиномом, степень которого задается при создании этого класса, методом наименьших квадратов. Все эти классы реализуют интерфейс IApproximation, который содержит единственный член - double GetValue (double xpoint). Это сделано для того, чтобы можно было бы не зависеть от типа аппроксимации.

Алгоритмы для аппроксимаций я брал из книги В. П. Дьяконова "Справочник по алгоритмам и программам на языке Бейсик для персональных ЭВМ", 1987 г.

UnitTest.dll - юнит-тесты всех классов

Для каждого из этих классов были написаны юнит-тесты, по которым можно заодно посмотреть как использовать нужный класс. Для создания Юнит-тестов использовалась библиотека NUnit версии 2.2.7.

Ну что ж, надеюсь Вам понравится эта библиотека.

Немного рекламы

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 4.7/5. Всего 38 голос(а, ов)



clente 16.08.2011 - 14:34

поправки

в конструкторе для вычисления Arg(x) не предусмотрено значение аргумента в 90 градусов. надо рассмотреть случай чисто мнимого числа без действительной части. Например так:
public double Arg

        {

            get
            {
                double res = 0;
                if (m_real != 0)
                {
                    res = Math.Atan2(m_imag, m_real);
                    return res;
                }
                else
                {
                    if (m_imag < 0)
                    {
                       res = Math.Asin(1);
                    }
                    if (m_imag > 0)
                    {
                        res = Math.Asin(-1);
                    }
                    return res;
                }

            }
        }

12 15.06.2014 - 14:41

ДФТ

Пишет индекс находится вне границ массива,если делать FFT2 happy smiley


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 523
 

Сергей 11.07.2009 - 23:32

Спасибо

Спасибо за библиотеку. Буду разбираться!

keleg 01.08.2009 - 19:03

Ищу сейчас библиотеку для .net - аналог math но для decimal.
Нужна для моего freeware - калькулятора (наследника NLCalc) - http://www.keleg.info/tag/notecalc
Не хотите ли присоединиться к разработке?
keleg@mail.ru