计算方法第七章上机报告

合集下载

计算方法上机实验报告

计算方法上机实验报告

《计算方法》上机实验报告班级:XXXXXX小组成员:XXXXXXXXXXXXXXXXXXXXXXXXXXXX任课教师:XXX二〇一八年五月二十五日前言通过进行多次得上机实验,我们结合课本上得内容以及老师对我们得指导,能够较为熟练地掌握Newton迭代法、Jacobi迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法与Gauss 求积公式等六种算法得原理与使用方法,并参考课本例题进行了MATLAB程序得编写。

以下为本次上机实验报告,按照实验内容共分为六部分.实验一:一、实验名称及题目:Newton迭代法例2、7(P38):应用Newton迭代法求在附近得数值解,并使其满足、二、解题思路:设就是得根,选取作为初始近似值,过点做曲线得切线,得方程为,求出与轴交点得横坐标,称为得一次近似值,过点做曲线得切线,求该切线与轴得横坐标称为得二次近似值,重复以上过程,得得近似值序列,把称为得次近似值,这种求解方法就就是牛顿迭代法。

三、Matlab程序代码:function newton_iteration(x0,tol)syms z %定义自变量formatlong%定义精度f=z*z*z-z-1;f1=diff(f);%求导y=subs(f,z,x0);y1=subs(f1,z,x0);%向函数中代值x1=x0-y/y1; k=1;whileabs(x1—x0)〉=tolx0=x1;y=subs(f,z,x0);y1=subs(f1,z,x0);x1=x0-y/y1;k=k+1;endx=double(x1)K四、运行结果:实验二:一、实验名称及题目:Jacobi迭代法例3、7(P74):试利用Jacobi迭代公式求解方程组要求数值解为方程组得精确解、二、解题思路:首先将方程组中得系数矩阵分解成三部分,即:,为对角阵,为下三角矩阵,为上三角矩阵。

之后确定迭代格式,,(, 即迭代次数),称为迭代矩阵。

计算方法上机实验报告-MATLAB

计算方法上机实验报告-MATLAB

《计算方法》实验报告指导教师:学院:班级:团队成员:一、题目例2.7应用Newton 迭代法求方程210x x --=在1x =附近的数值解k x ,并使其满足8110k k x x ---<原理:在方程()0f x =解的隔离区间[],a b 上选取合适的迭代初值0x ,过曲线()y f x =的点()()00x f x ,引切线()()()1000:'l y f x f x x x =+-其与x 轴相交于点:()()0100 'f x x x f x =-,进一步,过曲线()y f x =的点()()11x f x , 引切线()()()2111: 'l y f x f x x x =+-其与x 轴相交于点:()()1211 'f x x x f x =-如此循环往复,可得一列逼近方程()0f x =精确解*x 的点01k x x x ,,,,,其一般表达式为:()()111 'k k k k f x x x f x ---=-该公式所表述的求解方法称为Newton 迭代法或切线法。

程序:function y=f(x)%定义原函数y=x^3-x-1;endfunction y1=f1(x0)%求导函数在x0点的值syms x;t=diff(f(x),x);y1=subs(t,x,x0);endfunction newton_iteration(x0,tol)%输入初始迭代点x0及精度tol x1=x0-f(x0)/f1(x0);k=1;%调用f函数和f1函数while abs(x1-x0)>=tolx0=x1;x1=x0-f(x0)/f1(x0);k=k+1;endfprintf('满足精度要求的数值为x(%d)=%1.16g\n',k,x1);fprintf('迭代次数为k=%d\n',k);end结果:二、题目例3.7试利用Jacobi 迭代公式求解方程组1234451111101112115181111034x x x x ----⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪--- ⎪ ⎪ ⎪= ⎪ ⎪ ⎪--- ⎪ ⎪ ⎪---⎝⎭⎝⎭⎝⎭ 要求数值解()k X 满足()4210k --≤X X ,其中T (1,2,3,4)=X 为方程组的精确解。

(完整word版)计算方法上机报告-备份

(完整word版)计算方法上机报告-备份

计算方法上机作业报告姓名:李小盼班级:计算方法B3班学号:6230489477专业:热能工程2016年《计算方法B》上机题目一.计算机语言要求使用语言不做限制,可以使用C、C++、FORTRAN、VC、VB、C#、Matlab、PHP、JavaScript等语言。

二.实习报告内容上机题目完成后,必须交一份上机报告。

