【C/C++】实现龙贝格算法

1. 复化梯形法公式以及递推化

复化梯形法是一种有效改善求积公式精度的方法。将[a,b]区间n等分,步长h = (b-a)/n,分点xk = a + kh。复化求积公式就是将这n等分的每一个小区间进行常规的梯形法求积,再将这n的小区间累加求和。 公式如下:

使用复化梯形法积分时,可以将此过程递推化,以更方便的使用计算机实现。设积分区间[a,b],将此区间n等分,则等分点共有n+1个,使用复化梯形积分求得Tn。进行二分,二分结果记为T2n,则有:

2. 龙贝格积分公式

龙贝格积分实际上是提高收敛速度的一种算法。由于复化梯形法步长减半后误差减少至 ,即有:

整理得:

根据此思路,将收敛缓慢的梯形值序列Tn加工成收敛迅速的龙贝格值序列Rn,这就是龙贝格算法,加工算法流程如下:

实现:

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<iostream>
 4 #include<cstdio>
 5 using namespace std;
 6 int Rk=0;
 7 int Tk=0;
 8 double fx(double x)   //被积函数
 9 {
10     //if(x==0.0)return 1.0;
11     return 3*x*x*x+2*x*x+1 + sin(x);
12 }
13 double getReal(double a,double b){
14     double r1 = 3.0/4.0 * b*b*b*b + 2.0/3.0*b*b*b + b - cos(b);
15     double r2 = 3.0/4.0 * a*a*a*a + 2.0/3.0*a*a*a + a - cos(a);
16     return r1 - r2;
17 }
18 double getS(double a,double b,double h)
19 {
20     double res=0.0;
21     for(double i=a+h/2.0; i<b; i+=h){
22         res+=fx(i);
23     }
24
25     return res;
26 }
27 double Romberg(double a,double b,double e)
28 {
29     int k=1;
30     double T1,T2,S1,S2,C1,C2,R1,R2;
31     double h=b-a;
32     double s;
33     T1=(fx(a)+fx(b))*h/2.0;
34     int counter=0;
35     while(1)
36     {
37         Rk++;
38         counter++;
39         s=getS(a,b,h);
40         T2=(T1+h*s)/2.0;
41         S2=(4.0*T2-T1)/3.0;
42         h/=2.0;
43         T1=T2;
44         S1=S2;
45         C1=C2;
46         R1=R2;
47         if(k==1)
48         {
49             k++;
50             continue;
51         }
52         C2=(16.0*S2-S1)/15.0;
53         if(k==2)
54         {
55             k++;
56             continue;
57         }
58         R2=(64.0*C2-C1)/63.0;
59         if(k==3)
60         {
61             k++;
62             continue;
63         }
64         if(fabs(R1-R2)<e||counter>=100)break;
65     }
66     return R2;
67 }
68 double Tn(double a,double b,double e)
69 {
70     double T1,T2;
71     double h=b-a;
72     T1=(fx(a)+fx(b))*h/2.0;
73     while(1)
74     {
75         Tk++;
76         double s=getS(a,b,h);
77         T2=(T1+h*s)/2.0;
78         if(fabs(T2-T1)<e)break;
79         h/=2.0;
80         T1=T2;
81     }
82     return T2;
83 }
84 int main()
85 {
86     double a,b,e;
87     printf("输入积分限和精度: a b e:");
88     //输入区间[a,b],和精度e
89     scanf("%lf%lf%lf",&a,&b,&e);
90     double t=Romberg(a,b,e);
91     //分别输出龙贝格算法和梯形法的计算结果和相应二分次数
92     printf("\nRomberg:积分值:%.7lf  --  二分次数:%d\n",t,Rk);
93     t=Tn(a,b,e);
94     printf("     Tn:积分值:%.7lf  --  二分次数:%d\n",t,Tk);
95     double tf = getReal(a,b);
96     printf("    Real:%.7lf",tf);
97     return 0;
98 }

原文地址:https://www.cnblogs.com/duye/p/9118957.html

时间: 2024-08-29 18:13:28

【C/C++】实现龙贝格算法的相关文章

