在C#中实现差异化

时间:2011-03-31 16:55:34

标签: c# math

我有以下区别,我需要在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 个答案:

答案 0 :(得分:3)

这些直接都没有解决您的问题,但它可能会帮助您再次行动。在你的论文中陷入琐碎的事情可能是一种巨大的痛苦。

您可以访问Mathematica吗? Last I checked they had a .NET wrapper around their core engine called .NET/Link.

Mathematica的表现非常出色。此外,它现在支持GPU和群集等资源,如果您的任何应用程序适合并行化,它可以提供巨大的性能提升。

这可以让您专注于应用程序的其余部分,而不必重新发明轮子。此外,由于您可以直接在Mathematica笔记本编辑器中输入公式,因此您可以从C#端采用更通用的数据驱动方法。

Here is some typically-impenetrable Wolfram documentation

See also this thread关于在C#中解析Mathematica。

(我只推荐Mathematica,因为你提到你可能需要一个求解器来处理多个公式/等式/等等。除非实现求解器是你论文主题的核心部分,我才会建议使用这样的现成组件,并专注于您的原始研究。)

答案 1 :(得分:1)

找到对数函数的导数:

  

其中y = log b u
     dy / dx = log b (e)* 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));
}

答案 2 :(得分:1)

通常你自己计算衍生物的公式,如果记忆服务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);
}

答案 3 :(得分:0)

我认为很多答案都是在思考这个问题。 d/dt(log(x))仅为1/x,因此您只需计算数组A中每个点的倒数。

double[] W = Array.ConvertAll<double, double>(A, x => 1.0 / x);