Решение дифференциальных уравнений в частных производных с помощью C#

pow только работы над числами с плавающей запятой (double с, на самом деле). Если Вы захотите взять полномочия целых чисел, и основой, как известно, не является экспонента 2, Вы будете иметь к самокрутке.

Обычно немой путь достаточно хорош.

int power(int base, unsigned int exp) {
    int i, result = 1;
    for (i = 0; i < exp; i++)
        result *= base;
    return result;
 }

Вот рекурсивное решение, которое берет O(log n) пространство и время вместо легкого O(1) пространство O(n) время:

int power(int base, int exp) {
    if (exp == 0)
        return 1;
    else if (exp % 2)
        return base * power(base, exp - 1);
    else {
        int temp = power(base, exp / 2);
        return temp * temp;
    }
}
5
задан Peter Mortensen 17 September 2010 в 20:09
поделиться

4 ответа

Вы можете решить проблему в MATLAB и использовать компилятор MATLAB + Builder NE toolbox для создания сборки .NET, которая связана с остальной частью ваше приложение.

2
ответ дан 18 December 2019 в 13:16
поделиться

Посмотрите http://www.mathdotnet.com/About.aspx , возможно, там есть то, что вам нужно. Однако я подозреваю, что вам следует получить лучшую библиотеку для требований вашего приложения, а затем связать ее со своим .net-приложением.

Вы, вероятно, обнаружите, что с такими вещами (кроме тех случаев, когда вы используете для изучения языка или maths) существует ряд готовых библиотек.

2
ответ дан 18 December 2019 в 13:16
поделиться

Зависит от того, какие уравнения в частных производных вы хотите решить и как вы хотите к ним подойти.

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

Линейно-эллиптический (стационарная диффузия), параболический (переходная диффузия) и гиперболический (F = MA динамический) PDE требуют несколько иных подходов.

Все три из этих УЧП могут использовать классические конечные разности, конечные элементы (взвешенная невязка) или граничные элементы (функции Грина) для создания системной матрицы, которую вы хотите решить. Общие нелинейные УЧП, вероятно, лучше всего атаковать, используя метод конечных элементов / взвешенных невязок.

Но параболические и гиперболические PDF превратятся в связанные наборы ODE, как только вы их дискретизируете. Вы должны выполнить временную интеграцию, чтобы многократно решать временную эволюцию. Параболические ОДУ имеют первый порядок во времени; гиперболические ODE - второго порядка во времени.

Я изучаю CUDA и NVIDIA. Возможно, вы захотите изучить привязки CUDA для вашего языка.

Все это сами по себе большие темы. Пожалуйста, Google найдите некоторые источники, потому что здесь невозможно дать больше, чем беглый обзор.

ОБНОВЛЕНИЕ: Недавно я узнал о Microsoft Solver Foundation . Я сам не разбирался в этом, но, возможно, это поможет разработчикам C # в решении этой проблемы.

Возможно, вы захотите изучить привязки CUDA для вашего языка.

Все это сами по себе большие темы. Пожалуйста, Google найдите некоторые источники, потому что здесь невозможно дать больше, чем беглый обзор.

ОБНОВЛЕНИЕ: Недавно я узнал о Microsoft Solver Foundation . Я сам не разбирался в этом, но, возможно, это поможет разработчикам C # в решении этой проблемы.

Возможно, вы захотите изучить привязки CUDA для вашего языка.

Все это большие темы сами по себе. Пожалуйста, Google найдите некоторые источники, потому что здесь невозможно дать больше, чем беглый обзор.

ОБНОВЛЕНИЕ: Недавно я узнал о Microsoft Solver Foundation . Я сам не разбирался в этом, но, возможно, это поможет разработчикам C # в решении этой проблемы.

7
ответ дан 18 December 2019 в 13:16
поделиться

Другой вариант - AlgLib . Мне это нравится, потому что в отличие от всеобъемлющих библиотек, где вы должны найти то, что вам нужно, AlgLib имеет все алгоритмы, разделенные и часто предлагаются на нескольких языках (включая C #, в большинстве / во всех случаях). Что касается вычислений, которые AlgLib покрывает:

        Euler's method
        Runge-Kutta method
        Runge-Kutta method for a system of ODEs
        Bulirsch-Stoer method for a system of ODEs

Однако ... при проверке этого алгоритма в AlgLib я заметил, что они больше не поддерживаются (AlgLib), потому что их лицензии могут быть несовместимы с лицензией AlgLib (которая является GPL , Я полагаю).

3
ответ дан 18 December 2019 в 13:16
поделиться