龙贝格算法

求积分的龙贝格算法 计算f(x)=1/x在[1,3]上的积分: 1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 6 double f(double x){ 7 return 1.0/x; 8 } 9 10 int main(){ 11 double a,b;//积分区间的上界和下届 12 a=1; 13 b=3; 14 15 double t[1

龙贝格求积算法

龙贝格求积算法python实现 import numpy as np def trapezoid(a, b, n, func): """ 复化梯形公式求函数func在区间[a,b]上的积分值 n是等分的区间数目 """ x = np.linspace(a, b, num=n + 1) y = func(x) h = (b - a) / (2 * n) return h * (y[0] + 2 * np.sum(y[1:-1]) + y[-1])

数值计算实验报告---复合求积公式(梯形、抛物线、龙贝格)、导数求值(三点、四点、五点公式)

----------------------个人作业,如果有后辈的作业习题一致,可以参考学习,一起交流,请勿直接copy ··复合抛物线公式: ··龙贝格公式: 四.实验内容 ------1 实验题目1中所用到的三种算法的matlab实现代码具体如下: %复合梯形公式 function y=funct(f,n,a,b) fi=f(a)+f(b); h=(b-a)/n; d=1; for i=1:n-1 x=a+i*h; fi=fi+2*f(x); d=d+1; end f4=h/2*fi,d %

龙贝格公式计算定积分

1 #include<stdio.h> 2 #include<math.h> 3 #define maxlen 100 4 #define eps 0.5*1e-5 5 double a=0; 6 double b=1; 7 double f(double x){ 8 return 4/(1+x*x); 9 } 10 double t(int n){ 11 int i; 12 double sum, h = (b - a) / n; 13 for (i = 1; i < n;

C# “贝格尔”编排法

采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边:后一半的数自下而上写在右边,然后用横线把相对的号数连接起来.这即是第一轮的比赛. 第二轮将第一轮右上角的编号(“0”或最大的一个代号数)移到左角上,三轮又移到右角上,以此类推. 即单数轮次时“0”或最大的一个代号在右上角,双数轮次时则在左上角.如下表示: 7个队比赛的编排方法 第一轮    第二轮   第三轮   第四轮    第五轮   第六轮  

# 07 朴素叶贝斯算法

07 朴素叶贝斯算法 概率基础 概率: 一件事情发生的可能性 联合概率: 包含多个条件,且所有条件同时成立的概率.P(A,B) P(A, B) = P(A)P(B) 条件概率:事件A在另外一个事件B已经发生条件下发生的概率. P(A|B) P(A1,A2 | B) = P(A1 | B) * P(A2 | B) 注意: 此条件概率的成立,是由于A1, A2相互独立的结果 朴素贝叶斯 朴素: 特征独立,常用文档分类 在给定词比例的基础上,求各类型文档的比例 贝叶斯公式: (多个条件下一个结果) 公

计算方法(二)数值积分

在工程中,经常会遇到积分问题,这时原函数往往都是找不到的,因此就需要用计算方法的数值积分来求. public class Integral { /// <summary> /// 梯形公式 /// </summary> /// <param name="fun">被积函数</param> /// <param name="up">积分上限</param> /// <param name=&

实验三 数值积分(android)

实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 一.实验内容 分别写出变步长梯形法和romberge法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题. 试验中以下列数据验证程序的正确性. 求  (sinx)/x的积分,积

数值分析课程设计

数值分析学习心得: 插值法:拉格朗日插值,埃米特插值 函数逼近:最小二乘法 求积分的算法:牛顿-科斯特公式,龙贝格求积公式,高斯求积公式 求线性方程组的迭代法:jacobi迭代法,高斯-赛德尔迭代法 求非线性方程的算法:牛顿法 求常微分方程初值问题的算法:欧拉法,龙格-库塔法 数值分析课程设计  浙江大学 陈越 第1章 数值分析课程实践概要1.1 课程实践的意义1.2 实验的基本要求第2章 MATLAB简介2.1 MATLAB概述2.2 常用基本指令2.3 数值技术第3章 案例详解1:误差的影响