简介

wikipedia: Neville's method

在数学上,Neville 算法是一种计算插值多项式方法,由数学家Eric Harold Neville提出。由给定的n+1个节点,存在一个唯一的幂次≤n的多项式存在,并且通过给定点。

算法

给定n+1个节点及其对应函数值 \((x_i, y_i)\),假设 \(P_{i,j}\) 表示 \(j-i\) 阶多项式,并且满足通过节点 \((x_k, y_k) \quad k =i, i+1, \cdots, j\)。\(P_{i,j}\) 满足以下迭代关系

\[\begin{eqnarray}
\begin{aligned}
& p_{i,i}(x) = y_i \cr
& P_{i,j}(x) = \frac{(x_j - x)p_{i,j-1}(x) + (x - x_i)p_{i+1,j}(x)}{x_j - x_i}, \quad 0\le i\le j \le n
\end{aligned}
\end{eqnarray}\]

以n=4的节点举例,其迭代过程为

\[\begin{eqnarray}
\begin{aligned}
& p_{1,1}(x) = y_1, \cr
& p_{2,2}(x) = y_2, p_{1,2}(x), \cr
& p_{3,3}(x) = y_3, p_{2,3}(x), p_{1,3}(x),\cr
& p_{4,4}(x) = y_4, p_{3,4}(x), p_{2,4}(x), p_{1,4}(x)\cr
\end{aligned}
\end{eqnarray}\]

代码

伪代码

  • 由于计算插值点为一向量,为避免过多层循环嵌套,将每个 \(P_{i,j}\) 都改写为向量形式,各元素分别储存多项式在插值点 \(x_0\) 处函数值。
  • 只有每次当一列 \(P_{i,j}\) 计算完后,才能利用迭代公式计算下一列 \(P_{i,j}\) 多项式,因此外层循环为计算每列 \(P_{i,j}\) 多项式。
  • 每列 \(P_{i,j}\) 个数是逐渐减少的,最开始有n个多项式,最终循环只有一个。

可将矩阵P[nRow,nCol]用于存储多项式 \(P_{i,j}(x)\)。其中每行为 \(P_{i,j}(x_k)\) 在 nCol 个插值点\(x_k\)处函数值。每次外层循环 \(P_{i,j}(x)\) 个数减少,此时从最后一行开始舍弃,每次只循环

for irow = 1: (nRow - icol) %

\(x_i\)与\(x_j\)分别用变量x1与x2代替。迭代公式可表示为

for icol = 1:nRow - 1
for irow = 1: (nRow - icol) %
x1 = nodes(irow); x2 = nodes(irow + icol);
P(irow, :) = ( (x2 - x0).*P(irow, :) + (x0 - x1 ).*P(irow+1, :) )./( x2 - x1 );
end% for
end% for

最终完整代码为

function evalPol = f1300000_Neville(x0, nodes, fnodes)
% Implement Neville's algorithm to evaluate interpolation polynomial at x0
% Input:
% x0 - the point where we want to evaluate the polynomial
% nodes - vector containing the interpolation nodes
% fnodes - vector containing the values of the function
% Output:
% evalPol - vector containing the value at x0 of the different
% the interpolating polynomials if iscolumn(x0)
x0 = x0'; % transfer to row vector
end if isrow(fnodes)
fnodes = fnodes';
end nCol = length(x0);
nRow = length(nodes); % P = zeros(nRow, nCol);
P = repmat(fnodes, 1, nCol); for icol = 1:nRow - 1
for irow = 1: (nRow - icol) %
x1 = nodes(irow); x2 = nodes(irow + icol);
P(irow, :) = ( (x2 - x0).*P(irow, :) + (x0 - x1 ).*P(irow+1, :) )./( x2 - x1 );
end% for
end% for evalPol = P(1,:);
end

