1 文本格式
using System;
namespace Legalsoft.Truffer
{
/// <summary>
/// 多项式插值与外推插值
/// Polynomial Interpolation and
/// Extrapolation interpolation routines for one dimension
/// </summary>
public class Poly_interp : Base_interp
{
public double dy { get; set; }
public Poly_interp(double[] xv, double[] yv, int m) : base(xv, yv[0], m)
{
this.dy = 0.0;
}
/// <summary>
/// Given a value x, and using pointers to data xx and yy, this routine returns
/// an interpolated value y, and stores an error estimate dy. The returned
/// value is obtained by mm-point polynomial interpolation on the subrange
/// xx[jl..jl + mm - 1].
/// </summary>
/// <param name="jl"></param>
/// <param name="x"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public override double rawinterp(int jl, double x)
{
int ns = 0;
//double[] xa = xx.range(jl);
//double[] ya = yy.range(jl);
double[] c = new double[mm];
double[] d = new double[mm];
//double dif = Math.Abs(x - xa[0]);
double dif = Math.Abs(x - xx[jl + 0]);
for (int i = 0; i < mm; i++)
{
double dift = Math.Abs(x - xx[jl + i]);
if ((dift) < dif)
{
ns = i;
dif = dift;
}
c[i] = yy[jl + i];
d[i] = yy[jl + i];
}
double y = yy[jl + ns--];
for (int m = 1; m < mm; m++)
{
for (int i = 0; i < mm - m; i++)
{
double ho = xx[jl + i] - x;
double hp = xx[jl + i + m] - x;
double w = c[i + 1] - d[i];
double den = ho - hp;
//if ((den) == 0.0)
if (Math.Abs(den) <= float.Epsilon)
{
throw new Exception("Poly_interp error");
}
den = w / den;
d[i] = hp * den;
c[i] = ho * den;
}
y += (dy = (2 * (ns + 1) < (mm - m) ? c[ns + 1] : d[ns--]));
}
return y;
}
}
}
2 代码格式
using System;
namespace Legalsoft.Truffer
{
/// <summary>
/// 多项式插值与外推插值
/// Polynomial Interpolation and
/// Extrapolation interpolation routines for one dimension
/// </summary>
public class Poly_interp : Base_interp
{
public double dy { get; set; }
public Poly_interp(double[] xv, double[] yv, int m) : base(xv, yv[0], m)
{
this.dy = 0.0;
}
/// <summary>
/// Given a value x, and using pointers to data xx and yy, this routine returns
/// an interpolated value y, and stores an error estimate dy. The returned
/// value is obtained by mm-point polynomial interpolation on the subrange
/// xx[jl..jl + mm - 1].
/// </summary>
/// <param name="jl"></param>
/// <param name="x"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public override double rawinterp(int jl, double x)
{
int ns = 0;
//double[] xa = xx.range(jl);
//double[] ya = yy.range(jl);
double[] c = new double[mm];
double[] d = new double[mm];
//double dif = Math.Abs(x - xa[0]);
double dif = Math.Abs(x - xx[jl + 0]);
for (int i = 0; i < mm; i++)
{
double dift = Math.Abs(x - xx[jl + i]);
if ((dift) < dif)
{
ns = i;
dif = dift;
}
c[i] = yy[jl + i];
d[i] = yy[jl + i];
}
double y = yy[jl + ns--];
for (int m = 1; m < mm; m++)
{
for (int i = 0; i < mm - m; i++)
{
double ho = xx[jl + i] - x;
double hp = xx[jl + i + m] - x;
double w = c[i + 1] - d[i];
double den = ho - hp;
//if ((den) == 0.0)
if (Math.Abs(den) <= float.Epsilon)
{
throw new Exception("Poly_interp error");
}
den = w / den;
d[i] = hp * den;
c[i] = ho * den;
}
y += (dy = (2 * (ns + 1) < (mm - m) ? c[ns + 1] : d[ns--]));
}
return y;
}
}
}