admin 管理员组文章数量: 1086019
2024年3月29日发(作者:itemcf usercf)
淮北师范大学
2010届学士学位论文
C语言求解定积分
系别、专业数学科学学院 信息与计算科学
研 究 方 向 计算机
学 生 姓 名 谢贵龙
学 号
指导教师姓名 罗婷婷
指导教师职称 讲师
2010年4月20日
C语言求解定积分
谢贵龙
(淮北师范大学,数学科学学院,淮北,235000)
摘 要
本文以连续函数在闭区间上的定积分为研究的出发点。在简单介绍定积分、
连续函数等相关定义后,论述了两种算法思想,并利用C语言编写相应的程序。
通过函数举例验证了算法的合理性和正确性,并讨论了这两种算法在适用范围及
精确度上的略微差异。最后通过本文的论述推广到其它求定积分的算法的实现。
关键词 C语言,定积分,编程
C Language to Solve Definite Integral
Xie Guilong
(School of Mathematical Science, Huaibei Normal University,huaibei,235000)
Abstract
In this thesis, definite integral of a continuous function in the closed interval
starting point for a brief introduction of definite integral and continuous
function definition,I discussed the ideas of two algorithms and used the corresponding
program written in then I verified through the example Function algorithm is
correct and reasonable,discussed the scope of the two algorithms and the accuracy of the
slight y, the request will be extended to other points of the algorithm,
through the discussion of this thesis.
Keywords C Language, definite integral, programming
目 录
引言 ............................................................... 1
一、C语言实现定积分计算的算法 ...................................... 1
1.1定积分 ...................................................... 1
1.2C语言实现定积分计算的算法 ................................... 2
二、模块构成和各模块功能 ........................................... 3
2.1关于算法一的模块构成和各模块功能 ............................ 3
2.2关于算法二的模块构成和各模块功能 ............................ 4
三、C语言求解定积分的具体程序 ...................................... 4
3.1程序一(复合梯形公式求解定积分) ............................ 4
3.2程序二(辛甫生公式求解定积分) .............................. 5
四、程序编译运行及调试情况 ......................................... 6
4.1程序一的编译运行及调试情况 .................................. 6
4.2程序二的编译运行及调试情况 .................................. 9
4.3程序简单分析 ............................................... 11
参考文献 .......................................................... 12
致 谢 ............................................................ 13
引言
随着计算机的普及,计算机越来越多的运用于数学领域,但在早期,计算机
实现的数学作用仅仅是四则运算、统计计算等简单的功能。如今,科学发展神速,
人们自然要求计算机实现更多样化,更深层次的数学功能,比如对定积分的自动
求解等。
长期以来,定积分的求解依赖于手动繁杂的计算,这不仅费时费力,且容易
出错。于是,人们希望通过编写一套程序来实现对定积分的自动求解。
然而函数的类型多种多样,定积分的求解方法也灵活多变,不可千篇一律,
故本文以最简单的连续函数的定积分求解为出发点,展开研究,以定积分的定义
为思想基础,设计C程序,来实现计算机对定积分的自动求解。
一、C语言实现定积分计算的算法
1.1定积分
1.1.1定积分的定义
[1]
定积分就是求函数
f
x
在区间
a,b
中图线下包围的面积。即
y0,xa,xb,yf
x
所包围的面积。这个图形称为曲边梯形,特例是曲边
梯形。如下图:
(图1)
设一元函数
yf
x
,在区间
a,b
内有定义。将区间
a,b
分成
n
个小区间
a,x
0
,
x
0
,x
1
,
x
1
,x
2
......
x
i
,b
。设
x
i
x
i
x
i1
,取区间
x
i
中曲线上任意一点记
做
f
i
,作和式:
n
lim
f
ixi
n
i1
1
若记λ为这些小区间中的最长者。当
0
时,若此和式的极限存在,则
称这个和式是函数
f
x
在区间
a,b
上的定积分。
记作:
f
x
dx
a
b
其中称
a
为积分下限,
b
为积分上限,
f
x
为被积函数,
f
x
dx
为被积
式,∫ 为积分号。
之所以称其为定积分,是因为它积分后得出的值是确定的,是一个数,
而不是一个函数。
1.1.2定积分的几何意义
[1]
它是介于x轴、函数f(x)的图形及两条直线x=a,x=b之间的各个部分面
积的代数和。在x轴上方的面积取正号;在x轴下方的面积取负号。如图
(图2)
1.2 C语言实现定积分计算的算法
1.2.1利用复合梯形公式实现定积分的计算
[2],[3]
假设被积函数为
f
x
,积分区间为
a,b
,把区间
a,b
等分成
n
个小区间,
各个区间的长度为
h
,即
h
ba
/n
,称之为“步长”。根据定积分的定义及几
何意义,定积分就是求函数
f
x
在区间
a,b
中图线下包围的面积。将积分区
间
n
等分,各子区间的面积近似等于梯形的面积,面积的计算运用梯形公式
求解,再累加各区间的面积,所得的和近似等于被积函数的积分值,
n
越大,
所得结果越精确。以上就是利用复合梯形公式实现定积分的计算的算法思想。
复合梯形公式:
n1
h
T
n
f
a
2
f
x
i
f
b
[2]
2
i1
具体算法如下:
算法一
2
Step1:输入积分区间的端点值
a
和
b
;
Step2:输入区间的等分个数
n
(要求
n
尽可能大,以保证程序运行结果有较
高的精确度);
Step3:计算步长
h
ba
/n
;
Step4:对累加和赋初值
T
f
a
f
b
/2
;
Step5:计算累加和
T
f
x
i
i1
n1
Step6:算出积分值
T
n
Th
;
Step7:输出积分近似值
T
n
,完毕。
1.2.2利用辛甫生公式实现定积分的计算
假设被积函数为
f
x
,积分区间为
a,b
,把区间
a,b
等分成
n
个小区间,各
个区间的长度为
h
。在复合梯形公式的基础上,构造出一种加速计算积分的方法。
作为一种外推算法, 它在不增加计算量的前提下提高了误差的精度。
具体算法如下:
算法二
Step1:输入积分上限
b
和下限
a
;
Step2:输入区间的等分个数
n
(要求
n
尽可能大,以保证程序运行结果有较
高的精确度);
Step3:利用辛甫生公式:
S
n
4T
2n
T
n
/3
[2]
,
实现对定积分的求解(其
中
T
2n
,
T
n
均为梯形公式计算所得的结果,由此可见辛甫生公式是以梯形公
式为基础的);
Step4:算出积分值
S
n
;
Step5:输出积分近似值
S
n
,完毕。
二、模块构成和各模块功能
2.1关于算法一的模块构成和各模块功能
该算法利用复合梯形公式的思想来编程,从而实现对连续函数的自动求解。
程序主要由两部分组成。
(1)、主函数部分
[4]
:
定义区间等分的个数变量n,n为整型变量,即int。在此需要强调的是n的值
应尽量大,使得程序运算结果更精确。
3
定义积分上限变量b和下限变量a,步长变量h,中间变量T,以及积分变量
Tn。考虑到实际情况中,这些变量常常不是整数,而单精度实数的有效位数只有7
位,故定义它们为具有16位有效位数的双精度浮点型变量,即double。
主函数部分主要实现对步长h的求解、对T赋初值,以及T的累加求和、积
分值Tn的求解和输出等功能。即主函数实现了对复合梯形公式利用的功能。程序
中被积函数是通过函数调用来实现的。
(2)、被调函数f(x)
[5]
:
该函数的作用在于定义一个被积函数,达到函数举例的目的。由于本论文研
究的出发点为连续函数,故所定义的函数实例应为区间[a,b]上连续函数。
2.2关于算法二的模块构成和各模块功能
[6]
该算法利用辛甫生公式的思想来编程,以复合梯形公式为基础,从而实现对
连续函数的自动求解。程序主要由三部分组成。
(1)、主函数部分:
定义区间等分的个数变量n,n为整型变量。
定义积分上限变量b和下限变量a,以及积分变量Sn,均为双精度浮点型变
量。
由于辛甫生公式中利用到梯形公式,所以主函数需实现对复合梯形公式函数
的调用。
(2)、被调函数T:
该部分是将复合梯形公式作为一个普通函数来定义,是对算法一得变形使用。
这样一来,通过主函数利用辛甫生公式计算定积分而调用它,构造出一种加速计
算积分的方法,使计算结果更精确。
(3)、被调函数f(x):
定义一个被积函数,达到函数举例的目的。所定义的函数实例应为区间[a,b]
上连续函数。
三、C语言求解定积分的具体程序
3.1程序一(复合梯形公式求解定积分)
#include
void main()
{double f(double x);
4
/*f(x)为函数举例,即被积函数*/
int i,n;
/*n为区间等分的个数,应尽可能大*/
double a,b,h,T,Tn;
/*a为积分下限,b为积分上限,h为步长*/
printf("ji fen xia xian a:n");
scanf("%lf",&a);
printf("ji fen shang xian b:n");
scanf("%lf",&b);
printf("qu jian deng fen ge shu n (jin ke neng da ):n");
scanf("%d",&n);
h=(b-a)/n;
/*步长的计算*/
T=(f(a)+f(b))/2;
/*中间变量T赋初值*/
for(i=1;i T=T+f(a+i*h); /*用循环控制来完成复合梯形公式的运算*/ Tn=T*h; printf("han shu f(x) de ji fen zhi wei Tn=%fn",Tn); } /*以下为被积函数的定义,即函数举例*/ double f(double x) {double y; y=x*x; return (y);} 3.2程序二(辛甫生公式求解定积分) #include void main() {double T(double x,double y,int z); double a,b,Sn; 5 int n; printf("ji fen xia xian a:n"); scanf("%lf",&a); printf("ji fen shang xian b:n"); scanf("%lf",&b); printf("qu jian deng fen ge shu n (jin ke neng da ):n"); scanf("%d",&n); Sn=(4*T(a,b,2*n)-T(a,b,n))/3; /*利用辛甫生公式求解定积分*/ printf("han shu f(x) de ji fen zhi wei Sn=%fn",Sn); } /*以下为复合梯形公式的定义*/ double T(double x,double y,int z) {double h,Tn; int i; double f(double t); h=(y-x)/z; Tn=(f(x)+f(y))/2; for(i=1;i Tn=Tn+f(x+i*h); Tn=Tn*h; return (Tn); } /*以下为被积函数的定义,即函数举例*/ double f(double t) {double s; s=t*t; return (s);} 四、程序编译运行及调试情况 4.1程序一的编译运行及调试情况 4.1.1 被积函数为f(x)=x*x的情况 6 (1)先编译,再运行,屏幕显示及操作如下: 输入:4+回车 输入:10+回车 输入:100+回车 (手工计算所得结果为312) (2) 输入:3+回车 输入:11+回车 输入:150+回车 (手工计算所得结果为434.666667) 7 (3) 输入:3+回车 输入:11+回车 输入:3+回车 (手工计算所得结果为434.666667) 4.1.2被积函数为f(x)=x*x*x+2的情况 将被积函数改为f(x)=x*x*x+2,具体做法如下: 将程序一中的被调函数 double f(double x) {double y; y=x*x; return (y);} 改为 double f(double x) {double y; y=x*x*x+2; return (y);} 然后重新编译,再运行,屏幕显示及操作如下: 输入:45+回车 输入:112+回车 8 输入:10000+回车 (手工计算所得结果为3831296.75) 4.2程序二的编译运行及调试情况 4.2.1 被积函数为f(x)=x*x的情况 (1) 输入:4+回车 输入;10+回车 输入:100+回车 (手工计算所得结果为312,比较程序一得出的结果Tn=312.003600) (2) 输入:3+回车 9 输入:11+回车 输入:150+回车 (手工计算所得结果为434.666667,比较程序一得出的结果Tn=434.670459) (3) 输入:5+回车 输入:5+回车 输入:200+回车 (手工计算所得结果为0) 4.2.2被积函数为f(x)=x*x*x+2的情况 输入:45+回车 10 输入:112+回车 输入:10000+回车 (手工计算所得结果为38312961.75,比较程序一得出的结果Tn=38312961.868049) 4.3程序简单分析 : (1)从运行所得结果来看以上两个程序虽简短,但能较精确的求解出被积f(x) 的定积分。可见其算法思想,以及程序编辑的正确性。 (2)从程序调试过程可知,区间等分个数n越大,所得结果越精确。比如在 4.1.1程序一中的(2)、(3),在相同被积函数f(x)=x*x,相同积分上下限的前提下, 当区间等分个数为n=150时,运行所得结果Tn=434.670459;当区间等分个数为 n=3时,运行所得结果Tn=444.148148。而实际积分值应为Tn=434.666667,如此 说明区间等分个数n越大,所得结果越精确。 (3)从两个程序运行所得结果的对比,显然,程序二比程序一在不增加计算 量的前提下具有较高的精确度。即在条件相同的前提下,利用辛普生公式求解定 积分比利用复合梯形公式求解定积分更有效可行。 (4)本文的研究具有举一反三的作用。程序二以辛普生公式为思想基础,对 程序一进行改造,使得复合梯形公式在程序二中作为普通函数被调用,构造出一 种加速计算积分的方法,使计算结果更精确。 在此值得一提的是,另外两个著名的定积分求解公式: 科特斯公式: C n 16S 2n S n /15 ; 龙贝格公式: R n 64C 2n C n /63 。 科特斯公式是以复合梯形公式和辛普生公式为基础构造出一种加速计算积分 的方法,较复合梯形公式和辛普生公式具有更好的精确度。而龙贝格公式是以复 合梯形公式、辛普生公式和科特斯公式为基础构造出一种加速计算积分的方法, 11 比以上三个求积公式精确度都要高。对于这两种算法思想的编程,可类似于程序 二的编辑,将前者作为普通函数来调用,构造加速计算,提高运行结果的精确度, 因此本文起到举一反三的作用。但由于利用辛普生公式求解定积分已具有较好的 精确度,故本论文就不再对后面两种算法思想进行研究和编程。 另外,本论文的研究以区间[a,b]上的连续函数为出发点。即,对于非连续函 数,程序不能百分百适合。 参考文献 : [1] 华东师范大学数学系.《数学分析(上册 第三版)》[M].北京:高等教育出版社,2001,6 [2] 李庆扬、王能超、易大义.《数值分析》[M].北京:清华大学出版社,2008,12 [3] 邹恒明.《算法之道》[M]. 北京:机械工业出版社,2010,02 [4] 孟朝霞.《实用C语言程序设计教程》[M].北京:清华大学出版社,2009,12(1) [5] 张建宏、唐国民.《 C语言程序设计实践教程》[M]. 北京:清华大学出版社,2009,10 [6] 周雅静、钱冬云.《C语言程序设计实用教程》[M]. 北京:清华大学出版社,2009,8 [7] 王春森.《程序员教程》[M]. 北京:清华大学出版社,2001 [8] (美)霍顿(杨浩 译).《C语言入门经典》[M]. 北京:清华大学出版社,2008,04 [9] 温海,张友,童伟等.《C语言精彩编程百例》[M]. 北京:水利水电出版社,2004,01 12 致 谢 在此,本人首先要衷心感谢对我的毕业论文给予帮助、指导的罗婷婷老师。 本论文研究的中心内容是C语言求解定积分,此论文为本人百分百原创。通过论 文的研究、创作,更加巩固了本人所学的定积分和C语言等相关知识体系。最重 要的是增强了我的学习兴趣,大大加深了我对C语言编程的爱好。 感谢学校给予我这样一个知识发挥、灵感创作的平台,也感谢该论文题目的 出题者罗婷婷老师。 13
版权声明:本文标题:c语言求解定积分 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1711653939a603776.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论