复化抛物线积分公式 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】
摘要求函数在给定区间上的定积分,在微积分学中已给出了许多计算方法,但是,在实际问题计算中,往往仅给出函数在一些离散点的值,它的解析表达式没有明显的给出,或者,虽然给出解析表达式,但却很难求得其原函数。这时我们可以通过数值方法求出函数积分的近似值。
在用近似值代替真实值时,遇到的问题就是近似值的代数精度是否足够。当代数精度不足够时,很显然提高插值函数的次数是一种方法,但是考虑到数值计算的稳定性,当次数过高时,会出现龙格现象,用增大n的方法来提高数值积代数精度是不可取的。因此,提出类似于分段插值,为了减少数值积分的误差,可以把积分区间分成若干个小区间,在每个小区间上采用低阶数值积分公式,然后把这些小区间上的数值积分结果加起来作为函数在整个区间上的近似值,这个就是复化数值积分的思想。
本实验针对在每个小区间上利用抛物线积分公式,即阶数为2,进行实验。
关键词:龙格现象复化数值积分代数精度复化抛物线积分公式
1、实验目的
1)通过本次实验体会并学习复化抛物线积分公式的优点。
2)通过对复化抛物线积分公式进行编程实现,提高自己的编程能力。
3)用实验报告的形式展现,提高自己在写论文方面的能力。
2、算法流程
已知定积分的抛物线积分公式及其误差为
{ ∫f (f )ff f
f
≈
f ?f 6[f (f )+4f (f +f
2)+f (f )]f 2[f ]=?(f ?f )52880
f 4(f ),f ∈(f ,f ) 根据数学知识,我们知道积分区间可划分,且不改变积分值,即如下所示:
∫f (f )ff =f
a
∑∫
f (f )ff f f
f f ?1
f
f =1
针对上式,在每一个小区间上利用抛物线积分公式有
∫f (f )ff f f
f f ?1≈f 6[f (f k ?1)+4f (f f ?12
)+f (f k )]?f 52880f 4
(f f )
得到
∫f (f )ff f
a
=∑∫
f (f )ff f f
f f ?1
f
f =1
=∑f 6[f (f k ?1)+4f (f f ?12)+f (f k )]?
f 5
2880
∑f 4(f f )f
f =1
f
f =1
其中f f ?1/2=12(f k ?1+f k )=a +(k ?1
2)f ,令
f f =∑f
6
[f (f f ?1)+f (f f )+f (f f ?1/2)]f
f =1
=f
6
[f (f )+4∑f (f f ?12)+2∑f (f f )f ?1
f =1
+f (f )f f =1
]
当f f 作为积分的近似值时,其误差为
f n [f ]=?
(f ?f )5
2880
f 4(f f ) =?
(f ?f )f 42880
f (4)(f 1)+f (4)(f 2)+?+f (4)(f f )
f
若f (f )∈f 4[f ,f ],则由介值定理推得
f n [f ]=?
(f ?f )4
2880
f 4(f ),f ∈(f ,f )
设f 4=|f 4(f )|f ≤f ≤f max
,得到误差限
|f n[f]|=(f?f)f4
2880
|f4(f)|≤
(f?f)f4
2880
f4=
(f?f)5
f4
由上式可以进行计算精度控制。这样就给出了n+1点复化抛物线积分公式及其误差
{
∫f(f)ff
f
f
≈
f
6
[f(f)+4∑f(f
f?
1
2
)+2∑f(f f)
f?1
f=1
+f(f)
f
f=1
] f2[f]=?
(f?f)f4
2880
f4(f)=?
(f?f)5
2880f4
f4(f),f∈(f,f)
3、算法实例
用复化抛物线积分公式计算积分
I=∫
4 1+f
1
ff 解:具体程序如下:
#include ""
#include <>
#include
using namespace std;
const int num(1000);
void main()
{
double a=0;
double b=0;
double h=0;
int n=0;
int i=0;
double Sn=0;
double F1=0;
double F2=0;
double x[num]={0};
double y[num]={0};
cout<<"请输入积分上下限和等分数的一半"< cin>>a; cout<<"请输入积分上限b="; cin>>b; cout<<"请输入等分数的一半n="; cin>>n; h=(b-a)/(2*n); for(i=0;i<2*n+1;i++) { x[i]=a+h*i; y[i]=4/(1+x[i]*x[i]); } for(i=1;i<2*n;i+=2) { F1=F1+4*y[i]; } for(i=2;i<2*n;i+=2) { F2=F2+2*y[i]; } Sn=h/3*(y[0]+y[2*n]+F1+F2); cout<<"积分结果为:Sn="< } 运行结果: 4、对结果进行分析 通过用编程实现对上例的求解,可以看出结果较为准确,而且逼近效果较好,但是由于复化抛物线积分公式的原理问题,所以本身存在误差,而且由于在计算机上计算,会存在计算误差。 5、参考文献 [1] 秦新强.数值逼近.西安:西安理工大学出版社,2010