C# 在C语言中实现差分#

C# 在C语言中实现差分#,c#,math,C#,Math,我有以下区别,我需要在C#中实现它: 其中A(t)是一个双数据数组 如何从上面的导数中获得结果W(t)数组 谢谢 编辑: 公共双[,]导数() { dvdt=新的双精度[信封.GetLength(0),信封.GetLength(1)]; int h=1; 对于(int j=0;j

我有以下区别,我需要在C#中实现它:

其中
A(t)
是一个双数据数组

如何从上面的导数中获得结果
W(t)
数组

谢谢

编辑:

公共双[,]导数()
{
dvdt=新的双精度[信封.GetLength(0),信封.GetLength(1)];
int h=1;
对于(int j=0;j
我找到了这个库,但我无法理解示例代码是如何工作的,以及如何将其应用于我的问题,呃

所有这些都不能直接解决您的问题,但它可能会帮助您重新开始。在论文中纠缠于琐碎的项目可能是一件非常痛苦的事情

你有进入Mathematica的途径吗

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

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

关于用C#解析Mathematica


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

要找到对数函数的导数:

其中y=logb u
dy/dx=logb(e)*u'/u
其中u'=du/dx

为了回答你的问题,我们需要知道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));
}

通常你自己计算出导数的公式,如果内存为d/dx[log_b x]=[1/(x lnb)]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);
}
double log_b=Math.log(10);//假设Math.Log=ln,b=10
双dt=1.0;//在这种情况下,dt为1,否则更改
double[]W=新的double[A.GetLength(0)];
对于(int t=0;t
我认为很多答案都是对这一点的过度思考
d/dt(log(x))
仅为
1/x
,因此您只需计算阵列
A
中每个点的倒数

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

听起来像是一个典型的家庭作业问题:我们是想找一个通用的微分求解器,还是只想找
log
?这并不是我在写论文,我得不到一个好结果;这对每个人来说都会更容易。@共产主义鸭子现在我需要解对数A(t),但如果通用解算器能工作,我会给它一个快照,并找到A(t)的导数。我能用y的变化/x的变化吗?是的,它将是一个常数
k
@Tristan Demanuele:问题是“x的变化有多大?”你可以用X的一个很小的变化来近似它,但是你的答案并不准确。
Math.Log(10)
表示
ln10
。你想要
Math.Log10(t)
,对吧?我有点生疏了,但我相信它在导数项中是
lnb
,还是不正确?
d/dx[log\u bx]=log\u b(e)x'/x
,所以如果b=10,你想要
Math.Log10(Math.e)
,或者
Math.log(Math.e,10)
。有趣的是,我用了()作为参考,这就不同了。我的答案不再适用了,因为它似乎是一个函数的结果。哈,你猜怎么着
(1/Math.Log(10))
Math.Log10(Math.E)
显然是同一回事。如图所示。:-)
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));
}
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);
}
double[] W = Array.ConvertAll<double, double>(A, x => 1.0 / x);