当前位置:首页 » 操作系统 » 辛普森算法

辛普森算法

发布时间: 2022-08-06 04:52:15

⑴ 梯形法则和辛普森法则求面积的三个不同点

咨询记录 · 回答于2021-12-07

⑵ 辛普森法则 是什么内容

目的:
(1)通过求定积分的程序设计,使学生理解和掌握C++语言的函数、函数指针等设计方法,培养学生综合利用C++语言解决数学计算问题,使学生将所学知识转化为分析和设计简单实际问题的能力,并学会查资料和工具书,进行创新设计。
(2)提高学生建立程序文档、归纳总结的能力。
(3)进一步巩固和灵活运用先修课程《计算机文化基础》有关文字处理、图表分析、数据归整、应用软件之间图表、数据共享等信息技术处理的综合能力。
2. 基本要求:
(1)要求用模块化设计和C++的思想来完成程序的设计;
(2)要求用函数分别编写梯形法和辛普生法求定积分的程序,分别存到不同的.CPP文件中;
(3)在VC++6.0环境中,学会调试程序的方法,及时查究错误,独立调试完成。
(4)程序调试通过后,完成程序文档的整理,加必要的注释。
三、设计方法和基本原理
1. 课题功能描述
本题目的功能是对梯形法和辛普森法,在不同区间数下计算所得的定积分的值,进行精度比较。
2. 问题详细描述
(1)数值积分
求一个函数f(x)在[a,b]上的定积分∫baf(x) dx,其几何意义是求f(x)曲线和直线x=a,y=0,x=b所围成的曲边梯形面积。为了近似求出此面积,可将[a,b]区间分成若各个小区间,每个区间的宽度为(b-a)/n,n为区间个数。近似求出每个小的曲边梯形面积,然后将n个小面积加起来,就近似的到总的面积。既定积分的近似值,当n愈大(即区间分的愈小),近似程度愈高。数值积分常用的算法有:
1)梯形法
用小梯形代替小曲边梯形,几何意义如图所示。
第一个小梯形的面积为:

第i个小梯形的面积为:

其中:
2) 辛普生(Sinpson)法
在小区间范围内,用一条抛物线代替该区间的f(x)。将(a,b)区间分成2n个小区间,则辛普生法求定积分的公式为:
其中:
(2)要求分别采用梯形法和辛普生法分别计算f1(x)和 f2(x)的定积分。

