C语言用六种方法求定积分.docx

上传人:b****8 文档编号:30310020 上传时间:2023-08-13 格式:DOCX 页数:15 大小:126.98KB
下载 相关 举报
C语言用六种方法求定积分.docx_第1页
第1页 / 共15页
C语言用六种方法求定积分.docx_第2页
第2页 / 共15页
C语言用六种方法求定积分.docx_第3页
第3页 / 共15页
C语言用六种方法求定积分.docx_第4页
第4页 / 共15页
C语言用六种方法求定积分.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

C语言用六种方法求定积分.docx

《C语言用六种方法求定积分.docx》由会员分享,可在线阅读,更多相关《C语言用六种方法求定积分.docx(15页珍藏版)》请在冰豆网上搜索。

C语言用六种方法求定积分.docx

C语言用六种方法求定积分

C语言用六种方法求定积分

C语言实验报告

求定积分

班级10信息与计算科学一班

姓名戴良伟

学号2010750221

1.描述问题

利用?

左矩形公式,?

中矩形公式,?

右矩形公式,?

梯形公式,?

simpson公式,?

Gauss积分公式求解定积分。

2.分析问题

2.1定积分

21.1定积分的定义

定积分就是求函数在区间中图线下包围的面积。

即fxab,,,,,

所包围的面积。

这个图形称为曲边梯形,特例是曲yxaxbyfx,,,,0,,,,,

边梯形。

如下图:

(图1)

设一元函数,在区间内有定义。

将区间分成个小区nyfx,ab,ab,,,,,,,

,,xxx,x间。

设,取区间中曲线上任意一axxxxxxb,,,,,......,,,,,,,,,iii,1i00112i

点记做,作和式:

f,,,i

n,,limfixi,,,,,,,,,,n1,i,,

若记λ为这些小区间中的最长者。

当时,若此和式的极限存在,,,0

则称这个和式是函数在区间上的定积分。

fxab,,,,,

b记作:

fxdx,,,a

其中称为积分下限,为积分上限,为被积函数,为被afxfxdxb,,,,积式,?

为积分号。

之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,而不是一个函数。

[1]21.2定积分的几何意义

它是介于x轴、函数f(x)的图形及两条直线x=a,x=b之间的各个部分面积的代数和。

在x轴上方的面积取正号;在x轴下方的面积取负号。

如图

2.2言实现定积分计算的算法

22.1利用复合梯形公式实现定积分的计算

假设被积函数为,积分区间为,把区间等分成个小区间,nfxab,ab,,,,,,,各个区间的长度为,即,称之为“步长”。

根据定积分的定义及几hban,,/h,,

何意义,定积分就是求函数在区间中图线下包围的面积。

将积分fxab,,,,,

区间等分,各子区间的面积近似等于梯形的面积,面积的计算运用梯形公n

式求解,再累加各区间的面积,所得的和近似等于被积函数的积分值,越n

大,所得结果越精确。

以上就是利用复合梯形公式实现定积分的计算的算法思

想。

复合梯形公式:

n,1h,,[2]2Tfafxfb,,,,,,,,,,ni,,2,,i,1

具体算法如下:

算法一1:

输入积分区间的端点值和;ab

2:

输入区间的等分个数(要求尽可能大,以保证程序运行结果有较高nn

的精确度);

3:

计算步长;hban,,/,,

4:

对累加和赋初值;Tff,,/2,,ab

5:

计算累加和

n,1

Tfx,,,,ii,1

TTh,,6:

算出积分值;n

T7:

输出积分近似值,完毕。

n

1.2.2利用Smpson公式实现定积分的计算

假设被积函数为,积分区间为,把区间等分成n个小区间,fxab,ab,,,,,,,各个区间的长度为。

在复合梯形公式的基础上,构造出一种加速计算积分的方h

法。

作为一种外推算法,它在不增加计算量的前提下提高了误差的精度。

具体算法如下:

算法二1:

输入积分上限和下限a;b

