牛顿法 代数插值 – 差商表的求法

下面的求插商的方法并不是好的求插商的方式,因为他的效率并不是很高,不论是从空间效率还是时间效率,但是下面主要探讨的是一种将塔形的数据转换成一位数组的方式。实际上求插商仅通过一个n个元素的一位数组就能解决,但本文强调的是一种思路,希望对大家有所借鉴。

牛顿插商公式:

f[xi,xj] =( f(xj) – f(xi) )/( xj – xi )

f[xi,xj,xk] = (f[xj,xk] – f[xi,xj])/(xk –

xi)

………………..

f[x0,x1,x2 … ,xn] = (f[x1,x2, … ,xn] – f[x0,x1, …

,xn-1])/(xn – x0)

转换成均插表(或称差商表)形式如下:

定义1:

f[xi,xi+1, … xj]

简记为 f(i,j)

其中i>= 0

&& i <= n

&& j>= 0

&& j<=n

&& i < j;

记f(xi)为f[xi,xi]

即f(i,i)

根据定义1可以推出:f[x0,x1] = f(0,1), f[x0,x1 … xn] = f(0,n)

…….

根据定义1:可以将插商表转换为如下形式。

根据上图,可以给出实际一维数组存储时的序列关系,如下图所示:

此时f(0,0)位置是数组下标0,f(1,1)是数组下标为1 …..

这样,我们从中找出相应的规律。

推论1:已知f(i,j),n为变量的数目,令k = j – i。当k不等于0时,f(i,j)在数组中的下标通过计算得:

Index = k*n – ((k-1)*k)/2 +i

当k等于0 时

Index = i。

推论1很容易证明(实际就是一个等差数列求和问题)这里证明略。

推论2:n为变量的数目,则一维数组的长度可以计算得((1+n)*n)/2

推论2可以通过等差数列求和得以证明。证明略。

推论3:各阶插商就是f(0,k) k=1,2 …. n.

推论3:根据插商的定义和定义1可以直接推出。

下面先给出一位数组的存储结构代码:

#pragma once

#include

#include

#include

//在开始的时候要指定变量的维数

template

_Dims>

class Turriform

{

enum{digits = _Dims};//记录变量的维数

public:

Turriform(void);

~Turriform(void);

//获取f(nleft,nright)处的元素值

T getItem(size_t nLeft, size_t nRight)const;

//设置f(nleft,nright)处的元素值为val

void setItem(size_t nLeft,size_t

nRight,const T &

val);

private:

//计算f(nleft,nright)的坐标值

size_t index(size_t nLeft, size_t nRight) const;

private:

std::vector datas;//计算时使用的一维数组

};

template

_Dims>

Turriform::Turriform(void)

{

T demo;

datas.assign(digits*(digits + 1)/2,demo);//初始化所有变量

}

template

_Dims>

size_t

Turriform::index(size_t

nLeft, size_t nRight) const

{

if(nLeft >

nRight)//确保左边的比右边的小

{

size_t tmp = nLeft;

nLeft = nRight;

nRight = nLeft;

}

//计算k值

size_t k = nRight - nLeft;

if(k == 0)//k = 0 的情况

return nLeft ;

//k != 0 的情况

return k*digits - ((k-1)*k)/2 +

nLeft;

}

template

_Dims>

Turriform::~Turriform(void)

{

}

template

_Dims>

T

Turriform::getItem(size_t

nLeft, size_t nRight)const

{

return

datas[index(nLeft,nRight)];

}

template

_Dims>

void Turriform::setItem(size_t

nLeft,size_t nRight,const T

& val)

{

datas[index(nLeft,nRight)] = val;

}

说明:template

_Dims>在开始的时候需要指定元素类型和维数大小,维数大小用于确定一维数组实际元素的个数。

#include

#include

#include

#include "Turriform.h"

using std::vector;

using std::cout;

void function(vector & x,

vector & fx,

vector &

ret)

{//放入一个测试的数据

x.reserve(5);

x.push_back(1);

x.push_back(2);

x.push_back(3);

x.push_back(4);

x.push_back(5);

fx.reserve(5);

fx.push_back(1);

fx.push_back(4);

fx.push_back(7);

fx.push_back(8);

fx.push_back(6);

ret.assign(x.size(),0);

}

template

_Dims>

void Interpolation(const vector & x,

const

vector &

fx,vector &

ret)

{//牛顿插商求解

double val = 0;

Turriform tf;

for(size_t i = 0 ; i

< fx.size() ; i++)//先将i- j = 0的情况放入插商表

{

tf.setItem(i,i,fx[i]);

}

size_t k;

size_t j;

for(size_t n = 1 ; n

< fx.size() ; ++n)//计算其他维中的元素

{

k = 0;

j = k+n;

for( ; j <

fx.size() ; ++j , ++k)

{

val = tf.getItem(k+1,j) -

tf.getItem(k,j-1);//插值公式

val /= x[j] - x[k];

tf.setItem(k,j,val);

}

}

for(k = 0 ; k <

x.size() ; ++k)//获取插值

{

ret[k] = tf.getItem(0,k);

}

}

