拉格朗日插值算法代码实现以及数据测试

在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。 许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。 如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。

在进行插值时,如果插入点位于已知数据点之间,可以使用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.10.90.10.9
0.150.860.110.889222
0.30.780.120.880075
0.40.670.130.87231
0.50.60.140.865692
0.60.550.150.86
0.70.480.160.856329
0.850.420.170.853206
0.90.380.180.850339
10.360.190.847478
0.20.844413
0.210.84097
0.220.837012
0.230.832434
0.240.827161
0.250.821146
0.260.814368
0.270.806831
0.280.798559
0.290.789595
0.30.78
0.310.769188
0.320.758032
0.330.746651
0.340.735165
0.350.72369
0.360.712336
0.370.701204
0.380.690386
0.390.679962
0.40.67
0.410.660768
0.420.652067
0.430.643905
0.440.636278
0.450.629166
0.460.62254
0.470.616362
0.480.610584
0.490.60515
0.50.6
0.510.595075
0.520.590302
0.530.585611
0.540.580935
0.550.576211
0.560.571378
0.570.566382
0.580.561177
0.590.555726
0.60.55
0.610.543127
0.620.536009
0.630.528721
0.640.521345
0.650.513966
0.660.506675
0.670.499557
0.680.492692
0.690.486153
0.70.48
0.710.475056
0.720.470576
0.730.466524
0.740.462846
0.750.45947
0.760.456312
0.770.453273
0.780.450245
0.790.447116
0.80.443767
0.810.440084
0.820.435956
0.830.431285
0.840.425986
0.850.42
0.860.412762
0.870.405029
0.880.396898
0.890.388498
0.90.38
0.910.372451
0.920.365471
0.930.359278
0.940.354106
0.950.350208
0.960.347858
0.970.347344
0.980.348975
0.990.353079

运行环境

资源连接

【免费】拉格朗日插值算法代码实现以及性能曲线资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/anlog/89330073

理解参考

(4 封私信 / 80 条消息) 如何直观地理解拉格朗日插值法? - 知乎 (zhihu.com)icon-default.png?t=N7T8https://www.zhihu.com/question/58333118

特此记录

anlog

2024年5月20日

  • 31
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值