是否有任何C#数学库进行插值/外推

例如,我有分数

YX
100 50
90 43
80 32

需要解决y = 50

要么

YX
1/1/2009 100
1/3/2009 97
1/4/2009 94
1/5/2009 92
1/6/2009 91
1/9/2009 89

需要解决y = 1/23/2009

我使用的是Math.NET的数字组件http://numerics.mathdotnet.com/

它包含“各种插值方法,包括重心方法和样条”。

但俗话说,有谎言,该死的谎言和双三次样条插值。

看看你能在ALGLIB找到你想要的东西 。 当然,您仍然需要针对您的问题做出适当类型的插值/外推决策。

我不知道库,但这里是一个简单的Secant求解器:

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 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 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; } } 

用法:

 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带来了所有标准插值function。 您将找到各种插补/外插function,具有通用,简单的界面。 与其他解决方案相比的一个特别优势是速度:这些function经过精心优化,可以在多核硬件和大数据上尽可能快地进行优化。