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 questionFor example, I have points
Y X
100 50 90 43 80 32need 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 89need 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.
精彩评论