上机报告中应对每道题目包括:(1)上机题目内容;(2)详细说明实现的思想、算法依据、算法实现的结构;(3)详细完整的源程序,并附相关的注释说明;(4)给出必要的计算结果(若数据量大,则只需列出主要的数据内容),并对结果进行分析;(5)对上机中出现的问题进行分析总结;三.实习报告要求1.提供一份完整的上机报告的电子文档;然后再提供一份与电子文档对应的纸质上机报告。

2.电子文档中提供上机过程中的所有源程序、输出数据,以及可以运行的文件。

如果程序的运行环境特殊,请附上运行程序所需要的软件环境。

3.上机报告严禁抄袭,如发现有抄袭现象,所有涉及抄袭的上机报告将被以作弊处理,并按零分处理,不再另行通知。

4.上机报告电子版一、二、三班发送到邮箱:xjtujsff@,上机作业纸面作业请送到:理科楼338。

上机实习题目1.某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆。

在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。

已探测到一组等分点位置的深度数据(单位:米)如下表所示:(1)请用合适的曲线拟合所测数据点;(2)估算所需光缆长度的近似值,并作出铺设河底光缆的曲线图;解:1.1 实现思想选用曲线拟合数据点时,一方面要满足插值条件,即保证所得曲线经过以上所有数据点,另一方面也要保证曲线具有足够的“光滑性”,故这里采用三次样条插值法构造插值函数。

为构成封闭方程组,边界条件选取自然三次样条,以获得三次样条插值的关键参数M0和M n。

1.2 算法的依据以及结构三次样条插值具有较好的光滑性,可以用于对数据点的光滑拟合。

计算方法上机实验

计算方法上机实验

1.拉格朗日插值多项式,用于离散数据的拟合#include <stdio.h>#include <conio.h>#include <alloc.h>float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/{ int i,j;float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/a=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++){ a[i]=y[i];for(j=0;j<=n-1;j++)if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);return yy;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error!The value of n must in (0,20)."); getch();return 1;} if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");printf("Input xx:");scanf("%f",&xx);yy=lagrange(x,y,xx,n);printf("x=%f,y=%f\n",xx,yy);getch();}2.牛顿插值多项式,用于离散数据的拟合#include <stdio.h>#include <conio.h>#include <alloc.h>void difference(float *x,float *y,int n){ float *f;int k,i;f=(float *)malloc(n*sizeof(float));for(k=1;k<=n;k++){ f[0]=y[k];for(i=0;i<k;i++)f[i+1]=(f[i]-y[i])/(x[k]-x[i]);y[k]=f[k];}return;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");difference(x,(float *)y,n);printf("Input xx:");scanf("%f",&xx);yy=y[20];for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];printf("NewtonInter(%f)=%f",xx,yy);getch();}3.高斯列主元消去法,求解其次线性方程组第一种#include<stdio.h>#include <math.h>#define N 20int main(){ int n,i,j,k;int mi,tmp,mx;float a[N][N],b[N],x[N];printf("\nInput n:");scanf("%d",&n);if(n>N){ printf("The input n should in(0,N)!\n");getch();return 1;}if(n<=0){ printf("The input n should in(0,N)!\n");getch();return 1;}printf("Now input a(i,j),i,j=0...%d:\n",n-1); for(i=0;i<n;i++){ for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Now input b(i),i,j=0...%d:\n",n-1);for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);}if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];a[i][j]=a[mi][j];a[mi][j]=tmp;}}for(j=i+1;j<n;j++){ tmp=-a[j][i]/a[i][i];b[j]+=b[i]*tmp;for(k=i;k<n;k++)a[j][k]+=a[i][k]*tmp;}}x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ x[i]=b[i];for(j=i+1;j<n;j++)x[i]-=a[i][j]*x[j];x[i]/=a[i][i];}for(i=0;i<n;i++)printf("Answer:\n x[%d]=%f\n",i,x[i]); getch();return 0;}第二种#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main(){float x[NUMBER];int r,k,i,j;char celect;clrscr();printf("\n\nUse Gauss.");printf("\n\n1.Jie please press Enter."); printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:"); for(i=1;i<=n;i++){printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);for(j=1;j<=n+1;j++) scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0){printf("\n\nIt's wrong!");message();}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k){int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k){int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message(){printf("\n\n Go on Enter ,Exit press Esc!");switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\nInput error!");message();} }}4.龙贝格求积公式,求解定积分#include<stdio.h>#include<math.h>#define f(x) (sin(x)/x)#define N 20#define MAX 20#define a 2#define b 4#define e 0.00001float LBG(float p,float q,int n){ int i;float sum=0,h=(q-p)/n;for (i=1;i<n;i++)sum+=f(p+i*h);sum+=(f(p)+f(q))/2;return(h*sum);}void main(){ int i;int n=N,m=0;float T[MAX+1][2];T[0][1]=LBG(a,b,n);n*=2;for(m=1;m<MAX;m++){ for(i=0;i<m;i++)T[i][0]=T[i][1];T[0][1]=LBG(a,b,n);n*=2;for(i=1;i<=m;i++)T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e)){ printf("Answer=%f\n",T[m][1]); getch();return ;}}}5.牛顿迭代公式,求方程的近似解#include<stdio.h>#include<math.h>#include<conio.h>#define N 100#define PS 1e-5#define TA 1e-5float Newton(float (*f)(float),float(*f1)(float),float x0 ) { float x1,d=0;int k=0;do{ x1= x0-f(x0)/f1(x0);if((k++>N)||(fabs(f1(x1))<PS)){ printf("\nFailed!");getch();exit();}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\n",k,x0);}while((fabs(d))>PS&&fabs(f(x1))>TA) ;return x1;}float f(float x){ return x*x*x+x*x-3*x-3; }float f1(float x){ return 3.0*x*x+2*x-3; }void main(){ float f(float);float f1(float);float x0,y0;printf("Input x0: ");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0);printf("\nThe root is x=%f\n",y0); getch();}。

