- 掌握C++基本控制结构
- 掌握C++函数的定义与使用
函数
f
(
x
)
f(x)
f(x)在区间
[
a
,
b
]
[a,b]
[a,b]的定积分为曲线
f
(
x
)
f(x)
f(x)、
x
x
x轴、直线
x
=
a
x=a
x=a和直线
x
=
b
x=b
x=b围成的面积,可以近似的将这块面积沿
x
x
x轴等分为
N
N
N个小矩形,并计算他们的面积之和而得到。
矩形宽度为
(
b
−
a
)
/
N
(b-a)/N
(b−a)/N,矩形高度为
f
(
(
x
i
+
x
i
−
1
)
/
2
)
f((x_i+x_{i-1})/2)
f((xi+xi−1)/2)。
使用解析解
∫
1
/
√
(
1
−
x
2
)
d
x
=
a
r
c
s
i
n
x
∫ {1/√(1-x^2 ) dx=arcsinx }
∫1/√(1−x2)dx=arcsinx对数值计算结果进行验证。
题目:编写一个程序计算函数
f
(
x
)
=
1
/
√
(
1
−
x
2
)
f(x)=1/√(1-x^2 )
f(x)=1/√(1−x2)在定义域
[
0
,
1
)
[0,1)
[0,1)内任意指定区间的定积分近似值。
要求:
- 计算区间和区间等分数目从命令行分别读取;
- 程序具有健壮性,对计算区间超出定义域等异常情况给出错误提示并提醒用户重新输入;
- 测试尽可能多种异常情况;
- 测试3组区间数据,每组区间下给出5种不同等分数目。
提高(选做):进一步考虑曲线 f ( x ) f(x) f(x)在各处变化率(即切线斜率)不同,采用区间等分方法误差较大,可以考虑非均匀区间划分方法。
这里我没有做提高题,原题代码如下
#include<iostream> //实验一:定积分数值计算 2019/03/28
#include<cmath>
using namespace std;
/* 函数Fx=1/√1-x^2 */
double F(double x){
return 1/sqrt(1-x*x);
}
/* 函数defIntegral,输入区间[a,b]以及区间等分数目n,计算f(x)=1/√1-x^2在[a,b]内的定积分近似值 */
void defIntegral(double a, double b, int n){
double x=a;
double dx = (b-a)/n; //沿x轴将面积分为n个小矩形,每个矩形宽为(b-a)/n
double s,S=0; //s表示每个小矩形的面积,S表示总面积
if(a<0||a>=1)
cout<<"error left border"<<endl; //当a的值不在定义域内时,提示区间左值错误
else if(b>=1||b<=0)
cout<<"error right border"<<endl; //当b的值不在定义域内时,提示区间右值错误
else{
for(int i=1;i<=n;i++){
s=F((x+x+dx)/2)*dx;
S+=s; // 将每个小矩形的面积叠加
x+=dx;}
cout<<S<<endl;}
}
int main(){ //用3组区间5种精度检验函数结果准确性,这里仅给出一组
cout << "输入区间为[0,0.999]" << endl;
defIntegral(0, 0.999, 10);
defIntegral(0, 0.999, 50);
defIntegral(0, 0.999, 100);
defIntegral(0, 0.999, 500);
defIntegral(0, 0.999, 1000);
return 0;
}
这里用了三组测试数据,分别是
[
0
,
0.999
]
[0,0.999]
[0,0.999]、
[
0.1
,
0.3
]
[0.1,0.3]
[0.1,0.3]、
[
0.5
,
0.8
]
[0.5,0.8]
[0.5,0.8]
五种区间精度分别为
10
10
10、
50
50
50、
100
100
100、
500
500
500、
1000
1000
1000.
用
a
r
c
s
i
n
arcsin
arcsin计算器分别检验计算结果:
[
0
,
0.9
]
[0,0.9]
[0,0.9]上的积分为:
1.52607124
1.52607124
1.52607124;
[
0.1
,
0.3
]
[0.1,0.3]
[0.1,0.3] 上的积分为:
0.20452523
0.20452523
0.20452523;
[
0.5
,
0.8
]
[0.5,0.8]
[0.5,0.8] 上的积分为:
0.40369644
0.40369644
0.40369644.
可见将区间分得越细,计算结果越精确