1、数值计算课程设计 1 课程设计报告课程设计报告 题目:题目:牛顿法解非线性方程组牛顿法解非线性方程组 经典四阶龙格库塔法解一阶微分方程组 2 典型数值算法的典型数值算法的 C+C+语言程序设计语言程序设计 1 1. .经典四阶龙格库塔法解一阶微分方程组经典四阶龙格库塔法解一阶微分方程组 1.11.1 算法说明算法说明 龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。 由于 此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建 在数学支持的基础之上的。 4 阶龙格-库塔方法(RK4)可模拟 N=4 的泰勒方法的精度。这种算法可以描述为,自初
2、始点 00 (,)ty开始,利用下面的计算方法生成近似序列 1.21.2 经典四阶龙格库塔法解一阶微分方程组经典四阶龙格库塔法解一阶微分方程组算法流程图算法流程图 图 1-1 算法流程图 数值计算课程设计 3 1.31.3 经典四阶龙格库塔法解一阶微分方程组经典四阶龙格库塔法解一阶微分方程组程序调试程序调试 将编写好的代码放在 VC6.0 环境中编译,直接执行程序便可以得到求解微分方程 () / 2 dy ty dt ,并且(0)1y的结果。如图: 将这些点进行插值或者拟合后就可以得到微分方程的解。 1.41.4 经典四阶龙格库塔法解一阶微分方程组经典四阶龙格库塔法解一阶微分方程组代码代码 #
3、include #include using namespace std; /f 为函数的入口地址,x0、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; couttol) h
4、=h/2; s=0; for(p=1;p=0;i-) if(i=0) printf(“%+.3lfn“,Ci); else printf(“%+.3lf*x%d“,Ci,i); getchar(); 7.7.二分法解非线性二分法解非线性方程方程 7.17.1 算法说明算法说明 1. . 00 ,ab是起始区间, 000 () / 2cab是中点。 2. 11 ,ab是第二个区间, 它包含零点 r, 同时 1 c是中点, 区间的宽度范围是 00 ,ab的 一半。 3.得到第 n 个区间, nn ab(包含 r,并有中点 n c)后,可构造出 11 , nn ab ,它也包 括 r,宽度范围是,
5、nn ab的一半。 数值计算课程设计 25 7 7. .2 2 二分法解非线性方程二分法解非线性方程算法流程图算法流程图 7.37.3 二分法解非线性方程二分法解非线性方程算法程序调试算法程序调试 我们将所编写的二分法算法程序经过编译,链接和执行后得所下结果 7 7. .4 4 二分法解非线性方程二分法解非线性方程算法代码算法代码 #include #define eps 1e-10 double f(double x) return 3*x*x*x+5; 图 7-1 算法流程图 图 7-2 程序调试图 不动点法解非线性方程 26 void main() double ga=0.0,gb=0.
6、0,gc=0.0,a=0.0,b=0.0,c=0.0; printf(“用二分法寻找方程 3*x3+5=0 的根n“); printf(“求根区间为(-5,5)n“); a=-5,b=5; ga=f(a); gb=f(b); while(b-a)eps) c=(a+b)/2; gc=f(c); if(gc=0) break; else if(gc*gb=0;i-) scanf(“%lf“, printf(“请输入 X 的值:“); scanf(“%lf“, Bn-1=An-1; for(i=n-2;i=0;i-) Bi=Ai+c*Bi+1; printf(“对于 P(x)=“); for(i=n-1;i=0;i-) if(i=0) printf(“%+.2lfn“,Ai); else printf(“%+.2lf*x%d“,Ai,i); printf(“n 当 x=%lf 时的解为 P(x)=%lfn“,