当前位置:  开发笔记 > 编程语言 > 正文

用C#进行数学函数区分?

如何解决《用C#进行数学函数区分?》经验,为你挑选了2个好方法。

我看到我可以声明一个函数(比如说)

public double Function(double parameter)

但是,如果我想采取该功能的衍生物怎么办?



1> pyon..:

您无法使用计算机程序计算函数的精确导数(除非您正在进行符号数学......但这是另一种更复杂的主题).

有几种方法可以计算函数的数值导数.最简单的是居中的三点法:

拿一小部分h

评估 [f(x+h) - f(x-h)] / 2h

Voilà,f'(x)的近似值,只有两个函数评估

另一种方法是中心五点法:

拿一小部分h

评估 [f(x-2h) - 8f(x-h) + 8f(x+h) - f(x+2h)] / 12h

Voilà,f'(x)的更好逼近,但它需要更多的函数评估


另一个主题是如何使用C#实现它.首先,您需要一个代表一个函数的委托,该函数将实数的一个子集映射到另一个实数的子集:

delegate double RealFunction(double arg);

然后,您需要一个评估衍生的路由:

public double h = 10e-6; // I'm not sure if this is valid C#, I'm used to C++

static double Derivative(RealFunction f, double arg)
{
    double h2 = h*2;
    return (f(x-h2) - 8*f(x-h) + 8*f(x+h) - f(x+h2)) / (h2*6);
}

如果需要面向对象的实现,则应创建以下类:

interface IFunction
{
    // Since operator () can't be overloaded, we'll use this trick.
    double this[double arg] { get; }
}

class Function : IFunction
{
    RealFunction func;

    public Function(RealFunction func)
    { this.func = func; }

    public double this[double arg]
    { get { return func(arg); } }
}

class Derivative : IFunction
{
    IFunction func;
    public static double h = 10e-6;

    public Derivative(IFunction func)
    { this.func = func; }

    public double this[double arg]
    {
        get
        {
            double h2 = h*2;
            return (
                func[arg - h2] - func[arg + h2] +
                ( func[arg + h]  - func[arg - h] ) * 8
                ) / (h2 * 6);
        }
    }
}


导数.最简单的是居中的三点法:

2> ntownsend..:

如果您正在考虑对公式进行符号处理,那么您最好使用Maple或Mathematica等语言进行推导.它们是为符号计算而设计的.

编辑:如果Maple和Mathematica对你来说太昂贵,那么还有其他选择.维基百科有一个相当完整的计算机代数包列表.http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有