1、数值计算课程设计 1 典型数值算法的典型数值算法的 C+C+语言程序设计语言程序设计 1 1. .经典四阶龙格库塔法解一阶微分方程组经典四阶龙格库塔法解一阶微分方程组 1.11.1 算法说明算法说明 龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。 由于 此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建 在数学支持的基础之上的。 4 阶龙格-库塔方法(RK4)可模拟 N=4 的泰勒方法的精度。这种算法可以描述为,自初 始点 00 (,)ty开始,利用下面的计算方法生成近似序列 1.21.2 经典四阶龙格库塔法解一阶微分方程组经典四阶龙格
2、库塔法解一阶微分方程组算法流程图算法流程图 图 1-1 算法流程图 经典四阶龙格库塔法解一阶微分方程组 2 1.31.3 经典四阶龙格库塔法解一阶微分方程组经典四阶龙格库塔法解一阶微分方程组程序调试程序调试 将编写好的代码放在 VC6.0 环境中编译,直接执行程序便可以得到求解微分方程 () / 2 dy ty dt ,并且(0)1y的结果。如图: 将这些点进行插值或者拟合后就可以得到微分方程的解。 1.41.4 经典四阶经典四阶龙格库塔法解一阶微分方程组龙格库塔法解一阶微分方程组代码代码 #include #include using namespace std; /f 为函数的入口地址,x
3、0、y0 为初值,xn 为所求点,step 为计算次数 double Runge_Kuta( double (*f)(double x, double y), double x0, double y0, double xn, long step ) double k1,k2,k3,k4,result; double h=(xn-x0)/step; if(stepx0y0; coutb; /double x0=0,y0=1; double x,y,step; long i; coutN; A=(double*)calloc(N*(N+1),sizeof(double); coutAi; syst
4、em(“cls“); coutPi; coutepsilon; cinerr; iter=newdim(P,delta,epsilon,max1, coutn; coutXi; coutYi; coutn; A=(double*)malloc(n*sizeof(double); B=(double*)malloc(n*sizeof(double); coutAi; cout=0;i-) Bi=Ai+c*Bi+1; cout=0;i-) if(i=0) cout“+“setprecision(2)Aiendl; 图 9-2 程序调试图 数值计算课程设计 31 else cout“+“setpre
5、cision(2)Ai“*x“iendl; cout“n 当 x=“c“时的解为 P(x)=“B0endl; free(A); free(B); getchar(); 10. 10. 牛顿牛顿- -拉弗森迭代解非线性方程拉弗森迭代解非线性方程 10.110.1 算法说明算法说明 使用初始近似值 0 P,利用迭代 1 1 1 () () k kk k fP PP fP 其中1, 2,.k 计算函数()0fx的根的 近似值。 10.210.2 牛顿牛顿- -拉弗森迭代解非线性方程算法拉弗森迭代解非线性方程算法程序调试程序调试 我们将所编写的牛顿-拉弗森迭代解非线性方程算法程序经过编译, 链接和执行
6、后得如下 所示的结果 10.310.3 牛牛顿顿- -拉弗森迭代解非线性方程算法拉弗森迭代解非线性方程算法代码代码 #include #include using namespace std; double f(double x) return x*x-2*x-1; 图 10-1 程序调试图 牛顿-拉弗森迭代解非线性方程 32 double df(double x) return 2*x-2; void main() int k=0,max1=0; double p1=0.0,p0=0.0,err=0.0,relerr=0.0,delta=0.0,y=0.0,epsilon=0.0; cout“牛顿拉弗森法解非线性方程 f(x)=x2-2x-1n“; cout“初始值为 p0=4.8n“; /对程序进行初始化 p0=4.8,delta=0.0001,epsilon=0.0001,max1=100; for(k=1;k=