1 文本格式
using System;
namespace Legalsoft.Truffer
{
/// <summary>
/// 重心有理插值对象
/// Barycentric rational interpolation object.
/// After constructing the object,
/// call interp for interpolated values.
/// Note that no error estimate dy is calculated.
/// </summary>
public class BaryRat_interp : Base_interp
{
private double[] w { get; set; }
private int d { get; set; }
/// <summary>
/// Constructor arguments are x and y vectors of length n,
/// and order d of desired approximation.
/// </summary>
/// <param name="xv"></param>
/// <param name="yv"></param>
/// <param name="dd"></param>
/// <exception cref="Exception"></exception>
public BaryRat_interp(double[] xv, double[] yv, int dd) : base(xv, yv[0], xv.Length)
{
this.w = new double[n];
this.d = dd;
if (n <= d)
{
throw new Exception("d too large for number of points in BaryRat_interp");
}
for (int k = 0; k < n; k++)
{
int imin = Math.Max(k - d, 0);
int imax = k >= n - d ? n - d - 1 : k;
double temp = (imin & 1) != 0 ? -1.0 : 1.0;
double sum = 0.0;
for (int i = imin; i <= imax; i++)
{
int jmax = Math.Min(i + d, n - 1);
double term = 1.0;
for (int j = i; j <= jmax; j++)
{
if (j == k)
{
continue;
}
term *= (xx[k] - xx[j]);
}
term = temp / term;
temp = -temp;
sum += term;
}
w[k] = sum;
}
}
/// <summary>
/// Use equation(3.4.9) to compute the
/// barycentric rational interpolant.
/// Note that jl is not used since
/// the approximation is global;
/// it is included only
/// for compatibility with Base_interp.
/// </summary>
/// <param name="jl"></param>
/// <param name="x"></param>
/// <returns></returns>
public override double rawinterp(int jl, double x)
{
double num = 0;
double den = 0;
for (int i = 0; i < n; i++)
{
double h = x - xx[i];
//if (h == 0.0)
if (Math.Abs(h) <= float.Epsilon)
{
return yy[i];
}
else
{
double temp = w[i] / h;
num += temp * yy[i];
den += temp;
}
}
return num / den;
}
/// <summary>
/// No need to invoke hunt or locate since
/// the interpolation is global, so
/// override interp to simply call rawinterp
/// directly with a dummy value of jl.
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public new double interp(double x)
{
return rawinterp(1, x);
}
}
}
2 代码格式
using System;
namespace Legalsoft.Truffer
{
/// <summary>
/// 重心有理插值对象
/// Barycentric rational interpolation object.
/// After constructing the object,
/// call interp for interpolated values.
/// Note that no error estimate dy is calculated.
/// </summary>
public class BaryRat_interp : Base_interp
{
private double[] w { get; set; }
private int d { get; set; }
/// <summary>
/// Constructor arguments are x and y vectors of length n,
/// and order d of desired approximation.
/// </summary>
/// <param name="xv"></param>
/// <param name="yv"></param>
/// <param name="dd"></param>
/// <exception cref="Exception"></exception>
public BaryRat_interp(double[] xv, double[] yv, int dd) : base(xv, yv[0], xv.Length)
{
this.w = new double[n];
this.d = dd;
if (n <= d)
{
throw new Exception("d too large for number of points in BaryRat_interp");
}
for (int k = 0; k < n; k++)
{
int imin = Math.Max(k - d, 0);
int imax = k >= n - d ? n - d - 1 : k;
double temp = (imin & 1) != 0 ? -1.0 : 1.0;
double sum = 0.0;
for (int i = imin; i <= imax; i++)
{
int jmax = Math.Min(i + d, n - 1);
double term = 1.0;
for (int j = i; j <= jmax; j++)
{
if (j == k)
{
continue;
}
term *= (xx[k] - xx[j]);
}
term = temp / term;
temp = -temp;
sum += term;
}
w[k] = sum;
}
}
/// <summary>
/// Use equation(3.4.9) to compute the
/// barycentric rational interpolant.
/// Note that jl is not used since
/// the approximation is global;
/// it is included only
/// for compatibility with Base_interp.
/// </summary>
/// <param name="jl"></param>
/// <param name="x"></param>
/// <returns></returns>
public override double rawinterp(int jl, double x)
{
double num = 0;
double den = 0;
for (int i = 0; i < n; i++)
{
double h = x - xx[i];
//if (h == 0.0)
if (Math.Abs(h) <= float.Epsilon)
{
return yy[i];
}
else
{
double temp = w[i] / h;
num += temp * yy[i];
den += temp;
}
}
return num / den;
}
/// <summary>
/// No need to invoke hunt or locate since
/// the interpolation is global, so
/// override interp to simply call rawinterp
/// directly with a dummy value of jl.
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public new double interp(double x)
{
return rawinterp(1, x);
}
}
}