zoukankan      html  css  js  c++  java
  • 拉格朗日插值法

    定义

    • 公式为:

      [l_k(x):= prod_{i=0, i eq k}^{j}{{x - x_i}over{x_k - x_i}} ]

    • 从上面的公式中我们可以了解到, i从0递增到j, 但是在k不会等于i, 因为如果k=i了, 则分母就成为了0, 这个式子就没有意义了, 在给定了k之后, 则i会从0开始递增到j的, 这个(l_k(x))就是一个拉格朗日插值函数

    • 每一个y值有一个特定的拉格朗日插值函数, 我们最终得到的一个多项式就是让每一个y乘以一个它特定的拉格朗日插值函数

    • 我们得到的最终的多项式, 如果为x取一个值, 则在我们获取到的拉格朗日插值多项式中是这样表现出来的 --> (L_(xj)sum_{i=0}^k y_il_i(x_j)= 0 + 0 + 0 + ... + y_j + 0 + 0), 其他的地方都是0, 之后我们需要的那个值的插值函数(l_j({x_i}))为1, 这就是它的实质

    优点

    • 当我们添加了一个新的样本点的时候, 我们不需要进行重新的计算

    插值法与拟合的差别

    • 拟合出来的曲线不一定要经过所有的我们给出的实际的样本点
    • 插值法求出来的多项式的曲线一定是经过了我们给他的样本点

    在matlab中实现一个拉格朗日插值求多项式

    
    function p = lagrange(x, y)
    % p = lagrange(x, y)
    % 其中x和y是向量,p是返回的多项式向量
    % m获取x的个数
    m = length(x);
    for k = 1:1:m
        % 表示一个插值函数的起始值
        V = 1; 
        for i = 1:1:m
           if k ~= i
                % 注意: 以后凡是在遇到一个在数学上是 x + 1 等包含着变量的表达式, 在matlab中同时使用多项式来表示, 也就是表示成 [1, 1], 当然这个是在只有一个变量的情况下]
                % x(k) - x(i), 为分母, 分子 conv(V, [1, x(i)])是一个多项式, 最后将得到的多项式赋给V, 这个就是我们在上面写到的拉格朗日的插值函数的使用累乘符号表达式在matlab中的表达而已
                V = conv(V, [1, x(i)])/ (x(k) - x(i));
           end
        end
        % 当k为k的时候得到的一组拉格朗日插值函数保存起来
        l(k, :) = V;
    end
    % 得出最终的多项式
    p = y * l;
    
  • 相关阅读:
    HDU-1115计算几何
    树形DP入门之HDU 1296
    拓扑排序-POJ1964
    其他一些数状数组的题
    HDU 2852(树状数组plus二分)
    POJ-2155二维树状数组
    HDOJ 1166 敌兵布阵 (线段树)
    codevs 1082 线段树练习3 (线段树)
    codevs 1081 线段树练习2 (线段树)
    codevs 1080 线段树练习(线段树)
  • 原文地址:https://www.cnblogs.com/megachen/p/9889653.html
Copyright © 2011-2022 走看看