在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。 许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。 如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。
在进行插值时,如果插入点位于已知数据点之间,可以使用7次拉格朗日插值多项式来进行计算。如果插值点位于给定区间的某个端点时,可以少取几个点进行插值。如果插值点位于给定区间以外,可以取最近的4个数据点进行插值。
代码实现:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Test();
}
private void Test()
{
//原始数据
double[] x = { 0.10, 0.15, 0.30, 0.40, 0.50, 0.60, 0.70, 0.85, 0.90, 1.00 };
double[] y = { 0.90, 0.86, 0.78, 0.67, 0.60, 0.55, 0.48, 0.42, 0.38, 0.36 };
//原始数据打印
richTextBox1.AppendText("原始数据\r\n");
for( int i = 0; i < x.Length;i++)
{
Loge(x[i], y[i]);
}
richTextBox1.AppendText("原始数据end\r\n");
//插值数据打印
richTextBox1.AppendText("插值计算\r\n");
for ( double t = x[0]; t <= x[x.Length - 1]; t=t+0.01d)
{
double zhi = Lagrange(x,y,x.Length,t);
Loge(t, zhi);
}
}
private void Loge(double x,double y)
{
richTextBox1.AppendText(x.ToString() + "\t" + y.ToString() + "\t\r\n");
}
/// <summary>
/// 拉格朗日插值算法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="n"></param>
/// <param name="t"></param>
/// <returns></returns>
double Lagrange(double[] x, double[] y,int n,double t)
{
int i, j, k, m;
double s;
double result;
result = 0.0d;
if( n < 1 ) //给定的点数小于1
{
return result;
}else if( n == 1 ) //给定的点数等于1
{
return y[0];
}else if( n == 2 ) //给定的点数等于2
{
result = (y[0] * (t - x[1]) - y[1] * (t - x[0])) / (x[0] - x[1]);
return result;
}
else//给定的点数大于2
{
i = 0; //以下时计算参数值
while ((x[i]<t)&&(i<n))
{
i++;
}
k = i-4 ;
if( k < 0 )
{
k = 0;
}
m = i + 3;
if( m > n-1 )
{
m = n-1;
}
for( i = k; i <= m; i++ )//循环处理
{
s = 1.0d;
for( j = k;j<= m; j++ )
{
if( j!=i)
{
s = s * (t - x[j]) / (x[i] - x[j]); //累职计算
}
}
result = result + s * y[i];
}
}
return result; //返回结果
}
}
}
测试结果如下:
详细数据
0.1 | 0.9 | 0.1 | 0.9 | |||
0.15 | 0.86 | 0.11 | 0.889222 | |||
0.3 | 0.78 | 0.12 | 0.880075 | |||
0.4 | 0.67 | 0.13 | 0.87231 | |||
0.5 | 0.6 | 0.14 | 0.865692 | |||
0.6 | 0.55 | 0.15 | 0.86 | |||
0.7 | 0.48 | 0.16 | 0.856329 | |||
0.85 | 0.42 | 0.17 | 0.853206 | |||
0.9 | 0.38 | 0.18 | 0.850339 | |||
1 | 0.36 | 0.19 | 0.847478 | |||
0.2 | 0.844413 | |||||
0.21 | 0.84097 | |||||
0.22 | 0.837012 | |||||
0.23 | 0.832434 | |||||
0.24 | 0.827161 | |||||
0.25 | 0.821146 | |||||
0.26 | 0.814368 | |||||
0.27 | 0.806831 | |||||
0.28 | 0.798559 | |||||
0.29 | 0.789595 | |||||
0.3 | 0.78 | |||||
0.31 | 0.769188 | |||||
0.32 | 0.758032 | |||||
0.33 | 0.746651 | |||||
0.34 | 0.735165 | |||||
0.35 | 0.72369 | |||||
0.36 | 0.712336 | |||||
0.37 | 0.701204 | |||||
0.38 | 0.690386 | |||||
0.39 | 0.679962 | |||||
0.4 | 0.67 | |||||
0.41 | 0.660768 | |||||
0.42 | 0.652067 | |||||
0.43 | 0.643905 | |||||
0.44 | 0.636278 | |||||
0.45 | 0.629166 | |||||
0.46 | 0.62254 | |||||
0.47 | 0.616362 | |||||
0.48 | 0.610584 | |||||
0.49 | 0.60515 | |||||
0.5 | 0.6 | |||||
0.51 | 0.595075 | |||||
0.52 | 0.590302 | |||||
0.53 | 0.585611 | |||||
0.54 | 0.580935 | |||||
0.55 | 0.576211 | |||||
0.56 | 0.571378 | |||||
0.57 | 0.566382 | |||||
0.58 | 0.561177 | |||||
0.59 | 0.555726 | |||||
0.6 | 0.55 | |||||
0.61 | 0.543127 | |||||
0.62 | 0.536009 | |||||
0.63 | 0.528721 | |||||
0.64 | 0.521345 | |||||
0.65 | 0.513966 | |||||
0.66 | 0.506675 | |||||
0.67 | 0.499557 | |||||
0.68 | 0.492692 | |||||
0.69 | 0.486153 | |||||
0.7 | 0.48 | |||||
0.71 | 0.475056 | |||||
0.72 | 0.470576 | |||||
0.73 | 0.466524 | |||||
0.74 | 0.462846 | |||||
0.75 | 0.45947 | |||||
0.76 | 0.456312 | |||||
0.77 | 0.453273 | |||||
0.78 | 0.450245 | |||||
0.79 | 0.447116 | |||||
0.8 | 0.443767 | |||||
0.81 | 0.440084 | |||||
0.82 | 0.435956 | |||||
0.83 | 0.431285 | |||||
0.84 | 0.425986 | |||||
0.85 | 0.42 | |||||
0.86 | 0.412762 | |||||
0.87 | 0.405029 | |||||
0.88 | 0.396898 | |||||
0.89 | 0.388498 | |||||
0.9 | 0.38 | |||||
0.91 | 0.372451 | |||||
0.92 | 0.365471 | |||||
0.93 | 0.359278 | |||||
0.94 | 0.354106 | |||||
0.95 | 0.350208 | |||||
0.96 | 0.347858 | |||||
0.97 | 0.347344 | |||||
0.98 | 0.348975 | |||||
0.99 | 0.353079 |
运行环境
资源连接
【免费】拉格朗日插值算法代码实现以及性能曲线资源-CSDN文库https://download.csdn.net/download/anlog/89330073
理解参考
(4 封私信 / 80 条消息) 如何直观地理解拉格朗日插值法? - 知乎 (zhihu.com)https://www.zhihu.com/question/58333118
特此记录
anlog
2024年5月20日