2:

输入区间的等分个数n(要求n尽可能大,以保证程序运行结果有较高

的精确度);

[2]SnTnTn,,,42/33:

利用辛甫生公式:

,实现对定积分的求解(其中,,,,,,,,

,均为梯形公式计算所得的结果,由此可见辛甫生公式是以梯形公式Tn2Tn,,,,

为基础的);

S;4:

算出积分值n

S5:

输出积分近似值,完毕。

n

1.2.3利用Guass公式实现定积分计算

Guass型求积公式是构造高精度差值积分的最好方法之一。

他是通过让节点和

积分系数待定让函数f(x)以此取i=0,1,2....n次多项式使其尽可能多的能够精确成

立来求出积分节点和积分系数。

高斯积分的代数精度是2n-1,而且是最高的。

+1的积分节点和积分系数,其他积分域是通过变换x=(b-a)t/2常运用的是-1---

+(a+b)/2变换到-1到1之间积分。

算法三

1:

输入积分上限和下限;ab

2:

利用Guass公式,求定积分

S4:

算出积分值;n

S5:

输出积分近似值,完毕。

n

3.程序的编写

3.1程序一(左矩形公式)

3.1.1源程序

#include#includevoidmain()

{doublef(doublex);/*f(x)为函数举例,即被积函数*/inti,n;

/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:

\n");scanf("%lf",&a);printf("积分上限b:

\n");scanf("%lf",&b);printf("区间等分个数n:

\n");scanf("%d",&n);h=(b-a)/n;/*步长的计算*/

s=f(a)*h;

for(i=1;i

{s=s+f(a+i*h)*h;}

f(x)的积分值为s=%10.6f\n",s);printf("函数

}

/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;

y=sqrt(4-x*x);return(y);}

3.1.2程序一的编译运行

被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:

输入0+回车

输入2+回车

输入1000+回车

3.2程序二(中矩形公式)

3.2.1源程序

#include#includevoidmain()