数值计算方法上机实验报告

数值计算方法上机实验报告

数值计算方法上机实验报告
一、实验目的
本次实验的主要目的是熟悉和掌握数值计算方法,学习梯度下降法的
原理和实际应用,熟悉Python语言的编程基础知识,掌握Python语言的
基本语法。

二、设计思路
本次实验主要使用的python语言,利用python下的numpy,matplotlib这两个工具,来实现数值计算和可视化的任务。

1. 首先了解numpy的基本使用方法,学习numpy的矩阵操作,以及numpy提供的常见算法,如矩阵分解、特征值分解等。

2. 在了解numpy的基本操作后,可以学习matplotlib库中的可视化
技术,掌握如何将生成的数据以图表的形式展示出来。

3. 接下来就是要学习梯度下降法,首先了解梯度下降法的主要原理,以及具体的实际应用,用python实现梯度下降法给出的算法框架,最终
可以达到所期望的优化结果。

三、实验步骤
1. 熟悉Python语言的基本语法。

首先是熟悉Python语言的基本语法,学习如何使用Python实现变量
定义,控制语句,函数定义,类使用,以及面向对象编程的基本概念。

2. 学习numpy库的使用方法。

其次是学习numpy库的使用方法,学习如何使用numpy库构建矩阵,学习numpy库的向量,矩阵操作,以及numpy库提供的常见算法,如矩阵分解,特征值分解等。

3. 学习matplotlib库的使用方法。

计算方法上上机实习报告

计算方法上上机实习报告

计算方法上上机实习报告在本次计算方法的上机实习中,我深入体验了数值计算的魅力和挑战,通过实际操作和实践,对计算方法有了更深刻的理解和认识。

实习的目的在于将课堂上学到的理论知识运用到实际的计算中,熟悉各种数值算法的实现过程,提高编程能力和解决实际问题的能力。

我们使用了具体编程语言和软件名称进行编程和计算。

在实习过程中,我首先接触到的是数值逼近的相关内容。

通过多项式插值和曲线拟合的练习,我明白了如何用简单的函数去近似复杂的曲线。

例如,拉格朗日插值法和牛顿插值法让我能够根据给定的离散数据点构建出一个连续的函数,从而对未知点进行预测。

在实际操作中,我需要仔细处理数据的输入和输出,以及算法中的细节,如边界条件和误差控制。

数值积分是另一个重要的部分。

通过梯形公式和辛普森公式,我学会了如何对给定的函数进行数值积分。

在编程实现时,要合理地选择积分区间和步长,以达到所需的精度。

同时,我也了解到了数值积分方法的误差来源和误差估计方法,这对于评估计算结果的可靠性非常重要。

线性方程组的求解是计算方法中的核心内容之一。

我分别使用了高斯消元法和迭代法(如雅克比迭代法和高斯赛德尔迭代法)来求解线性方程组。

在实际编程中,我深刻体会到了算法的效率和稳定性的重要性。

对于大规模的线性方程组,选择合适的算法可以大大提高计算速度和精度。

在非线性方程求根方面,我运用了二分法、牛顿法和割线法等方法。

这些方法各有特点,二分法简单但收敛速度较慢,牛顿法收敛速度快但需要计算导数。

在实际应用中,需要根据方程的特点和求解的要求选择合适的方法。

