积分(二)——复化Simpson(C++)

前言

前言

simpson积分

simpson积分公式
∫ a b f ( x ) d x ≈ b − a 6 [ f ( a ) + f ( b ) + 4 f ( a + b 2 ) ] \int_{a}^{b}f(x)dx \approx \frac{b-a}{6}[f(a)+f(b)+4f(\frac{a+b}{2})] abf(x)dx6ba[f(a)+f(b)+4f(2a+b)]
与梯形积分类似,当区间[a,b]较大时,积分与实际相差较大。

复化simpson积分

假设区间[a,b]被划分为n个小区间,则有区间间隔为 h = b − a n , x k = a + k h ( k = 0 , ⋯ , n ) h=\frac{b-a}{n},x_k=a+kh(k=0,\cdots,n) h=nba,xk=a+kh(k=0,,n),对于每一个小区间都有:
∫ x k x k + 1 f ( x ) d x ≈ h 6 [ f ( x k ) + f ( x k + 1 ) + 4 f ( x k + 1 2 ) ] \int _{x_k}^{x_{k+1}}f(x)dx \approx \frac{h}{6}[f(x_k)+f(x_{k+1})+4f(x_{k+\frac{1}{2}})] xkxk+1f(x)dx6h[f(xk)+f(xk+1)+4f(xk+21)]
在[a,b]区间内进行累加可以得到
∫ a b f ( x ) d x ≈ h 6 [ f ( a ) + f ( b ) + 2 ∑ k = 0 n − 1 f ( x k + 1 ) + 4 ∑ k = 0 n − 1 f ( x k + 1 2 ) ] = S n \int _{a}^{b}f(x)dx \approx \frac{h}{6}[f(a)+f(b)+2\sum_{k=0}^{n-1}f(x_{k+1})+4\sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})]=S_n abf(x)dx6h[f(a)+f(b)+2k=0n1f(xk+1)+4k=0n1f(xk+21)]=Sn

误差分析

复化simpson积分的余项为: R [ f ] = − b − a 180 ( h 2 ) 4 f ( 4 ) ( ξ ) = − ( b − a ) 5 2880 n 4 f ( 4 ) ( ξ ) R[f]=-\frac{b-a}{180}(\frac{h}{2})^4f^{(4)}(\xi)\\ =-\frac{(b-a)^5}{2880n^4}f^{(4)}(\xi) R[f]=180ba(2h)4f(4)(ξ)=2880n4(ba)5f(4)(ξ)
与梯形积分相似,对其加密一倍n,可以得到对应的事后误差估计公式:
S 2 n ( f ) − s n ( f ) < 15 ϵ S_{2n}(f)-s_n(f)< 15\epsilon S2n(f)sn(f)<15ϵ
可以等价于:
I ( f ) − S 2 n ( f ) < ϵ I(f)-S_{2n}(f)< \epsilon I(f)S2n(f)<ϵ

代码

