C#函数之实现Lagrange插值算法

2024-02-03 03:30

本文主要是介绍C#函数之实现Lagrange插值算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

博主最近想自己独立地完成一个精密单点定位的应用程序,先实现最简单的功能,那么基础工作就是要对igs最终的精密星历产品进行插值,以满足结算的要求,详细阐述请看前述文章:卫星位置插值方法简介(一)

博主在看过原理后,便使用C#进行了Lagrange函数的编写,话不多说先上代码:

 class interp{public double lagrange(List<double> T, List<double> f,double t){double L = 0;//最后返回的多项式值double[] l = new double[T.Count];//定义的每一个多项式系数列表for (int i = 0; i < l.Length; i++){double l1 = 1;//多项式系数分子double l2 = 1;//多项式系数分母for (int j = 0; j < T.Count; j++){    if (i != j){l1 = l1 * (t - T[j]);l2 = l2 * (T[i] - T[j]);}else{continue;}}l[i] = l1 / l2;}for (int i = 0; i < l.Length; i++){L = L + l[i] * f[i];}return L;}}

首先我是先建立了一个插值函数的类,这里面封装之后会写到的所有的插值函数,包括Lagrange插值和Newton插值法,然后具体实现了Lagrange函数
那么写完之后该怎样调用呢?请先看如下代码:

 public int c;private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){if (comboBox1.Text == "三阶"){c = 1;}if (comboBox1.Text == "五阶"){c = 2;}if (comboBox1.Text == "六阶"){c = 3;}if (comboBox1.Text == "八阶"){c = 4;}if (comboBox1.Text == "十二阶"){c = 5;}}private void button1_Click(object sender, EventArgs e){interp interp = new interp();List<double> T = new List<double>();List<double> ftx = new List<double>();List<double> fty = new List<double>();List<double> ftz = new List<double>();if (c == 1){T.Add(0);T.Add(0.25);T.Add(0.5);T.Add(1);ftx.Add(13686.913694);ftx.Add(14069.247504);ftx.Add(14261.728751);ftx.Add(14209.784087);fty.Add(-22099.331881);fty.Add(-22252.702708);fty.Add(-22148.736352);fty.Add(-21086.622807);ftz.Add(-4728.984963);ftz.Add(-1842.522185);ftz.Add(1076.236929);ftz.Add(6805.670796);double satx = interp.lagrange(T, ftx, 0.75);double saty = interp.lagrange(T, fty, 0.75);double satz = interp.lagrange(T, ftz, 0.75);textBox1.Text = satx.ToString();textBox2.Text = saty.ToString();textBox3.Text = satz.ToString();textBox4.Text = (Convert.ToDouble(textBox1.Text) - 14296.367615).ToString();textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.787764).ToString();textBox6.Text = (Convert.ToDouble(textBox3.Text) - 3976.035651).ToString();}if (c == 2){T.Add(0);T.Add(0.25);T.Add(0.5);T.Add(1);T.Add(1.25);T.Add(1.5);ftx.Add(13686.913694);ftx.Add(14069.247504);ftx.Add(14261.728751);ftx.Add(14209.784087);ftx.Add(14041.598305);ftx.Add(13832.692938);fty.Add(-22099.331881);fty.Add(-22252.702708);fty.Add(-22148.736352);fty.Add(-21086.622807);fty.Add(-20109.159114);fty.Add(-18836.848057);ftz.Add(-4728.984963);ftz.Add(-1842.522185);ftz.Add(1076.236929);ftz.Add(6805.670796);ftz.Add(9514.965215);ftz.Add(12055.736360);double satx = interp.lagrange(T, ftx, 0.75);double saty = interp.lagrange(T, fty, 0.75);double satz = interp.lagrange(T, ftz, 0.75);textBox1.Text = satx.ToString();textBox2.Text = saty.ToString();textBox3.Text = satz.ToString();textBox4.Text = (Convert.ToDouble(textBox1.Text) - 14296.367615).ToString();textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.787764).ToString();textBox6.Text = (Convert.ToDouble(textBox3.Text) - 3976.035651).ToString();}if (c == 3){T.Add(0);T.Add(0.25);T.Add(0.5);T.Add(1);T.Add(1.25);T.Add(1.5);T.Add(1.75);ftx.Add(13686.913694);ftx.Add(14069.247504);ftx.Add(14261.728751);ftx.Add(14209.784087);ftx.Add(14041.598305);ftx.Add(13832.692938);ftx.Add(13623.421198);fty.Add(-22099.331881);fty.Add(-22252.702708);fty.Add(-22148.736352);fty.Add(-21086.622807);fty.Add(-20109.159114);fty.Add(-18836.848057);fty.Add(-17283.676462);ftz.Add(-4728.984963);ftz.Add(-1842.522185);ftz.Add(1076.236929);ftz.Add(6805.670796);ftz.Add(9514.965215);ftz.Add(12055.736360);ftz.Add(14382.736529);double satx = interp.lagrange(T, ftx, 0.75);double saty = interp.lagrange(T, fty, 0.75);double satz = interp.lagrange(T, ftz, 0.75);textBox1.Text = satx.ToString();textBox2.Text = saty.ToString();textBox3.Text = satz.ToString();textBox4.Text = (Convert.ToDouble(textBox1.Text) - 14296.367615).ToString();textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.787764).ToString();textBox6.Text = (Convert.ToDouble(textBox3.Text) - 3976.035651).ToString();}if (c == 4){T.Add(0);T.Add(0.25);T.Add(0.5);T.Add(1);T.Add(1.25);T.Add(1.5);T.Add(1.75);T.Add(2);T.Add(2.25);ftx.Add(13686.913694);ftx.Add(14069.247504);ftx.Add(14261.728751);ftx.Add(14209.784087);ftx.Add(14041.598305);ftx.Add(13832.692938);ftx.Add(13623.421198);ftx.Add(13451.837748);ftx.Add(13352.029724);fty.Add(-22099.331881);fty.Add(-22252.702708);fty.Add(-22148.736352);fty.Add(-21086.622807);fty.Add(-20109.159114);fty.Add(-18836.848057);fty.Add(-17283.676462);fty.Add(-15472.783785);fty.Add(-13435.708124);ftz.Add(-4728.984963);ftz.Add(-1842.522185);ftz.Add(1076.236929);ftz.Add(6805.670796);ftz.Add(9514.965215);ftz.Add(12055.736360);ftz.Add(14382.736529);ftz.Add(16454.540357);ftz.Add(18234.356133);double satx = interp.lagrange(T, ftx, 0.75);double saty = interp.lagrange(T, fty, 0.75);double satz = interp.lagrange(T, ftz, 0.75);textBox1.Text = satx.ToString();textBox2.Text = saty.ToString();textBox3.Text = satz.ToString();textBox4.Text = (Convert.ToDouble(textBox1.Text) - 14296.367615).ToString();textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.787764).ToString();textBox6.Text = (Convert.ToDouble(textBox3.Text) - 3976.035651).ToString();}if (c == 5){T.Add(0);T.Add(0.25);T.Add(0.5);T.Add(1);T.Add(1.25);T.Add(1.5);T.Add(1.75);T.Add(2);T.Add(2.25);T.Add(2.5);T.Add(2.75);T.Add(3);T.Add(3.25);ftx.Add(13686.913694);ftx.Add(14069.247504);ftx.Add(14261.728751);ftx.Add(14209.784087);ftx.Add(14041.598305);ftx.Add(13832.692938);ftx.Add(13623.421198);ftx.Add(13451.837748);ftx.Add(13352.029724);ftx.Add(13352.620967);ftx.Add(13475.514776);ftx.Add(13734.929294);ftx.Add(14136.765807);fty.Add(-22099.331881);fty.Add(-22252.702708);fty.Add(-22148.736352);fty.Add(-21086.622807);fty.Add(-20109.159114);fty.Add(-18836.848057);fty.Add(-17283.676462);fty.Add(-15472.783785);fty.Add(-13435.708124);fty.Add(-11211.291704);fty.Add(-8844.292298);fty.Add(-6383.760457);fty.Add(-3881.252747);ftz.Add(-4728.984963);ftz.Add(-1842.522185);ftz.Add(1076.236929);ftz.Add(6805.670796);ftz.Add(9514.965215);ftz.Add(12055.736360);ftz.Add(14382.736529);ftz.Add(16454.540357);ftz.Add(18234.356133);ftz.Add(19690.739661);ftz.Add(20798.192448);ftz.Add(21537.629852);ftz.Add(21896.709250);double satx = interp.lagrange(T, ftx, 0.75);double saty = interp.lagrange(T, fty, 0.75);double satz = interp.lagrange(T, ftz, 0.75);textBox1.Text = satx.ToString();textBox2.Text = saty.ToString();textBox3.Text = satz.ToString();textBox4.Text = (Convert.ToDouble(textBox1.Text) - 14296.367615).ToString();textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.787764).ToString();textBox6.Text = (Convert.ToDouble(textBox3.Text) - 3976.035651).ToString();}}

首先说明一下,本次编写只为完成基本功能,因此已知数值等信息是直接传入到列表中。
下面展示一下程序具体界面:
在这里插入图片描述三阶(x,y米级,z厘米级)

在这里插入图片描述五阶(x毫米级,y 厘米级,z亚毫米级)

在这里插入图片描述六阶(x毫米级,y 亚毫米级,z亚毫米级)
在这里插入图片描述八阶(x米级,y 米级,z米级)
在这里插入图片描述
十二阶(x米级,y 米级,z米级)
我们可以看到,插值精度并不会随着插值阶数的不断增加而不断提高,到达一定阶数后,精度反而会降低,产生龙格现象。

以上就是C#实现Lagrange插值算法的全部内容啦!

博主后面会将整个精密星历文件都进行Lagrange插值,并输出为.sp3文件,敬请期待哦!
在这里插入图片描述

感谢关注!感谢支持!一起学习,一起进步!文中若有疏漏之处,还请指正!

这篇关于C#函数之实现Lagrange插值算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672865

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用