Neville 插值方法
简介
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{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{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 插值方法的更多相关文章
- 数值分析之Neville's Algorithm
Neville插值方法详解 牛顿的插值方法涉及两个步骤:计算系数,随后评估多项式. 如果插值运作良好使用相同的多项式在x的不同值处重复执行. 要是一点是内插,一种单步计算插值的方法,如Nevi ...
- vue 改变插值方法
Vue默认的插值是双大括号{{}}.但有时我们会有需求更改这个插值的形式. delimiters:['${','}'] //必须要用一个数组来接收,用逗号隔开.
- 插值方法 - Newton向前向后等距插值
通常我们在求插值节点的开头部分插值点附近函数值时,使用Newton前插公式:求插值节点的末尾部分插值点附近函数值时,使用Newton后插公式. 代码: 1 # -*- coding: utf-8 -* ...
- 插值方法 - Newton多项式(非等距节点)
不多话.Nowton插值多项式(非等距节点)代码: 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Mar 25 15: ...
- 插值方法 - Lagrange插值多项式
Lagrange插值多项式代码: 1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Mar 25 15:43:42 202 ...
- C#与C++的发展历程第四 - C#6的新时代
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 分段二次插值——用Python进行数值计算
事实上在实际使用中,高次插值显然是很不适合的,高次插值将所有样点包涵进一个插值函数中,这是次幂高的原因.高次计算复杂,而且刚开始的一点误差会被方的很大.因此将整个区间分为若干个小区间,在每一个小区间进 ...
- Matlab插值函数
x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ...
- 线性插值&双线性插值&三线性插值
http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方 ...
随机推荐
- TDengine在数益工联工业物联采集平台建设中的初步实践
作者:易永耀 夏杭泰 邓炜兴 公司介绍 数益工联致力于打造基于数据流+价值流的离散制造业数字化软件:应用新一代的物联网技术与丰富的现场交互手段,融合工业工程精益思想,为离散制造业客户的数字化升级提供从 ...
- Sharding-JDBC基本使用,整合Springboot实现分库分表,读写分离
结合上一篇docker部署的mysql主从, 本篇主要讲解SpringBoot项目结合Sharding-JDBC如何实现分库分表.读写分离. 一.Sharding-JDBC介绍 1.这里引用官网上的介 ...
- Linux 系统 Oracle 11g 修改监听端口
1.查看监听:lsnrctl status 2.停止监听:lsnrctl stop 3.修改oracle安装目录的下的配置文件listener.ora:一般路径为自己Oracle安装目录+/app/o ...
- Nginx(三):Linux环境(Ubuntu)下Nginx的安装
Nginx 是一位俄罗斯人 Igor Sysoev(伊戈尔·塞索斯夫)编写的一款高性能HTTP和反向代理服务器. Nginx 主要是有C编写的,安装Nginx需要GCC编译器(GNU Compiler ...
- Java I/O框架 - 总结概述
总结 以下需要重点掌握: 字节流,以下读取结束全部返回-1 字节节点流-访问文件 FileInputStream/FileOutputStream 可以读取任意文件 可以复制图片 读取字符String ...
- sql 多表联合查询更新
sqlserver: update A a set a.i = b.k from B b where a.key = b.key oracle : update A a set a.i = (sele ...
- 栈的压入、弹出顺序 牛客网 剑指Offer
栈的压入.弹出顺序 牛客网 剑指Offer 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是 ...
- hdu 4788 Hard Disk Drive (水题)
题意: Input The first line contains an integer T, which indicates the number of test cases. For each t ...
- Mac搭建以太坊私有链
记录过程与问题 一.安装 以go版本的ethereum进行安装 brew tap ethereum/ethereum brew install ethereum # 如果希望基于ethereum的de ...
- Ubuntu16.04安装apache hive
0.常规配置操作可参照以下网址: 0.1 Ubuntu安装hive,并配置mysql作为元数据库http://dblab.xmu.edu.cn/blog/install-hive/ ------以下为 ...