在实习中,我也遇到了不少问题和挑战。

首先是编程中的错误,如语法错误、逻辑错误等,这需要我耐心地调试和修改代码。

其次,对于一些复杂的算法,理解其原理和实现细节并不容易,需要反复查阅资料和思考。

还有就是数值计算中的误差问题,有时候由于误差的积累,导致计算结果与预期相差较大,需要通过调整算法参数或者采用更精确的算法来解决。

现代数值计算上机实验报告资料

现代数值计算上机实验报告资料

太原科技大学现代数值计算方法上机报告院系:华科学院专业年级:计算机科学与技术学生姓名:张栩嘉学号:201522030129指导教师:2017年5月12日数值计算方法上机实习题1. 设⎰+=105dx xx I nn , (1) 由递推公式nI I n n 151+-=-,从0I 的几个近似值出发,计算20I ; (2) 粗糙估计20I ,用nI I n n 51511+-=-,计算0I ; (3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。

%上机习题1 %(1) I=0.182; for n=1:20I=(-5)*I+1/n; endfprintf('I20 的值是 %e\n',I); %(2)I=0.0087; for n=1:20I=(-1/5)*I+1/(5*n); endfprintf('I0 的值是 %f\n',I);3) 现象产生的原因:假设S n 的真值为S n ∗,误差为εn ,即εn =S n ∗−S n 对于真值,我们也有关系式S n ∗+5S n−1∗=1n 综合两个递推公式有εn =−5εn−1 这就意味着哪怕开始只有一点点误差,只要n 足够大,按照这种每计算一步误差增长5倍的方式,所得结果总是不可信的。

因此整个算法是不稳定的。

对于第二种方法 εn =−15εn−1 误差会以每计算一步缩小到1/5的方式进行,所以以这种方法计算的结果是可靠的,整个算法是稳定的。

2. 求方程0210=-+x e x的近似根,要求41105-+⨯<-k k x x ,并比较计算量。

(1) 在[0,1]上用二分法; (2) 取初值00=x ,并用迭代1021x k e x -=+;(3) 加速迭代的结果;(4) 取初值00=x ,并用牛顿迭代法; (5) 分析绝对误差。

%(1)在[0,1]上用二分法;a=0;b=1.0;ci=0;while abs(b-a)>5*1e-4c=(b+a)/2;ci=ci+1;if exp(c)+10*c-2>0b=c;else a=c;endendfprintf('二分法求得 c 的值是 %f\t',c);fprintf('迭代次数是 %d\n',ci);%(2)不动点迭代法,x=0;a=1;ci=0;while abs(x-a)>5*1e-4a=x;x=(2-exp(x))/10;ci=ci+1;endfprintf('不动点迭代求得 x 的值是 %f\t',x); fprintf('迭代次数是 %d\n',ci);%(3)艾特肯加速迭代x=0;a=0;b=1;ci=0;while abs(b-a)>5*1e-4a=x;y=exp(x)+10*x-2;z=exp(y)+10*y-2;x=x-(y-x)^2/(z-2*y+x);b=x;ci=ci+1;endfprintf('艾特肯加速迭代求得 x 的值是 %f\t',x); fprintf('迭代次数是 %d\n',ci);%(4)用牛顿迭代法x=0;a=0;b=1;ci=0;while abs(b-a)>5*1e-4a=x;x=x-(exp(x)+10*x-2)/(exp(x)+10);b=x;ci=ci+1;endfprintf('牛顿迭代法求得 x 的值是 %f\t',x); fprintf('迭代次数是 %d\n',ci); %(5)分析绝对误差solve('exp(x)+10*x-2=0'); fprintf('x 的真值是%.8f',x);运行结果:二分法求得 c 的值是 0.090332 迭代次数是 11 绝对为误差为0.000193 不动点迭代求得 x 的值是 0.090513 迭代次数是 4 绝对为误差为0.000012 艾特肯加速迭代求得 x 的值是 0.099488 迭代次数是 3 绝对为误差为0.008963 牛顿迭代法求得 x 的值是 0.090525 迭代次数是 2 绝对为误差为0.000000 x 的真值是0.090525>>分析可知加速迭代绝对误差最大,二分法次之,牛顿法和不动点法迭代效果最好。

东南大学计算方法上机报告实验报告完整版

东南大学计算方法上机报告实验报告完整版

实习题11. 用两种不同的顺序计算644834.11000012≈∑=-n n,试分析其误差的变化解:从n=1开始累加,n 逐步增大,直到n=10000;从n=10000开始累加,n 逐步减小,直至1。