#include<iostream>
#include<cmath>
#include<iomanip>//这个头文件仅仅是用来设置cout的输出精度
#define abs(x) (x>0?x:-x)
using namespace std;
double Simpson(int n,double a,double b,float(*f)(float x))
{double f_x=0.0f;double h=(b-a)/n;for(int i=0;i<n;i++){f_x+=4*f(a+i*h+h/2);//算f(x_(k+1/2))}for(int i=1;i<n;i++){f_x+=2*f(a+i*h);//算f(x_(k+1))}f_x+=f(a)+f(b);f_x=f_x*h/6;return f_x;
}
//直接在这里换函数,函数为sin(x)/x
float fx(float x)
{float result;float x_temp=((x==0)?1e-15:x);result=sin(x_temp)/x_temp;return result;
}
int main()
{double error=1e-6;//表示误差小于10^-6次方double a = 0.0, b = 2.0;int n=1;double f_x_n=(fx(a)+fx(b))*(b-a)/2;double f_x_2n;while(true){f_x_2n=Simpson(n*2,a,b,fx);//算T2nif(fabs(f_x_n-f_x_2n)<(error*15)){// cout<<n<<":simposon error="<<fabs(f_x_n-f_x_2n)<<endl;// printf("%.8f,%.8f\n",f_x_n,f_x_2n);cout << "Simpson积分的误差为:" << fabs(f_x_n - f_x_2n) << endl;n*=2;break;}n+=1;f_x_n=Simpson(n,a,b,fx);}cout<<"区间划分数量:n="<<n<<",积分值为:"<<std::setprecision(10)<<f_x_2n<<endl;return 0;
}

结果分析

与梯形积分相比,在相同的被积函数和积分区间上,为了达到一样的误差范围,其迭代次数更少:
在这里插入图片描述

使用matlab进行对比可以得到:
在这里插入图片描述
可以看出其实际误差已经达到了期望。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471587.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型学习笔记之五:监督学习--数据如何驱动决策

监督学习&#xff0c;又称为监督式机器学习&#xff0c;是机器学习和人工智能领域的一个重要分支。 其基本原理是利用带有标签的数据集来训练算法&#xff0c;以实现精确分类数据或预测结果的目标。 在监督学习中&#xff0c;通过将数据输入模型&#xff0c;并不断调整数据权…

【知识整理】产研中心岗位评定标准之大数据岗位

为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准; 一、定级定档目的 通过对公司现有岗位及相应岗位员工的工作能力、工作水平进行客观公正评定,确定各岗位的等级及同等级岗位员工对应的档级,从而为员工以后的晋升…

CSS篇--transform

CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离&#xff0c;垂直移动距离) translate() 如果只给一个值&#xff0c;表示x轴方法移动距离 单独设置某个方向的移动距离&#xff1a;translateX() transla…

bpmn-js 事件总线处理

bpmn-js中使用EventBus作为事件的处理句柄&#xff0c;EventBus的使用和我们常规使用的事件总线没啥大的区别&#xff0c;其源码位于&#xff1a;/diagram-js/lib/core/EventBus.js &#xff08;bpmn-js使用diagram-js实现流程图的web端绘制呈现工具&#xff09;。 EventBus使用…

我的NPI项目之Android USB 系列(一) - USB的发展历史

设计目的 USB was designed to standardize the connection of peripherals to personal computers, both to exchange data and to supply electric power. 一个是为了标准化电脑连接外设的方法。 能够支持电脑和外设的数据交互和&#xff08;对外&#xff09;供电。 目前已…

fgets的使用方法详解

fgets的使用 文章目录 fgets的使用前言&#xff08;吹水&#xff0c;不看也罢&#xff09;fgets 的基本语法使用示例fgets() 对输入的处理的特点gets() 与 fgets() 的主要区别 总结 前言&#xff08;吹水&#xff0c;不看也罢&#xff09; 鼠鼠今天在B站上大学的时候&#xff…

洛谷_P1116 车厢重组_python写法

这道题看起来很高级其实就是冒泡排序执行的次数。 那对于python而言的话&#xff0c;这道题最大的难点在于如何实现数据输入既可以是以空格隔开的数据又可以是换行隔开的数据&#xff0c;那代码里面有了十分详细的解释。 n int(input()) l [] while len(l) < n: # 如果没…

Mysql——update更新数据的方式

注&#xff1a;文章参考&#xff1a; MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客文章浏览阅读2w次&#xff0c;点赞20次&#xff0c;收藏70次。一般在更新时会遇到以下场景&#xff1a;1.全部更新&#xff1b;2.根据条件更新字段中的某部分…

【C语言】Linux 内核listen系统调用代码

一、Linux 4.19内核listen系统调用代码注释 /** 开始对一个 socket 进行监听。这个函数做一些准备工作以便 socket 可以开始监听&#xff0c;* 如果操作成功&#xff0c;则将 socket 标记为准备好监听的状态。*/int __sys_listen(int fd, int backlog) {struct socket *sock…

实现MainActivity转到其他界面的功能实现

#安卓 实现MainActivity转到其他界面的功能实现 实现步骤&#xff1a; 1.添加两个界面及&#xff1b;layout&#xff0c;分别为fullsreen和dialog 2.mainifest中注册两个antivity 3.向Mainactivity中代码。用intent简单的跳转 package com.example.myapplication;import an…

【HarmonyOS】鸿蒙开发之渲染控制——第2.3章

if/eles条件渲染 if的使用方法与javascript&#xff0c;java中使用的if/eles条件渲染使用基本一致。 案例: Entry Component struct IfElseDemo{State isShow:boolean false;build(){Column() {TitleBar({titleBarAttribute: {title: "ifElse使用案例",backShow:…

安卓自定义画板

包含功能&#xff1a; 包含 获取当前画板的截图、设置画笔样式、获取画笔样式、设置画笔宽度、获取画笔宽度、设置画笔颜色、获取画笔颜色、加载图片、获取图片位图对象、设置图片位图对象&#xff0c;并在画布上绘制图片、撤销上一步操作、重做上一步撤销的操作、清空所有绘图…