2025年C函数之实现Lagrange插值算法

C函数之实现Lagrange插值算法博主最近想自己独立地完成一个精密单点定位的应用程序 先实现最简单的功能 那么基础工作就是要对 igs 最终的精密星历产品进行插值 以满足结算的要求 详细阐述请看前述文章 卫星位置插值方法简介 一 博主在看过原理后 便使用 C 进行了 Lagrange 函数的编写 话不多说先上代码 class interp public

大家好,我是讯享网,很高兴认识大家。

博主最近想自己独立地完成一个精密单点定位的应用程序,先实现最简单的功能,那么基础工作就是要对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; } } 

讯享网
讯享网 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.); ftx.Add(14069.); ftx.Add(14261.); ftx.Add(14209.); fty.Add(-22099.); fty.Add(-22252.); fty.Add(-22148.); fty.Add(-21086.); ftz.Add(-4728.); ftz.Add(-1842.); ftz.Add(1076.); ftz.Add(6805.); 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.).ToString(); textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.).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.); ftx.Add(14069.); ftx.Add(14261.); ftx.Add(14209.); ftx.Add(14041.); ftx.Add(13832.); fty.Add(-22099.); fty.Add(-22252.); fty.Add(-22148.); fty.Add(-21086.); fty.Add(-20109.); fty.Add(-18836.); ftz.Add(-4728.); ftz.Add(-1842.); ftz.Add(1076.); ftz.Add(6805.); ftz.Add(9514.); ftz.Add(12055.); 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.).ToString(); textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.).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.); ftx.Add(14069.); ftx.Add(14261.); ftx.Add(14209.); ftx.Add(14041.); ftx.Add(13832.); ftx.Add(13623.); fty.Add(-22099.); fty.Add(-22252.); fty.Add(-22148.); fty.Add(-21086.); fty.Add(-20109.); fty.Add(-18836.); fty.Add(-17283.); ftz.Add(-4728.); ftz.Add(-1842.); ftz.Add(1076.); ftz.Add(6805.); ftz.Add(9514.); ftz.Add(12055.); ftz.Add(14382.); 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.).ToString(); textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.).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.); ftx.Add(14069.); ftx.Add(14261.); ftx.Add(14209.); ftx.Add(14041.); ftx.Add(13832.); ftx.Add(13623.); ftx.Add(13451.); ftx.Add(13352.029724); fty.Add(-22099.); fty.Add(-22252.); fty.Add(-22148.); fty.Add(-21086.); fty.Add(-20109.); fty.Add(-18836.); fty.Add(-17283.); fty.Add(-15472.); fty.Add(-13435.); ftz.Add(-4728.); ftz.Add(-1842.); ftz.Add(1076.); ftz.Add(6805.); ftz.Add(9514.); ftz.Add(12055.); ftz.Add(14382.); ftz.Add(16454.); ftz.Add(18234.); 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.).ToString(); textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.).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.); ftx.Add(14069.); ftx.Add(14261.); ftx.Add(14209.); ftx.Add(14041.); ftx.Add(13832.); ftx.Add(13623.); ftx.Add(13451.); ftx.Add(13352.029724); ftx.Add(13352.); ftx.Add(13475.); ftx.Add(13734.); ftx.Add(14136.); fty.Add(-22099.); fty.Add(-22252.); fty.Add(-22148.); fty.Add(-21086.); fty.Add(-20109.); fty.Add(-18836.); fty.Add(-17283.); fty.Add(-15472.); fty.Add(-13435.); fty.Add(-11211.); fty.Add(-8844.); fty.Add(-6383.); fty.Add(-3881.); ftz.Add(-4728.); ftz.Add(-1842.); ftz.Add(1076.); ftz.Add(6805.); ftz.Add(9514.); ftz.Add(12055.); ftz.Add(14382.); ftz.Add(16454.); ftz.Add(18234.); ftz.Add(19690.); ftz.Add(20798.); ftz.Add(21537.); ftz.Add(21896.); 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.).ToString(); textBox5.Text = (Convert.ToDouble(textBox2.Text) + 21764.).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文件,敬请期待哦!
在这里插入图片描述

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

小讯
上一篇 2025-01-14 21:22
下一篇 2025-02-19 17:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/123652.html