2、问题的解决方案:
(1) 编写一个梯形法求定积分的通用函数integralt(),其函数原型为:
double integralt(double a, double b, double(*f)( double));
函数的形参a,b,f分别为定积分的下限、上限和函数名 ,其中f为函数指针。
(2) 编写一个辛普生法求定积分的通用函数integrals(),其函数原型为:
double integrals(double a, double b, double(*f)( double));
函数的形参a,b,f分别为定积分的下限、上限和函数名 ,其中f为函数指针。
(3) 对所求的被积分表达式分别编写函数f1和f2:
f1(x)=1+x2
f2(x)=1+x+x2+x3
(4) 在主函数中输入a,b(0,1)的值,先调用梯形法求积分的integralt()函数,分别计算f1和f2的定积分,并输出计算结果。再输入a,b(0,1)的值,调用辛普生法求积分的integrals()函数,分别计算f1和f2的定积分,并输出计算结果。再次输入a,b(0,2)的值,再分别调用梯形法和辛普生法分别计算f1和f2的定积分,并输出计算结果。
(5) 要求在n相同的情况下,对同一个被积函数同区间采用梯形法和辛普生法的积分结果的精度进行分析,主要观察随着n值的增加,积分结果的有效数字位数有何变化,两种方法与精确值的误差。
要求n值,分别取2,10,100,1000,5000,20000,50000进行观察。
四、主要技术问题的描述:
1、函数指针
一个函数在编译时被分配一个入口地址,可以将该地址赋给一个指针变量,这样,这个指针变量持有函数的入口地址,它就指向了该函数,称这种指针为指向函数的指针,简称函数指针。
2、函数指针定义的一般形式:
数据类型 (*指针变量)(形式参数);
例:int (*pf)(int a,int b);
3、调用的形式举例:
double integral (double a,double b,int n,double(*f)(double ))
{

ff1=(*f)(a);

ff2=(*f)(x);


}
double f1(double x)
{
double y1;
y1=1+x*x;
return y1;
}
void main ()
{ 。。。
cin>>a>>b>>n;
intesum1=integral(a,b,n,f1);

⑶ C语言小菜鸟求大神编程辛普森法和随机掷点法

一般有两种算法:
算法一产生12个(0,1)平均分布的随机函数,用大数定理可以模拟出正态分布。
算法二用到了数学中的雅可比变换,直接生成正态分布,但此算法在计算很大规模的数时
会出现溢出错误。
测试程序:
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
double _random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00)/32767.00;
return r;
}
double _sta(double mu,double sigma)
{
int i;
double r,sum=0.0;
if(sigma<=0.0) { printf("Sigma<=0.0 in _sta!"); exit(1); }
for(i=1;i<=12;i++)
sum = sum + _random();
r=(sum-6.00)*sigma+mu;
return r;
}
double _sta2(double mu,double sigma)
{
double r1,r2;
r1=_random();
r2=_random();
return sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu ;
}
int main()
{
int i;
double mu,sigma;
srand( (unsigned)time( NULL ) );
mu=0.0;
sigma=1.0;
printf("Algorithm 1:
");
for(i=0;i<10;i++)
printf("%lf ",_sta(mu,sigma));
printf("Algorithm 2:
");
for(i=0;i<10;i++)
printf("%lf ",_sta2(mu,sigma));
return 0;
}
//由均匀分布的随机数得到正态分布的随机数
#include <math.h>
float gasdev(im)
int *im;
{
static int iset=0;
static float gset;
float fac,r,v1,v2;
float ran1();//产生均匀分布的随机数,可利用系统函数改写
if (iset == 0) {
do {
v1=2.0*ran1(im)-1.0;
v2=2.0*ran1(im)-1.0;
r=v1*v1+v2*v2;
} while (r >= 1.0);
fac=sqrt(-2.0*log(r)/r);
gset=v1*fac;
iset=1;
return v2*fac;
} else {
iset=0;
return gset;
}
}
原理可找本数值算法方面的书看看。

⑷ 复合辛普森公式求积分

代码如下,但是似乎你的题目有问题:
根号X乘lnX 0到1,根号0乘ln0等于0,根号1乘ln1等于1,怎么求?
#include
#include
#include
double fsimpf(double x) /*要进行计算的被积函数*/
{
\x05double y;
y=log(x)*sqrt(x);
return(y);
}
double fsimp(double a,double b,double eps,int n) /*辛普森算法:a为积分下限,b为积分上限,eps是希望达到的精度*/
{
int k;
double h,t1,t2,s1,s2,ep,p,x;
h=(float)(b-a)/n;
t1=h*(fsimpf(a)+fsimpf(b))/2.0; /*用梯形公式求出一个大概的估值*/
s1=t1;
ep=eps+1.0;
while (ep>=eps)
\x05{
\x05\x05/*用梯形法则计算*/
\x05\x05p=0.0;
\x05\x05for (k=0;k

⑸ 分别用n=8,16,32的复合梯形和复合辛普森公式计算 根号X乘lnX 0到1的积分

代码如下,但是似乎你的题目有问题:
根号X乘lnX 0到1,根号0乘ln0等于0,根号1乘ln1等于1,怎么求?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double fsimpf(double x) /*要进行计算的被积函数*/
{
double y;
y=log(x)*sqrt(x);
return(y);
}

double fsimp(double a,double b,double eps,int n) /*辛普森算法: a为积分下限,b为积分上限,eps是希望达到的精度*/
{
int k;
double h,t1,t2,s1,s2,ep,p,x;
h=(float)(b-a)/n;
t1=h*(fsimpf(a)+fsimpf(b))/2.0; /*用梯形公式求出一个大概的估值*/
s1=t1;
ep=eps+1.0;
while (ep>=eps)
{
/*用梯形法则计算*/
p=0.0;
for (k=0;k<=n-1;k++)
{
x=a+(k+0.5)*h;
p=p+fsimpf(x);
}
t2=(t1+h*p)/2.0;
/*用辛普森公式求精*/
s2=(4.0*t2-t1)/3.0;
ep=fabs(s2-s1);
t1=t2; s1=s2; n=n+n; h=h/2.0;
}
return(s2);
}

void main()
{
double a,b,eps,t;
a=0.0; b=1.0; eps=0.0000001;

printf("**********************************************************\n");
printf("* This program is to calculat the Value of *\n");
printf("* a definite integral by Simpson Method. *\n");
printf("**********************************************************\n");

printf("\n----------------------------------------------------------\n");
printf(" >> The result of definite integral is (n=8): \n");
printf(" >> SIGMA(0,1)sqrt(x)*ln(x)dx = ");
t=fsimp(a,b,eps,8);
printf("%e\n",t);
printf("----------------------------------------------------------\n");

printf("\n----------------------------------------------------------\n");
printf(" >> The result of definite integral is (n=16): \n");
printf(" >> SIGMA(0,1)sqrt(x)*ln(x)dx = ");
t=fsimp(a,b,eps,16);
printf("%e\n",t);
printf("----------------------------------------------------------\n");

printf("\n----------------------------------------------------------\n");
printf(" >> The result of definite integral is (n=32): \n");
printf(" >> SIGMA(0,1)sqrt(x)*ln(x)dx = ");
t=fsimp(a,b,eps,32);
printf("%e\n",t);
printf("----------------------------------------------------------\n");

system("pause");
}

⑹ 1/3辛普森法

这是等距节点积分的近似算法.

原理如下:


⑺ 请问复合梯形方法、复合simpson方法及Guass数值积分方法算法的优、缺点和效率哪个更好

复合辛普森要比复合梯形公式更加好一些,这个可以从误差限的大小来判断,复合梯形公式的误差限的系数为-(b-a)/12,而且后面是h平方级还有f的二次导数,而辛普森的系数是-(b-a)/(180*16),后面h是四次方级的,f的导数为四次导数,显然辛普森的误差限更加小
而高斯求积公式是对代数精度的方面有着更加好的结果

⑻ C语言实习用梯形法或辛普森法求解定积分的值

//梯形法求定积分
#include<stdio.h>
#include<math.h>
//定义被积函数
double func(double x){
return sin(x)*cos(x);
}

void main(){
double a,b,h,x,sum;
int i,n;
printf("Input a b and n: ");
scanf("%lf%lf%d",&a,&b,&n);
h=(b-a)/n;
x=a;
sum=(func(a)+func(b))/2;
for(i=1; i<n; i++){
x += h;
sum += func(x);
}
sum *= h;
printf("sum=%.4lf\n",sum);
}

⑼ 辛普森求积公式

直接参考《数学分析》定积分的近似计算以及定积分的应用部分。(大多数的分析教材上都有辛普森公式),而且椭球的体积直接用积分的方法就能做出精确值,哪还用得着用辛普森公式去求一个近似值,辛普森公式本身就是一个数值积分公式,只有在计算一些多项式函数(三次或三次以下)的定积分时才会得出精确值。说得更一般一点,只要被积函数的四阶导数(前提是被积函数四阶连续可微)在积分区间内不恒等于0,用辛普森公式都有可能产生误差。
你说的算法是错的,但是椭球列出的被积函数确实是一个二次多项式,故可以用辛普森公式算出精确值,V=πbc[1-(0*0)/(a的平方)]*{[a-(-a)]/6},你的算法的错误在于少乘了积分区间的长度,在这个实际问题中它对应着几何题的高(2a或2b或2c).

热点内容
铜镜数据库 发布:2025-01-17 01:08:57 浏览:673
上传图片链接 发布:2025-01-17 01:08:11 浏览:891
智跑买车可以提哪些配置 发布:2025-01-17 01:06:46 浏览:463
qq2013源码 发布:2025-01-17 01:06:35 浏览:94
sql的decode 发布:2025-01-17 01:01:01 浏览:4
系数参数配置什么意思 发布:2025-01-17 00:34:03 浏览:755
台湾免费服务器云主机 发布:2025-01-17 00:29:07 浏览:870
c语言sizeofchar 发布:2025-01-17 00:29:01 浏览:469
安卓手机的云备份在哪里能找到 发布:2025-01-17 00:14:12 浏览:472
诈骗的脚本 发布:2025-01-16 23:51:27 浏览:315