int main()

{

vector x;

vector fx;

vector ret;

function(x, fx, ret);

Interpolation<5>(x, fx,

ret);//指定了维

std::copy(ret.begin(),ret.end(),

std::ostream_iterator(std::cout," "));//输出结果

std::cout<<:endl>

}

上面的代码并不能说明什么,而且比其他的实现方式代码量和复杂度可能更高些,但是,对于问题的分析过程是很重要的。实际在设计数据结构时,复杂的数据结构往往可以转换成一位数组来进行存储,并可以节省大量的储存空间。特别是这种类二叉树结构,希望大家遇到问题多思考。

matlab构造差商表,牛顿法 代数插值 – 差商表的求法相关推荐

  1. 实验Matlab数值运算,MATLAB数值实验一(数据的插值运算及其应用完整版

    <MATLAB数值实验一(数据的插值运算及其应用完整版>由会员分享,可在线阅读,更多相关<MATLAB数值实验一(数据的插值运算及其应用完整版(6页珍藏版)>请在人人文库网上搜 ...

  2. C++实现matlab中的interp1和interp2插值

    头文件 interpfun.h #ifndef INTERPFUN_H #define INTERPFUN_H #include"math.h" #include<stdio ...

  3. matlab 股,用MATLAB构造股票过程

    借助Matlab完全可以建立很多的分析模型,用MATLAB构造股票过程,最重要的两个基本函数就是wiener prcoess和股票过程. 构造布朗运动(Wiener_Prcoess),下面的MATLA ...

  4. matlab实现二分法、牛顿法与割线法

    matlab实现二分法.牛顿法与割线法求方程的解 准备工作 二分法 二分法的matlab代码 二分法运行结果 牛顿法 牛顿法的matlab代码 牛顿法结果 割线法 割线法的matlab代码 割线法结果 ...

  5. 线性表:2.线性表的顺序存储结构--顺序表及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为 线性表的顺序存储结构 . 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中, ...

  6. SKU表管理之保存SKU表数据

    保存SKU表数据 在保存数据之前我们需要先获取三级分类信息.SPU表的名称信息.当前SPU商品的规格选项信息加载到页面中 1.获取三级分类信息 接口分析 请求方式: GET /meiduo_admin ...

  7. 内存只有100G,要全表扫描一个200G大表,会不会把内存用完?

    主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了? 所以大表全表扫描,看起来应该没问题. ...

  8. 线性表(一)——顺序表

    线性表(一) 线性表(linear list),也称有序表(ordered list),是线性结构的典型代表.数据元素之间仅具有单一的前驱和后继关系. 一.线性表的逻辑结构 1.线性表的定义 线性表简 ...

  9. 对于个人(注册表)与团队(团队表)(两张表没有关联)的展示与可空判断

    对于个人(注册表)与团队(团队表)(两张表没有关联)的展示与可空判断 1,在Model中只有GroupId没有名称(GroupName),所以自己定义一个: /// <summary>// ...

最新文章

  1. 小论Java类变量的隐私泄露
  2. 计算机组成原理知识点概叙
  3. 100道Java基础面试题收集整理(附答案)
  4. 问题 | UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 29解决办法
  5. 【Linux】一步一步学Linux——gpasswd命令(90)
  6. URI和URLConnection类的区别
  7. 释放囚犯(洛谷-P1622)
  8. 超级vga显示卡_VGA视频采集卡常见故障分析
  9. android 豆瓣客户端 视频
  10. dfs序七个经典问题[转]
  11. 用Matlab求解高等数学中的问题(求极限,求导)
  12. 2021年2月程序员工资统计,平均15144元
  13. 美国心脏协会:六种心血管疾病的症状区别
  14. 个人电脑php漏洞怎么修复,PHP版 6.0 漏洞 要怎么修复
  15. 微信小程序重新发起请求加载页面
  16. java语言就业方向_Java的就业方向有哪些?
  17. linux命令 sh -s,shell脚本中 if 判断时候-s是什么意思?
  18. Python下数值型与字符型类别变量独热编码(One-hot Encoding)实现
  19. 【鲲鹏HCIA考试】随堂习题卷五
  20. luna lunatic

热门文章

  1. IAMP服务安装,论坛启动
  2. 罗克韦尔自动化通过收购ASEM加强控制和可视化产品组合
  3. 计算机学校迎新条幅,学校迎新条幅内容
  4. 字节跳动-数据分析-实习面经
  5. 串口和TCP互相转发工具
  6. 分析N沟道MOS管和P沟道MOS管在电路中的详细应用
  7. 如何参与到开源优测-积微速成计划任务
  8. matlab中的sjy定义,sjy(sjy是什么缩写)
  9. Ubuntu 18.04上搜狗输入法简繁体切换快捷键Ctrl+shift+f和AndroidSdtuio的全局搜索冲突
  10. python多线程详解 Python 垃圾回收机制