【发布时间】:2010-03-07 13:11:52
【问题描述】:
比如我有积分
Y X
100 50
90 43
80 32
需要解出 y = 50
或
Y X
2009 年 1 月 1 日 100
2009 年 1 月 3 日 97
2009 年 1 月 4 日 94
2009 年 1 月 5 日 92
2009 年 1 月 6 日 91
2009 年 1 月 7 日 89
需要求解 y = 1/23/2009
【问题讨论】:
比如我有积分
Y X
100 50
90 43
80 32
需要解出 y = 50
或
Y X
2009 年 1 月 1 日 100
2009 年 1 月 3 日 97
2009 年 1 月 4 日 94
2009 年 1 月 5 日 92
2009 年 1 月 6 日 91
2009 年 1 月 7 日 89
需要求解 y = 1/23/2009
【问题讨论】:
我使用的是 Math.NET 的数字组件http://numerics.mathdotnet.com/
它包含“各种插值方法,包括重心方法和样条曲线”。
但俗话说,有谎言,该死的谎言和双三次样条插值。
【讨论】:
看看你是否能在ALGLIB找到你想要的东西。当然,您仍然需要针对您的问题决定合适的插值/外插类型。
【讨论】:
我不了解库,但这里有一个简单的正割求解器:
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;
}
}
用法:
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 带来了所有标准的插值函数。您会发现具有通用、简单界面的各种插值/外插函数。与其他解决方案相比的一个特别优势是速度:这些功能经过精心优化,可在多核硬件和大数据上尽可能快。
【讨论】: