数值分析:多项式插值

前言

插值不仅仅用在数值积分,更是有限元和谱元法的基础!在多种多样的插值方法中,首先推荐的是分段线性(拉格朗日)插值,在后文我们就会看到它的通用性和近似的精确性。在开始之间,要首先明确"插值与拟合"的区别:

  • 插值:寻找一个能反映函数f(x)特性,且形式简单、性质良好的函数\varphi(x) 来"近似"!必须满足的条件:必过一系列插值点。
  • 拟合:同样是为了"近似"原函数f(x),并反映其总体趋势。但是拟合没有强制必须过哪些点。

多项式插值原理

一句话总结:拉格朗日插值,就是用"一系列多项式相加"来近似原函数。即:

f(x) ≈ P_n(x) = a_0 + a_1x + a_2x^2 + \cdots + a_nx^n

上式中的P_n(x)就叫做"原函数的插值多项式",对应的方法就是"多项式插值法"!已经证明:插值多项式具有"存在性"和"唯一性",因此可以放心使用。各种不同的插值方法,只是实现的方式不同,但是原理都是求解那唯一的插值多项式。

拉格朗日插值

一阶拉格朗日插值:共2个插值节点,这2点间(都经过)用直线段代替;
二阶拉格朗日插值:共3个插值节点,这2点间(都经过)用二次函数代替;
n阶拉格朗日插值:共n+1个插值节点,这n+1点间(都经过)用n次函数代替。

规律:拉格朗日插值阶数 = 基函数个数 = 区间分段总数 = 总插值节点数 - 1

下面先给出一阶和二阶的公式:

拉格朗日插值 2点一阶(一次多项式) 3点二阶(二次多项式)
插值节点 (x_0,y_0)、(x_1,y_1) (x_0,y_0)、(x_1,y_1)、(x_2,y_2)
基函数 l_0(x)=\frac{x-x_1}{x_0-x_1} \quad l_1(x)=\frac{x-x_0}{x_1-x_0} l_0(x)=\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}
l_1(x)=\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)} \quad l_2(x)=\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}
插值函数 L_1(x) = y_0l_0(x) + y_1l_1(x) L_2(x) = y_0l_0(x) + y_1l_1(x) + y_2l_2(x)
说明 每2点间有2个基函数 每3点间有3个基函数

下面给出n阶的插值基函数公式:

l_0(x) = \frac{(x-x_1)(x-x_2)\cdots (x-x_n)}{(x_1-x_0)(x_1-x_2)\cdots (x_0-x_n)}
l_i(x) = \frac{(x-x_0)(x-x_1)\cdots (x-x_{i-1})(x-x_{i+1})\cdots (x-x_n)} {(x_i-x_0)(x_i-x_1)\cdots (x_i-x_{i-1})(x_i-x_{i+1})\cdots (x_i-x_n)} \quad (i=1,2,\cdots ,n-1)
l_0(x) = \frac{(x-x_1)(x-x_2)\cdots (x-x_{n-1})}{(x_n-x_0)(x_n-x_2)\cdots (x_n-x_{n-1})}
L_n(x) = \sum_{i=0}^{n}y_il_i(x)

但是,以上的这3种方法都不能用!一阶和二阶精度太低,n阶("满配"——有几个插值点就用几阶多项式去近似)会出现"过度拟合",也就是Runge现象(稍微复杂一点、有一些弯曲变换的函数在高阶近似都会出现):

图1:10阶拉格朗日插值普遍出现龙格现象

注意一点:龙格现象都大的误差/影响,在函数的两端!即图中函数两端的蓝圈。

拉格朗日插值节点的选取

一般情况下,插值节点都是区间的等分点;但事实上,插值节点的选取完全可以任意!可以不遵循任何分布的规律!一般情况下对区间的等分或等比划分,只是为了编程方便而已!本文采取的就是均分的情况。但是在有限元和谱元法中,一定不会再用均分了!!!

在强调一遍:拉格朗日的插值节点是可以任意分布的

分段线性拉格朗日插值

当插值点很多的时候,上面的方法都不能用!此时我们最好的工具就是"分段线性拉格朗日插值"!即:即使插值节点再多,每2个相邻插值点间用一阶拉格朗日插值,然后每一段加起来(分段函数表示也行)即可。这才是实际中会用到的。

下面给出分段线性插值的基函数公式:

l_0(x)=\begin{cases} \frac{x-x_1}{x_0-x_1} & x_0≤x≤x_1 \\ 0 & 其他 \end{cases}

