Реализация дифференциации в C # - PullRequest
6 голосов
/ 31 марта 2011

У меня есть следующая дифференциация, мне нужно реализовать ее в C #:

W(t)=d/dt(log(A(t)))

Где A(t) - массив двойных данных.

Как я могу получить результирующий массив W(t) из производной выше?

Спасибо

редактирование:

public double[,] derivative()
{
    dvdt = new double[envelope.GetLength(0), envelope.GetLength(1)];
    int h = 1;

    for (int j = 0; j < envelope.GetLength(0); j++)
    {
        for (int i = 0; i < envelope.GetLength(1)-1 ; i++)
        {
            dvdt[j, i] = (envelope[j, i + h] - envelope[j, i]) / (h);
        }
    }
    return dvdt;
}

Я нашел эту библиотеку http://autodiff.codeplex.com/, но я не могу понять, как работает пример кода и как я могу применить его к моей проблеме э

Ответы [ 4 ]

3 голосов
/ 31 марта 2011

Ничего из этого напрямую не ответит на ваш вопрос, но может помочь вам снова начать движение. Застрять на тривиальные вещи в вашей диссертации может быть королевской болью.

У вас есть доступ к Mathematica? В последний раз я проверял, что у них есть ядро ​​.NET вокруг их ядра, называемого .NET / Link.

Производительность Mathematica звездная. Кроме того, теперь он поддерживает такие ресурсы, как графические процессоры и кластеры, которые могут значительно повысить производительность, если любое ваше приложение поддается параллелизации.

Это позволит вам сосредоточиться на остальной части вашего приложения вместо того, чтобы заново изобретать колесо. Кроме того, поскольку вы можете вводить формулы непосредственно в редакторе блокнотов Mathematica, вы можете использовать более общий подход, основанный на данных, со стороны C #.

Вот несколько типично непроходимых документов Wolfram .

См. Также эту ветку о разборе Mathematica в C #.

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

1 голос
/ 31 марта 2011

Обычно вы сами разрабатываете формулу для производной, и если память служит d/dx[log_b x] = [1/(x ln b)] dx. Если A(t) - простой массив:

double log_b = Math.Log(10); // Assumes Math.Log = ln and b = 10
double dt = 1.0;             // dt is 1 in this case, change if otherwise

double[] W = new double[A.GetLength(0)];
for (int t = 0; t < A.GetLength(0); ++t)
{
    W[t] = dt / (A[t] * log_b);
}
1 голос
/ 31 марта 2011

Чтобы найти производную логарифмической функции:

, где y = log b u
dy / dx = log b (e) * u ' / u
, где u ' = du / dx

http://www.intmath.com/differentiation-transcendental/5-derivative-logarithm.php#derivbases

Итак, чтобыответьте на ваш вопрос, нам нужно знать производную от A(t).Если вы не знаете, что такое A (t) раньше времени, вам нужно будет найти какой-то универсальный решатель или потребовать, чтобы входные данные включали в себя как функцию A, так и ее производную.

public double Log10Derivative(Func<double, double> a, 
                              Func<double, double> aPrime, 
                              double t)
{
    return Math.Log10(Math.E) * (aPrime(t) / a(t));
}

Что касается выполнения log для массива, я либо никогда не узнал этого, либо забыл, как.

Редактировать

Это должно дать вам приближение:

public double Log10Derivative(Func<double, double> a, 
                              double t)
{
    const double reallySmallNumber = double.Epsilon;
    var aPrimeEst = (a(t) - a(t + reallySmallNumber)) / reallySmallNumber;
    return Math.Log10(Math.E) * (aPrimeEst / a(t));
}
0 голосов
/ 01 апреля 2011

Я думаю, что многие ответы обдумывают это.d/dt(log(x)) это просто 1/x, поэтому вам просто нужно вычислить обратную величину для каждой точки в массиве A.

double[] W = Array.ConvertAll<double, double>(A, x => 1.0 / x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...