把以前写的那个Delphi版本翻译成了C#语言。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 拉格朗日内插
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 拉格朗日内插
/// </summary>
/// <param name="fx">x序列</param>
/// <param name="fy">y序列</param>
/// <param name="xx">要插值的x序号</param>
/// <param name="n">阶数</param>
/// <returns></returns>
public double lagrange(double[] fx, double[] fy, double xx, int n)
{
double[] a = new double[n + 1];
double[] fx2 = new double[n + 1];
double[] fy2 = new double[n + 1];
int sum1 = 0;
int half_n = n / 2;
int len = fx.Length - 1;
//===================BEGIN=========取nn个数参与插值,使要求的数在其中间========
int st_n = Convert.ToInt32(Math.Truncate(xx - fx[0])) / (15 * 60); //时间处于第几个15分钟
if (st_n >= len) //超出所有
{
for (int j = len - n; j <= len; j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
}
else if (st_n <= 0) //低于所有
{
for (int j = 0; j <= n; j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
}
else if (len - st_n < half_n) //右边不够
{
for (int j = st_n; j <= len; j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
for (int j = len - n + 1; j <= st_n; j++)
{
fx2[sum1] = fx[j - 1];
fy2[sum1] = fy[j - 1];
sum1++;
}
}
else if (st_n < (n / 2)) //左边不够
{
for (int j = 0; j <= st_n; j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
for (int j = st_n + 1; j <= n; j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
}
else //两边都够
{
for (int j = (st_n - (n / 2)); j <= st_n; j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
for (int j = st_n + 1; j <= st_n + n - (n / 2); j++)
{
fx2[sum1] = fx[j];
fy2[sum1] = fy[j];
sum1++;
}
}
//========================END======取nn个数参与插值,使要求的数在其中间========
double yy = 0;
for (int i = 0; i <= n; i++)
{
a[i] = fy2[i];
for (int j = 0; j <= n; j++)
{
if (j != i)
{
a[i] = a[i] * (xx - fx2[j]) / (fx2[i] - fx2[j]);
}
}
yy = yy + a[i];
}
return yy;
}
//函数测试
private void button1_Click(object sender, EventArgs e)
{
int N = 4;
double[] fx = new double[5] { 0.4, 0.55, 0.8, 0.9, 1 };
double[] fy = new double[5] { 0.41075, 0.57815, 0.88811, 1.02652, 1.17520 };
double x = 0.5;
MessageBox.Show(lagrange(fx, fy, x, N).ToString());
}
}
}