l_i(x)=\begin{cases} \frac{x-x_{i-1}}{x_i - x_{i-1}} & x_{i-1}≤x≤x_{i} \\ \frac{x-x_{i+1}}{x_i - x_{i+1}} & x_{i}≤x≤x_{i+1} \quad\quad (i=1,2,\cdots, n-1)\\ 0 & 其他 \end{cases}

l_0(x)=\begin{cases} \frac{x-x_{n-1}}{x_n-x_{n-1}} & x_{n-1}≤x≤x_{n} \\ 0 & 其他 \end{cases}

L(x) = y_0l_0(x) + y_1l_1(x) + y_2l_2(x) + y_3l_3(x) + \cdots + y_nl_n(x)

基函数的图像为

图2:各个基函数图像(画到一起了)

我们发现:各个基函数(一阶/直线),它们的值域都是[0,1](这是一定的),并且斜率一样(这不一定,这里因为区间是等分的,所以各基函数的分母都是一样的)。这一堆看似平凡,并且值域和原函数的值域相差甚远的一群线性基函数,怎么会拼凑在一起就能近似原函数呢?
因为:每一个基函数前面都会乘以一个y_i,这个必过的插值点的y值与对应的基函数合作,就可以把基函数的值给拉起来!拉到和原函数一样的高度。

注意:l_i(x)中比如l_2(x),同样的标志l_2(x)是有2个不同的表达式的!!!即:
l_2(x) = \frac{x-x_1}{x_2 - x_1} \quad\quad x_1≤x≤x_2

l_2(x) = \frac{x-x_3}{x_2 - x_3} \quad\quad x_2≤x≤x_3

根据公式可能不太好理解,只需记住其内涵——每2个相邻插值点间用一阶拉格朗日插值即可。
实际操作,我们一般用分段函数表示。

下面给出matlab实现分段线性拉格朗日插值:

clear; clc;

xnum = [1 2 2.3 5.1 6.2 6.8 8 8.4 9.1];  
ynum = sqrt(xnum);  % 针对的sqrt(x)的函数,其他函数都同理

n = length(xnum);
syms x L;
L_tmp = sym(zeros(1,n-1));

% 每一段(两个相邻点)拉格朗日插值直线:
for m = 1:n-1
    l0 = (x-xnum(m+1))/(xnum(m)-xnum(m+1));
    l1 = (x-xnum(m))/(xnum(m+1)-xnum(m));
    L_tmp(m) = ynum(m)*l0 + ynum(m+1)*l1;
end

% 分段函数做图没有问题:就是一段一段画而已
figure(1);
for m = 1:n-1
    x = [xnum(m),xnum(m+1)];
    y = double(subs(L_tmp(m)));
    plot(x,y);
    hold on;
end
grid on;

% 原始函数图像(画到一起)
x1 = xnum(1):0.1:xnum(n);
y1 = sqrt(x1);
plot(x1,y1,'--k');
title('分段线性近似y=sqrt(x)函数');
xlabel('x');  ylabel('y');

效果如下:

图3:分段线性拉格朗日插值近似效果图

其他插值方法

牛顿插值、埃尔米特插值(需要求一阶导数)、三次样条插值等。我们最常用的,以及后面数值积分的各种方法,都是基于分段线性拉格朗日插值的!

所有插值方法的核心思路:用一个简单的多项式去替代原函数!要想提高插值函数近似的精度,只要增加插值节点。

所有插值方法的重要细节:插值点完全可以是随意分布的!从未要求一定是区间的等分或等比点。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 何谓数值分析? 众所周知现实生活中科学技术上面的问题大多数都能够通过建立对应的数学模型把实际问题转化成一个数学问题...
    罗泽坤阅读 8,769评论 0 14
  • 1. 拉格朗日多项式插值 了解概念 插值多项式插值节点范德蒙特(Vandermonde)行列式截断误差、插值余项...
    野狗子嗷嗷嗷阅读 2,538评论 0 3
  • 最近一段时间在复习数值计算相关内容,也恰逢简书断更了,不用每天督促着自己非要更出点什么东西才好,有更多的空间来打磨...
    抄书侠阅读 1,236评论 0 6
  • 1. 拉格朗日多项式插值 了解概念 插值多项式插值节点范德蒙特(Vandermonde)行列式截断误差、插值余项...
    野狗子嗷嗷嗷阅读 2,683评论 0 9
  • 最近和同学,朋友聚餐,聚会或者出去游玩的时候,总是会有某个同学或者朋友拿出手机翻看朋友圈时,指着其中一条消息,无比...
    望山云雾阅读 1,648评论 1 3