数值计算:一重积分计算的C++实现

#include<iostream>
#include<iomanip>
#include<cmath>

using namespace std;

//求积:梯形公式
double Func_Integral_Trapezoid
(double lo, double hi, double(*Func)(double), int n = 1000)
{//lo:下限;hi:上限;Func:函数;n:等分数

	if (n <= 0) n = 100;

	double x;
	double step = (hi - lo) / n;

	double result = 0.0;
	x = lo;
	for (int i = 1; i < n; i++) {
		x += step;
		result += Func(x);
	}
	result += (Func(lo) + Func(hi)) / 2;
	result *= step;

	return result;
}

//求积:Simpson公式
double Func_Integral_Simpson
(double lo, double hi, double(*Func)(double), int n = 1000)
{//lo:下限;hi:上限;Func:函数;n:等分数

	if (n <= 0) n = 100;

	double x;
	double step = (hi - lo) / n;

	double result1 = 0.0;
	x = lo;
	for (int i = 1; i < n; i++) {
		x += step;
		result1 += Func(x);
	}
	result1 *= 2;

	double result2 = 0.0;
	x = lo + step / 2;
	for (int i = 0; i < n; i++) {
		result2 += Func(x);
		x += step;
	}
	result2 *= 4;

	double result = result1 + result2 + Func(lo) + Func(hi);
	result *= step / 6;

	return result;
}

//求积:Cotes公式
double Func_Integral_Cotes
(double lo, double hi, double(*Func)(double), int n = 1000)
{//lo:下限;hi:上限;Func:函数;n:等分数

	if (n <= 0) n = 100;

	double x;
	double step = (hi - lo) / n;

	double result1 = 0.0;
	x = lo;
	for (int i = 1; i < n; i++) {
		x += step;
		result1 += Func(x);
	}
	result1 *= 14;

	double result2 = 0.0;
	x = lo + step / 2;

	double result3 = 0.0;
	double x1 = lo + step / 4;
	double x2 = lo + step / 4 * 3;

	for (int i = 0; i < n; i++) {
		result2 += Func(x);
		result3 += Func(x1) + Func(x2);
		x += step;
		x1 += step;
		x2 += step;
	}
	result2 *= 12;
	result3 *= 32;

	double result4 = (Func(lo) + Func(hi)) * 7;

	double result = result1 + result2 + result3 + result4;
	result *= step / 90;

	return result;
}

//求积:Romberg公式
double Func_Integral_Romberg
(double lo, double hi, double(*Func)(double), int k = 4)
{//lo:下限;hi:上限;Func:函数;k:等分指数(区间等分成2^k份)
	int size = k + 1;
	double *matrix = new double[size*size];
	for (int i = 0; i < size*size; i++) matrix[i] = 0.0;

	double step = hi - lo;
	matrix[0] = Func_Integral_Trapezoid(lo, hi, Func, 1);
	for (int i = 1; i < size; i++) {
		int n = 1 << (i - 1);
		for (int k = 0; k < n; k++) {
			matrix[i*size + 0] += Func(lo + (k + 0.5)*step);
		}
		matrix[i*size + 0] *= step;
		matrix[i*size + 0] += matrix[(i - 1)*size];
		matrix[i*size + 0] /= 2.0;
		step /= 2.0;
	}

	double temp = 1.0;
	double factor1, factor2;
	for (int j = 1; j < size; j++) {
		temp *= 4.0;
		factor1 = temp / (temp - 1);
		factor2 = 1 / (temp - 1);
		for (int i = j; i < size; i++) {
			matrix[i*size + j] = factor1*matrix[i*size + j - 1]
				- factor2*matrix[(i - 1)*size + j - 1];
		}
	}

	double result = matrix[k*size + k];
	delete[] matrix;

	return result;
}

//测试用的被积函数,0到1积分为PI
double Func_test1(double x)
{
	return 4 / (1 + x*x);
}

int main() {
	cout << "Trapezoid Numerical Integration" << endl;
	cout << setprecision(15) << Func_Integral_Trapezoid(0, 1, Func_test1, 1024) << endl << endl;
	cout << "Simpson Numerical Integration" << endl;
	cout << setprecision(15) << Func_Integral_Simpson(0, 1, Func_test1, 1024) << endl << endl;
	cout << "Cotes Numerical Integration" << endl;
	cout << setprecision(15) << Func_Integral_Cotes(0, 1, Func_test1, 1024) << endl << endl;
	cout << "Romberg Numerical Integraion" << endl;
	cout << setprecision(15) << Func_Integral_Romberg(0, 1, Func_test1, 10) << endl << endl;
	getchar();
	return 0;
}

本光盘是《计算机常用数值计算算法与程序 C++版》一书的配套光盘,盘中包括了书中所有的C++程序源代码文件,每个源程序文件的文件扩展名都使用.cpp形式。这些C++程序已经在微软公司Windows平台下的Virsual C++ 6.0环境下通过。盘中还包括由这些源程序在VC++6.0下生成的可执行文件(文件扩展名为.exe),以及由这些程序运行后产生的结果文件(文件扩展名为.dat)。另外,还包括若干类书中所介绍算法的头文件,由文件扩展名为.h和.inl所组成。 为了方便读者实际应用书中所介绍的算法程序,本光盘专门预创建了VC++6.0的工程,以每一章建立一个工程,一共有16个工程,对应着书中的16章。全部工程包含在一个目录(文件夹)——NumComp下,该目录下一共有17个子目录(文件夹),第一个到第十六个为每章所对应的工程文件夹,命名为ChapXX,XX表示01至16,如Chap05,表示为第五章的程序所建立了工程目录(文件夹),第17个目录(文件夹)名为include,其中存放了本书中算法程序需要的诸头文件。在前十六个目录(文件夹)中除存放了各章所介绍的算法示例C++源程序文件,还包括几个VC++6.0工程所需要的文件,读者可以不用去动它们。在每一个ChapXX目录(文件夹)下,还有一个目录(文件夹):debug,该目录(文件夹)中存放了ChapXX所对应的章中所有算法C++源程序生成的可执行文件和这些程序运行后生成的结果数据文件。除止之外,还有几个是VC++6.0工程所生成的文件,读者可以不用去动它们。 在每一个ChapXX目录(文件夹)下,包括一个这样的文件:ChapX.dsw,X表示1至16这16个阿拉伯数字之一,对应于这X章的工程。当进入到某一这样的目录(文件夹)中,用鼠标双击该文件名,就可以启动VC++6.0程序,并调用了该工程,这是最方便的一种启动VC++6.0的方法之一,下面就可以进行对C++程序的编辑、编译、连接、运行等工作了。具体的操作步骤,可以参阅有关VC++6.0的使用操作手册,或技术手册。 如果读者要自己另外建立VC++6.0的工程及相应的目录(文件夹),可以参阅VC++6.0的使用操作手册,也可阅读《计算机常用数值计算算法与程序 C++版》一书的第一章“概论”中的1.8节“Visual C++ 6.0的编译运行环境”,其中有详细说明。 最后注意,在VC++ 6.0中设置好路径,特别是include目录(文件夹)的路径,否则在编译时会出现找不到头文件的错误,使编译无法正常进行。具体的设置方法请参看本书第1章的相关内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值