定积分数值计算(C++实现)

  • 实验目的

  1. 掌握C++基本控制结构
  2. 掌握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 (ba)/N,矩形高度为 f ( ( x i + x i − 1 ) / 2 ) f((x_i+x_{i-1})/2) f((xi+xi1)/2)
使用解析解 ∫ 1 / √ ( 1 − x 2 ) d x = a r c s i n ⁡ x ∫ {1/√(1-x^2 ) dx=arcsin⁡x } 1/(1x2)dx=arcsinx对数值计算结果进行验证。

  • 实验内容

题目:编写一个程序计算函数 f ( x ) = 1 / √ ( 1 − x 2 ) f(x)=1/√(1-x^2 ) f(x)=1/(1x2)在定义域 [ 0 , 1 ) [0,1) [0,1)内任意指定区间的定积分近似值。
要求

  1. 计算区间和区间等分数目从命令行分别读取;
  2. 程序具有健壮性,对计算区间超出定义域等异常情况给出错误提示并提醒用户重新输入;
  3. 测试尽可能多种异常情况;
  4. 测试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.

可见将区间分得越细,计算结果越精确

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值