开发者

Are there any C# math libraries that do interpolation / extrapolation [closed]

开发者 https://www.devze.com 2022-12-22 16:48 出处:网络
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.

We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can e开发者_如何转开发dit the question so it can be answered with facts and citations.

Closed 6 years ago.

Improve this question

For example, I have points

Y X

100 50

90 43

80 32

need to solve for y = 50

or

Y X

1/1/2009 100

1/3/2009 97

1/4/2009 94

1/5/2009 92

1/6/2009 91

1/7/2009 89

need to solve for y = 1/23/2009


The one I use is the numerics component of Math.NET http://numerics.mathdotnet.com/

It contains "various interpolation methods, including barycentric approaches and splines".

But as the saying goes, there are lies, damn lies and bicubic spline interpolations.


See if you can find what you want at ALGLIB. Of course, you'll still have to make decisions about the appropriate type of interpolation/extrapolation for your problem.


I don't know about libraries but here's a simple Secant solver :

class SecantSolver
{
    private int     _maxSteps= 10;
    private double _precision= 0.1;

    public SecantSolver(int maxSteps, double precision)
    {
        _maxSteps= maxSteps;
        _precision= precision;

        if (maxSteps <= 0)
            throw new ArgumentException("maxSteps is out of range; must be greater than 0!");

        if (precision <= 0)
            throw new ArgumentException("precision is out of range; must be greater than 0!");

    }

    private double ComputeNextPoint(double p0, double p1, Func<Double,Double> f)
    {
        double r0 = f(p0);
        double r1 = f(p1);
        double p2 = p1 - r1 * (p1-p0) / (r1-r0); // the basic secant formula
        return p2;
    }

    public double Solve( double lowerBound, double upperBound, Func<Double,Double> f, out String message)
    {
        double p2,p1,p0;
        int i;
        p0=lowerBound;
        p1=upperBound;
        p2= ComputeNextPoint(p0,p1,f);

        // iterate till precision goal is met or the maximum
        // number of steps is reached
        for(i=0; System.Math.Abs(f(p2))>_precision &&i<_maxSteps;i++) {
            p0=p1;
            p1=p2;
            p2=ComputeNextPoint(p0,p1,f);
        }

        if (i < _maxSteps)
            message = String.Format("Method converges in " + i + " steps.");
        else
            message = String.Format("{0}. The method did not converge.", p2);

        return p2;
    }
}

Usage:

SecantSolver solver= new SecantSolver(200,              // maxsteps
                                      0.00000001f/100   // tolerance
                                      );

string message;
double root= solver.Solve(0.10,   // initial guess (lower)
                          1.0,    // initial guess (upper)
                          f,      // the function to solve
                          out message
                          );


ILNumerics Interpolation Toolbox brings all the standard interpolation functions. You will find various interpolation/ extrapolation functions with a common, simple interface. A particular advantage over other solutions is the speed: these functions are carefully optimized to be as fast as possible on multicore hardware and for large data.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号