数值计算课程设计经典四阶龙格库塔法解一阶微分方程.doc
《数值计算课程设计经典四阶龙格库塔法解一阶微分方程.doc》由会员分享,可在线阅读,更多相关《数值计算课程设计经典四阶龙格库塔法解一阶微分方程.doc(40页珍藏版)》请在沃文网上搜索。
1、数值计算课程设计1、 经典四阶龙格库塔法解一阶微分方程1.1、 算法说明龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。4阶龙格-库塔方法(RK4)可模拟N=4的泰勒方法的精度。这种算法可以描述为,自初始点开始,利用下面的计算方法生成近似序列(1-1)1.2、 经典四阶龙格库塔法解一阶微分方程算法流程图图1-1 经典四阶龙格库塔法解一阶微分方程算法流程图1.3、 经典四阶龙格库塔法解一阶微分方程程序调试图1-2 经典四阶龙格库塔法解一阶微分方程程序调试1.4、
2、经典四阶龙格库塔法解一阶微分方程代码#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, int step ) double k1,k2,k3,k4,result; double h=(xn-x0)/step; if(step=0) return(y0); if(step=1) k1=f(x0,y0); k2=f(x0+h/2, y0
3、+h*k1/2); k3=f(x0+h/2, y0+h*k2/2); k4=f(x0+h, y0+h*k3); result=y0+h*(k1+2*k2+2*k3+k4)/6; else double x1,y1; x1=xn-h; y1=Runge_Kuta(f, x0, y0, xn-h,step-1); k1=f(x1,y1); k2=f(x1+h/2, y1+h*k1/2); k3=f(x1+h/2, y1+h*k2/2); k4=f(x1+h, y1+h*k3); result=y1+h*(k1+2*k2+2*k3+k4)/6; return(result);int main()do
4、uble f(double x, double y); double x0,y0; double a,b;/ int step; coutx0y0; coutab; /double x0=0,y0=1; double x,y,step; int i; coutstep; /step=0.1; cout.precision(10); for(i=0;i=(b-a)/step;i+)x=x0+i*step; coutsetw(8)xsetw(18)Runge_Kuta(f,x0,y0,x,i)endl; return(0); double f(double x, double y) double
5、r; r=(x-y)/2; return(r); 2、 高斯列主元法解线性方程组2.1、 算法说明首先将线性方程组做成增光矩阵,对增广矩阵进行行变换。对第元素,在第i列中,第i行及以下的元素选取绝对值最大的元素,将该元素最大的行与第i行交换,然后采用高斯消元法将新得到的消去第i行以下的元素。一次进行直到。从而得到上三角矩阵。再对得到的上三角矩阵进行回代操作,即可以得到方程组的解。2.2、 高斯列主元算法流程图i=0;j=0NY开始输入未知数个数mim*(m+1)max j=i:max=|*(head+(m+1)*i+i)|;kmaxmax =|*(head+(m+1)*k+i)|;max i=
6、k;NYYKmK=k+1;YNmax i!=itemp=*(head*(m+1)*i+k);*(head*(m+1)*i+k)=*(head*(m+1)*max i+k)*(head*(m+1)*max i+k)=tempk=0N- 39 -k=m+1Y NYi!=jk=0*(head*(m+1)*i+k)=*(head+(m+1)*j+k)*(head*(m+1)*j+i) *(head*(m+1)* i+k)/(*head+(m+1)*i+i)k=m+1YNj=j+1YjmYNi=0NY结束*(head+(m+1)*i+m)=*(head+(m+1)*i+m)/(*head+(m+1)*i
7、+m);i=i+1;图2-1 算法流程图输出*(head+(m+1)*i+m)jm2.3、 高斯列主元程序调试对所编写的高斯列主元程序进行编译和链接,然后执行得如下所示的窗口,我们按命令输入增广矩阵的行数为3,输入3行5列的增广矩阵,运行界面为:图2-2 高斯列主元程序调试2.4、 高斯列主元算法代码#include #includeusing namespace std;void load();const N=20;float aNN;int m;int main()int i,j;int c,k,n,p,r;float xN,lNN,s,d;coutm;coutendl;cout请按顺序输
8、入增广矩阵a:endl;load();for(i=0;im;i+) for(j=i;jfabs(aii)?j:i; /*找列最大元素*/for(n=0;nm+1;n+) s=ain; ain=acn; acn=s; /*将列最大数防在对角线上*/for(p=0;pm+1;p+)coutaipt;coutendl;for(k=i+1;km;k+) lki=aki/aii; for(r=i;r=0;i-) d=0;for(j=i+1;jm;j+)d=d+aij*xj;xi=(aim-d)/aii;cout该方程组的解为:endl;for(i=0;im;i+)coutxi=xit; /system(
9、pause); return 0; void load()int i,j;for(i=0;im;i+)for(j=0;jaij;3、 牛顿法解非线性方程组3.1、 算法说明设已知。第1步:计算函数 (3-1)第2步:计算雅可比矩阵 (3-2)第3步:求线性方程组 的解。第4步:计算下一点 (3-3)重复上述过程。3.2、 牛顿法解非线性方程组算法流程图图3-1 算法流程图3.3、 牛顿法解非线性方程组算法程序调试图3-2牛顿法解非线性方程组算法程序调试应用本程序解方程组, 初始近似值x0,y0分别为2.00和0.25,经过3次迭代求出X(1)=1.900691和X(2)=0.311213。图3
10、-2牛顿法解非线性方程组算法程序运行结果3.4、 牛顿法解非线性方程组算法程序代码#include#include#define N 2 / 非线性方程组中方程个数、未知量个数 #define epsilon 0.0001 / 差向量1范数的上限#define max 10 /最大迭代次数using namespace std;const int N2=2*N;int main()void ff(float xxN,float yyN);void ffjacobian(float xxN,float yyNN);void inv_jacobian(float yyNN,float invNN)
11、;void newdim(float x0N, float invNN,float y0N,float x1N);float x0N=2.0,0.25,y0N,jacobianNN,invjacobianNN,x1N,errornorm;int i,iter=0;cout初始解向量:endl;for (i=0;iN;i+) coutx0i ; coutendl;do iter=iter+1;cout第 iter 次迭代开始:endl;/jis uan xiang liang han shu zhi-yin bian liang xiang liang y0ff(x0,y0);/jis uan
12、jacobian ju zhen jacobianffjacobian(x0,jacobian);/jis uan jacobian ju zhen de ni juzhen invjacobianinv_jacobian(jacobian,invjacobian);/you jie xiang liang x0 ji suan jie xiang liang x1newdim(x0, invjacobian,y0,x1);/ji suan cha xiang liang de 1 fan shuerrornorm=0;for (i=0;iN;i+) errornorm=errornorm+f
13、abs(x1i-x0i);if (errornormepsilon) break;for (i=0;iN;i+)x0i=x1i; while (itermax);return 0;void ff(float xxN,float yyN) float x,y; int i; x=xx0;y=xx1;/非线性方程组yy0=x*x-2*x-y+0.5;yy1=x*x+4*y*y-4; cout因变量向量:endl;for( i=0;iN;i+) coutyyi ; coutendl; coutendl;void ffjacobian(float xxN,float yyNN)float x,y;in
14、t i,j;x=xx0;y=xx1;yy00=2*x-2;yy01=-1;yy10=2*x;yy11=8*y;cout雅克比矩阵: endl;for( i=0;iN;i+)for(j=0;jN;j+) coutyyij ; coutendl;coutendl;void inv_jacobian(float yyNN,float invNN)float augNN2,L; int i,j,k; cout计算雅克比矩阵的逆: endl; for (i=0;iN;i+)for(j=0;jN;j+) augij=yyij; for(j=N;jN2;j+) if(j=i+N) augij=1; else
15、 augij=0; for (i=0;iN;i+)for(j=0;jN2;j+) coutaugij ; coutendl;coutendl;for (i=0;iN;i+) for (k=i+1;kN;k+)L=-augki/augii; for(j=i;jN2;j+) augkj=augkj+L*augij;for (i=0;iN;i+)for(j=0;jN2;j+) coutaugij ; coutendl;cout0;i-) for (k=i-1;k=0;k-)L=-augki /augii; for(j=N2-1;j=0;j-) augkj=augkj+L*augij;for (i=0
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 计算 课程设计 经典 四阶龙格库塔法解 一阶 微分方程