{doublef(doublex);/*f(x)为函数举例,即被积函数*/

inti,n;

/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;

/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:

\n");

scanf("%lf",&a);printf("积分上限b:

\n");

scanf("%lf",&b);printf("区间等分个数n:

\n");scanf("%d",&n);

h=(b-a)/n;/*步长的计算*/

s=0.5*(f(a)+f(a+h))*h;for(i=1;i

}

printf("函数f(x)的积分值为s=%10.6f\n",s);

}

/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;

y=sqrt(4-x*x);

return(y);}

3.2.2程序二的编译运行

被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:

输入0+回车

输入2+回车

输入1000+回车

3.3程序三(右矩形公式)

3.3.1源程序

#include#includevoidmain()

{doublef(doublex);/*f(x)为函数举例,即被积函数*/inti,n;

/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:

\n");scanf("%lf",&a);printf("积分上限b:

\n");scanf("%lf",&b);printf("区间等分个数n:

\n");scanf("%d",&n);h=(b-a)/n;/*步长的计算*/

s=f(a+h)*h;

for(i=1;i

printf("函数f(x)的积分值为s=%10.6f\n",s);

}

/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;

y=sqrt(4-x*x);

return(y);}

3.3.2程序三的编译运行

被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:

输入0+回车

输入2+回车

输入1000+回车

3.4程序四(梯形公式)

3.4.1源程序

#include#include

voidmain()

{doublef(doublex);/*f(x)为函数举例,即被积函数*/

inti,n;

/*n为区间等分的个数,应尽可能大*/doublea,b,h,s;

/*a为积分下限,b为积分上限,h为步长*/printf("积分下限a:

\n");

scanf("%lf",&a);printf("积分上限b:

\n");

scanf("%lf",&b);printf("区间等分个数n:

\n");scanf("%d",&n);

h=(b-a)/n;/*步长的计算*/

s=0.5*(f(a)+f(a+h))*h;for(i=1;i

}

printf("函数f(x)的积分值为s=%10.6f\n",s);

}

/*以下为被积函数的定义,即函数举例*/doublef(doublex){doubley;

y=sqrt(4-x*x);

return(y);}

3.4.2程序四的编译运行

被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:

输入0+回车

输入2+回车

输入1000+回车

3.5程序五(Simpson公式)

3.5.1源程序

#include

#include

voidmain()

{doubleT(doublex,doubley,intz);

doublea,b,s;

intn;

printf("积分下限a:

\n");

scanf("%lf",&a);

printf("积分上限b:

\n");

scanf("%lf",&b);

printf("区间等分个数n:

\n");scanf("%d",&n);

s=(4*T(a,b,2*n)-T(a,b,n))/3;

/*利用辛甫生公式求解定积分*/

printf("函数f(x)的积分值为s=%f\n",s);}

/*以下为复合梯形公式的定义*/

doubleT(doublex,doubley,intz)

{doubleh,Tn;

inti;

doublef(doublet);

h=(y-x)/z;

Tn=(f(x)+f(y))/2;for(i=1;i

return(Tn);

}

/*以下为被积函数的定义,即函数举例*/doublef(doublet){doubles;

s=sqrt(4-t*t);return(s);}

3.5.2程序四的编译运行

被积函数为f(x)=sqrt4-(x*x)的情况先编译,再运行,屏幕显示及操作如下:

输入0+回车

输入2+回车

输入1000+回车

3.6程序六(Guass公式)

3.6.1源程序

#include

#include

#defineN3

floatgass_integral(float(*)(float),float,float,int);voidmain()

{

floatfunction_name(float);

floata,b;

printf("请输入积分上限b\n");

scanf("%f",&b);

printf("请输入积分下限a\n");

scanf("%f",&a);

floatans;

ans=gass_integral(function_name,a,b,N);

printf("ans=%f",ans);

}

//高斯求积:

代数精度为2n-1.-1---+1之间

floatgass_integral(float(*func)(floatx),floata,floatb,intn){

//高斯点及其求积系数列表

-----------------------------------------------------------------------------------

--------

floatx1[1]={0.0};floatA1[1]={2};

floatx2[2]={-0.5573503,0.5573503};floatA2[2]={1,1};

floatx3[3]={-0.7745967,0.0,0.7745967};floatA3[3]={0.555556,0.888889,0.555556};

floatx4[4]={0.3399810,-0.3399810,0.8611363,-0.8611363};

floatA4[4]={0.6521452,0.6521452,0.3478548,0.3478548};floatx5[5]={0.0,0.5384693,-0.5384693,0.9061799,-0.9061799};

float

A5[5]={0.5688889,0.4786287,0.4786287,0.2369269,0.2369269};

//---------------------------------------------------------------------------------

-------------------------------------------------float*p,*t;

switch(n)

{case1:

p=x1;t=A1;break;

case2:

p=x2;t=A2;break;

case3:

p=x3;t=A3;break;

case4:

p=x4;t=A4;break;

case5:

p=x5;t=A5;break;

default:

printf("intputwrong!

");}

floatg=0;

for(inti=0;i

{g+=(*func)((b-a)*p[i]/2+(a+b)/2)*t[i];}g*=(b-a)/2;

returng;

}

floatfunction_name(floatx)

{return(sqrt(4-x*x));

}

3.6.2程序四的编译运行

被积函数为f(x)=sqrt4-(x*x)的情况

先编译,再运行,屏幕显示及操作如下:

输入2+回车

输入0+回车

4误差分析

手工计算结果为:

3.156173.,左矩形公式误差:

0.39%,中矩形公式误差:

0.46%,右矩形公式误差:

0.52%,梯形公式误差:

0.46%,辛普森公式和高斯公式误差几乎等于0,六个程序运行结果对比,在计算相同的函数f(x)=sqrt(4-x*x)的定积分,Simpson公式和Guass公式比矩形和梯形公式更可行,更有效。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1