算法1的C 语言程序如下: #include<stdio.h> #include<math.h> void main() { float n=0.0; int i; for(i=1;i<=10000;i++) { n=n+1.0/(i*i); } printf("%-100f",n); printf("\n"); float m=0.0; int j; for(j=10000;j>=1;j--) { m=m+1.0/(j*j); } printf("%-7f",m); printf("\n"); }运行后结果如下:结论: 4.设∑=-=Nj N j S 2211,已知其精确值为)11123(21+--N N 。

1)编制按从大到小的顺序计算N S 的程序; 2)编制按从小到大的顺序计算N S 的程序;3)按2种顺序分别计算30000100001000,,S S S ,并指出有效位数。

解:1)从大到小的C语言算法如下:#include<stdio.h>#include<math.h>#include<iostream>using namespace std;void main(){float n=0.0;int i;int N;cout<<"Please input N"<<endl;cin>>N;for(i=N;i>1;i--){n=n+1.0/(i*i-1);N=N-1;}printf("%-100f",n);printf("\n");}执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:N=4000时,运行结果为:2)从小到大的C语言算法如下:#include<stdio.h>#include<math.h>#include<iostream>using namespace std;void main(){float n=0.0;int i;int N;cout<<"Please input N"<<endl;cin>>N;for(i=2;i<=N;i++){n=n+1.0/(i*i-1);}printf("%-100f",n);printf("\n");}执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:N=4000时,运行结果为:结论:通过比较可知:N 的值较小时两种算法的运算结果相差不大,但随着N 的逐渐增大,两种算法的运行结果相差越来越大。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告名称求解常微分方程
班级:020991 学号:02099037 姓名:杜凡成绩:
1实验目的
1)熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉法、四阶龙格-库塔法与阿当姆斯方法。

2)会变质上述方法的计算程序,包括求解常微分方程组的计算程序。

3)通过对各种求解方法的计算实习,体会各种解法的功能、优缺点及适用场合,会选取适当的求解方法。

2 实验内容
实习题7.1用改进欧拉法与四阶龙格-库塔公式求解所给微分方程初值问题;
7.2 用四阶龙格-库塔公式解下列微分方程初值问题;
7.3用阿当姆斯方法解微分方程初值问题;
3实验步骤
7.1
1)根据改进欧拉法的算法编写改进欧拉法求微分方程的函数
// 实验环境的配置,例如添加什么函数,库,头文件等,以及你的思路都可以写。

3 程序设计
// 程序流程图、代码。

以下均用matlab编写
1)改进欧拉法
function Heun2(f,a,b,y0,n)
h=(b-a)/n;
x=a:h:b;
%ytrue=f1(-1*x);
y=y0*ones(1,n+1);
for j=2:n+1
yp=y(j-1)+h*f(x(j-1),y(j-1));
yc=y(j-1)+h*f(x(j),yp);
y(j)=(yp+yc)/2;
end
for i=1:n+1
fprintf('x[%d]=%f\t y[%d]=%f\n',i-1,x(i),i-1,y(i));
%fprintf('x[%d]=%f\t y[%d]=%f\t ytrue[%d]=%f\n',i-1,x(i),i-1,y(i),i-1,%ytrue(i));
end
4实验结果及分析
// 程序运行的结果,可以添加截图以说明问题。

7.1
1)改进欧拉法
2)四阶龙格库塔公式解方程组3)阿当姆斯方法解方程
//实验结果分析,包括误差分析和结论。

2)实验结果分析
改进欧拉公式的局部截断误差O(h^3),h=0.1,则绝对误差e<1.0*10^2.
四阶龙格库塔方法的局部截断误差为O(h^5),h=0.1,则绝对误差e<1.0*10^4.
阿当姆斯方法的局部截断误差为O(h^5),h=0.1,则绝对误差e<1.0*10^4.
5总结
// 通过本实验掌握的内容,以及在实验中遇到的问题及解决方法。

通过本实验,掌握了求解常微分方程的几种方法,包括改进欧拉法,四阶龙格库塔方法与阿当姆斯方法,并且学会了编制上述方法的程序,了解了各种解法的适用场合。

6参考资料
// 学习相关理论、编写程序及为了完成实验查阅的书籍和文献
// 英文参考文献格式
// 期刊
// [序号] 主要责任者. 文献题名[J]. 刊名, 年, 卷(期): 起止页码.
// 专著、论文集、学位论文、报告
// [序号] 主要责任者. 文献题名[文献类型标识]. 出版地: 出版者, 出版年. 起止页码.。

相关文档
最新文档