随笔 - 833  文章 - 1  评论 - 106  阅读 - 200万

样条之拉格朗日Lagrange(一元全区间)插值函数[转]

样条之拉格朗日Lagrange(一元全区间)插值函数

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

关于插值与样条的介绍请看:http://www.cnblogs.com/WhyEngine/p/4020294.html

核心代码:

复制代码
复制代码
//////////////////////////////////////////////////////////////////////
// 一元全区间等距插值
//////////////////////////////////////////////////////////////////////
static float GetValueLagrange(const void* valuesPtr, int stride, int n, float t)
{ 
    int i,j,k,m;
    float z,s,xi,xj;
    float p,q;

    // 初值
    z = 0.0f;

    // 特例处理
    if (n < 1) 
    {
        return(z);
    }
    if (n == 1) 
    { 
        z = YfGetFloatValue(valuesPtr, stride, 0); 
        return(z);
    }
    if (n == 2)
    { 
        float y0 = YfGetFloatValue(valuesPtr, stride, 0); 
        float y1 = YfGetFloatValue(valuesPtr, stride, 1); 
        z = y0 + (y1 - y0)*t;
        return(z);
    }

    float xStep = 1.0f/(n - 1);

    // 开始插值
    if (t > 0.0f)
    { 
        p = t/xStep; 
        i = (int)p; 
        q = (float)i;

        if (p > q) 
        {
            i = i+1;
        }
    }
    else 
    {
        i = 0;
    }

    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.0; 
        xi = i*xStep;

        for (j = k; j <= m; j++)
        {
            if (j != i)
            { 
                xj = j*xStep;
                // 拉格朗日插值公式
                s = s*(t-xj)/(xi-xj);
            }
        }

        z = z + s*YfGetFloatValue(valuesPtr, stride, i); 
    }

    return(z);
}
复制代码
复制代码

这是神一样的代码,反正我这辈子估计是看不懂了。

切图:

 

相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip

posted on   3D入魔  阅读(481)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2016-07-21 SWIG 多语言接口变换 【转】
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示