数值计算方法(三)——变步长梯形法与龙贝格算法
变步长梯形算法
提出背景:
复化求积公式虽然能提高精度,但需要给出步长,步长精度太大则精度低,步长太小则计算量大,难以找到一个合适的步长(划分成的小区间的个数)
算法描述:
1.对所有已存在的子区间进行二分化,区间数由n变为2n
2.利用区间数为n时的积分值Tn以及新增的节点(即原来各子区间的中点)递推出区间数为2n时的积分值T2n
3.利用两次计算结果的差来估计误差,直到满足精度
公式如下:
代码实现:
注意:
1.区间数是每次乘2,不是递增的
2.在递推的过程中,需要计算新增节点的函数和
/***@name Variable_step:利用变步长梯形公式求积*@param1 down:积分下限*@param2 upper:积分上限*@param3 limit_error:误差限
**/
void Variable_step(double down,double upper,double limit_error)
{Tn[0]=(function(down)+function(upper))/2;double h; //定义小区间的长度double n=0.5; //定义划分的区间数double S=0; //新增和//注意每次区间二分,不是自加for (int i=0;i<19;i++){//从前先后推 Tn[0]->Tn[1] 每次对区间进行二分n=n*2; //计算小区间的长度h=(upper-down)/n; S=0;//计算小区间内所有中点的函数和 for (int j=0;j<n;j++){S+=function(down+j*h+h/2);}//迭代到下一项Tn[i+1]=Tn[i]/2+(h/2)*S;//如果检测到误差小于限制,则直接输出if(abs(Tn[i+1]-Tn[i])/3<limit_error)break;}
}
龙贝格算法
提出背景:
梯形公式收敛阶为2阶(余项为h的2次),利用变步长梯形公式时收敛速度较慢,故提出了龙贝格算法加速收敛
算法描述:
1.对得到的梯形序列Tn(1次代数精度)的相邻两项进行线性组合,即可得到抛物序列Sn(3次代数精度)
2.对抛物序列Sn的相邻两项进行线性组合,可得到柯斯序列Cn(5次代数精度)
3.对柯斯序列Cn的相邻两项进行线性组合,可得到龙贝格序列(7次代数精度)
示意图:
公式:
m对应为加速收敛而做的线性组合次数。
代码实现:
注意:
1.integral_table[10][4]为龙贝格积分表,从第0列到第3列分别为Tn,Sn,Cn,Rn
2.Tn(integral_table[i][0])通过变步长梯形法求得
3.Sn,Cn,Rn由前一列的同行以及上一行的项进行线性组合得到
/***@name Romberg_arithmetic:利用龙贝格算法建立积分结果表*@param1 down:积分下限*@param2 upper:积分上限
**/
void Romberg_arithmetic(double down,double upper)
{double S=0;double n=0.5;double h=(upper-down);integral_table[0][0]=(function(down)+function(upper))*(h/2);//计算顺序 外循环由列开始迭代:1列 2列 3列(其中第0列由变步长梯形法求得)// 内循环行迭代//变步长梯形法求第0列 Tnfor (int i=0;i<10;i++){n=n*2;h=(upper-down)/n;S=0;for (int j=0;j<n;j++){S+=function(down+j*h+h/2);}integral_table[i+1][0]=integral_table[i][0]/2+S*(h/2);}//计算Sn Cn Rnfor (int i=1;i<4;i++){for(int j=i;j<10;j++){//利用龙贝格求积公式integral_table[j][i]=(pow(4.0,i)*integral_table[j][i-1]-integral_table[j-1][i-1])/(pow(4.0,i)-1);}}
}
输出结果:
数值计算方法(三)——变步长梯形法与龙贝格算法相关推荐
- 变步长梯形法与龙贝格算法
文章目录 1. 变步长梯形法 算法描述 流程图 代码实现 2. 龙贝格算法 算法描述 例子 代码实现 1. 变步长梯形法 提出背景: 复化求积公式虽然能提高精度,但需要给出步长,步长精度太大则精度低, ...
- c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现
数值作业:龙贝格算法计算积分C语言实现 数值作业:龙贝格算法计算积分C语言实现 根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为 ...
- matlab 龙贝格法,matlab龙贝格法
Tm 3.2.2 龙贝格算法计算步骤 1.输入 MATLAB 程序 functi... 3.2.2 龙贝格算法计算步骤 1.输入 MATLAB 程序 function[... 3.2.2 龙贝格算法计 ...
- 复化梯形公式求椭圆周长C语言,C语言编程解线性,非线性方程,龙贝格算法.docx
C语言编程解线性,非线性方程,龙贝格算法 课程设计课程名称:数值计算B 设计题目:数值计算B课程设计学号:姓名:完成时间: 2015年10月27日题目一:非线性方程求根一.题目假设人口随时间和当时人口 ...
- 数值计算笔记之数值积分(二)龙贝格算法
龙贝格求积公式也称为逐次分半加速法.它是在梯形公式.辛普森公式和柯特斯公式之间的关系的基础上,构造出一种加速计算积分的方法. 作为一种外推算法,它在不增加计算量的前提下提高了误差的精度. 在等距基点的 ...
- 龙贝格算法求解椭球周长
数值积分: 在实际应用中经常应用到计算方法去求解一些不易测量的零件的周长或面积.已知一个椭圆形边框如下图所示,试用龙贝格算法求解这个边框的周长,要求结果精确到6 位有效数字. 3.1 数学原理: 龙贝 ...
- 龙贝格算法在MATLAB的实现
一.实验内容 用龙贝格算法计算积分 二.程序清单与运行结果 M文件代码如下: function I=romberg(fun,a,b,e) % 使用龙贝格(Romberg数值求解公式) % 例如: % ...
- 利用Matlab编写龙贝格算法(romberg)求函数积分
这次是我初次接触matlab,源于数学老师布置的一个作业:用龙贝格算法来计算函数的积分. 具体的计算原理,由于是数学的东西,不好打印,就不写了.主要把自己的代码贴下来慢慢理解. 一共写了两个文件.一个 ...
- 【数值分析实验MATLAB】数值积分:梯形公式、辛普森公式、复化梯形公式、复化辛普森公式、龙贝格算法、自适应求积方法
(1)Matlab代码: f1: if x==0y=1; else%y=exp(-x^2);y=(sin(x))/x; end 梯形公式: a=0; b=1; tx=(b-a)/2*(f1(a)+f1 ...
最新文章
- 微信小程序界面跳转方法
- python背景颜色词云图_python中实现词云图
- 好图表的标准是什么?手把手教你用GLAD原则优化一张看板
- java图片透明化处理_java的图片背景透明及透明度处理
- 个人博客网页设计作业
- F - Endless Walk
- 中图分类法----Q 生物科学
- STM32学习笔记---触摸屏
- BinaryWriter
- 固态硬盘使用的优化——适用于任何版本的固态
- Python基础;个人名片制作程序
- 关于项目的可行性分析
- projspider.com恢复对猪八戒,一品威客网,软件项目交易网的支持
- 鼠标移入移出功能的具体实现代码
- 川师计算机科学学院,喜迎川师萌新——记计算机科学学院2020级新生入学
- 最好的智慧养老解决方案在哪里?智慧养老解决方案在这里-新导智能
- 解决dedecms权重排序问题
- 《论文》:注意力机制
- 我的“家用投影机无屏电视”初体验
- 快手主页服务跳转微信技术是什么
热门文章
- pytorch修改tensor的维度(修改为任意维度,或单纯的增减维度)
- oracle函数 授权,如何在Oracle中以普通用户身份运行dbms_crypto函数?
- python123测验4程序题_Python面试题245道(从基础到高级)123~141——网络编程,Web—Flask...
- 创建的函数带有编译错误。_AST实现函数错误的自动上报(原理到实践)
- java 小数如何转换成百分数_初等数学33-百分数
- 中小企业 DevOps 从 0 到 1
- 动态类型语言和静态类型语言
- 【Teradata SQL】禁用和启用数据库用户登录
- va_start、va_end、va_arg 实现可变长参数
- SQA计划和验收测试规程设计