zoukankan      html  css  js  c++  java
  • 样条之拉格朗日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

  • 相关阅读:
    [TJOI2013]单词 AC 自动机
    NOIP 2017 逛公园 记忆化搜索 最短路 好题
    [BJWC2012]冻结 分层图最短路
    dijkstra STL 堆优化
    [POI2002][HAOI2007]反素数 数论 搜索 好题
    bzoj 2456: mode 思维题 好题
    [SDOI2012]Longge的问题 欧拉反演_欧拉函数
    [JLOI2011]飞行路线 分层图最短路
    页面加速优化
    制作html5微信页面的经验总结。
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/4020401.html
Copyright © 2011-2022 走看看