Neville 插值方法的更多相关文章

  1. 数值分析之Neville's Algorithm

        Neville插值方法详解 牛顿的插值方法涉及两个步骤:计算系数,随后评估多项式. 如果插值运作良好使用相同的多项式在x的不同值处重复执行. 要是一点是内插,一种单步计算插值的方法,如Nevi ...

  2. vue 改变插值方法

    Vue默认的插值是双大括号{{}}.但有时我们会有需求更改这个插值的形式. delimiters:['${','}']  //必须要用一个数组来接收,用逗号隔开.

  3. 插值方法 - Newton向前向后等距插值

    通常我们在求插值节点的开头部分插值点附近函数值时,使用Newton前插公式:求插值节点的末尾部分插值点附近函数值时,使用Newton后插公式. 代码: 1 # -*- coding: utf-8 -* ...

  4. 插值方法 - Newton多项式(非等距节点)

    不多话.Nowton插值多项式(非等距节点)代码: 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Mar 25 15: ...

  5. 插值方法 - Lagrange插值多项式

    Lagrange插值多项式代码: 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Mar 25 15:43:42 202 ...

  6. C#与C++的发展历程第四 - C#6的新时代

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  7. 分段二次插值——用Python进行数值计算

    事实上在实际使用中,高次插值显然是很不适合的,高次插值将所有样点包涵进一个插值函数中,这是次幂高的原因.高次计算复杂,而且刚开始的一点误差会被方的很大.因此将整个区间分为若干个小区间,在每一个小区间进 ...

  8. Matlab插值函数

    x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ...

  9. 线性插值&双线性插值&三线性插值

    http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方 ...

随机推荐

  1. 2021北航敏捷软工Beta阶段评分与总结

    概述 Beta 阶段评分,按照之前的规则,主要组成部分为: 博客部分,基于 Beta 阶段博客的评分(每篇正规博客 10 分,每篇 Scrum5 分,评定方式类比往年) 评审部分,基于 Beta 阶段 ...

  2. [no code][scrum meeting] Alpha 4

    项目 内容 会议时间 2020-04-09 会议主题 OCR相关的技术展示与讨论 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).ca ...

  3. segyio库的使用

    最近在使用segyio库读取segy文件的时候默认读取总是出现问题,经过分析发现是我们通常所用的segy格式与本库的默认格式略有不同,修改参数就可以读取: 1) with segyio.open(fi ...

  4. 你知道怎么从jar包里获取一个文件的内容吗

    目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...

  5. 它说你的代码有 Bug「GitHub 热点速览 v.21.44」

    作者:HelloGitHub-小鱼干 本周热点上的榜单大多数提升工作效率的实用工具,像是一个 API 管理所有通知消息(包括推送.邮件-)的 notifire,再是高速解析 JSON 文件的 simd ...

  6. VCS常用仿真选项开关及步骤总结

    转自:https://blog.csdn.net/bcs_01/article/details/79803304 转自:https://blog.csdn.net/wonder_coole/artic ...

  7. Linux Ubuntu stty 使用

    stty(set tty)命令用于显示和修改当前注册的终端的属性. 该命令是一个用来改变并打印终端行设置的常用命令. stty -a #将所有选项设置的当前状态写到标准输出中 old_stty_set ...

  8. 最大连续数列和 牛客网 程序员面试金典 C++ Python

    最大连续数列和 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有正有负的整数数组,请找出总和最大的连续数列. 给定一个int数组A和数组大小n,请返回最大的连续数列的和.保证n的大小 ...

  9. linux 文件描述符和inode 的理解和区别

    inode 或i节点是指对文件的索引.如一个系统,所有文件是放在磁盘或flash上,就要编个目录来说明每个文件在什么地方,有什么属性,及大小等.就像书本的目录一样,便于查找和管理.这目录是操作系统需要 ...

  10. Docker 18.03导入导出

    docker中分容器和镜像,简单可以理解为容器是运行中的实例,镜像是运行实例所需的静态文件. 导入导出既可以对容器做操作,也可以对镜像做操作.区别在于镜像可以随时导出,容器必须要停止之后才可以导出,否 ...