数值分析实验实验指导书四
理学院实验中心 数学专业实验室编写
实验四 常微分方程初值问题数值解法
【实验类型】验证性 【实验学时】2 【实验内容】
科学计算中经常遇到微分方程(组)初值问题,需要利用Euler法,改进Euler法,Rung-Kutta方法求其数值解,诸如以下问题:
??4x?xy?y?y??y(0)?1?0?x?2
分别取h=0.1,0.2,0.4时数值解。 初值问题的精确解y?4?3e?x。
2【实验前的预备知识】
1、 熟悉各种初值问题的算法;
2、 明确各种算法的精度与所选步长有密切关系; 3、 通过计算更加了解各种算法的优越性。 【实验方法或步骤】
1、 根据初值问题数值算法,编程计算;
2、 试分别取不同步长,考察某节点xj处数值解的误差变化情况; 3、 试用不同算法求解某初值问题,结果有何异常; 4、 分析各个算法的优缺点。 【Euler方法】
#include
#include
float f(float x,float y)
{return(4*x / y-x*y);}
void Euler(float x0,float xn,float y0,int n) {int i;
float x=x0,y=y0,h=(xn-x0)/n; printf(\ for(i=1;i<=n;i++) {y=y+h*f(x,y); x=x0+i*h; printf(\ }} main() {int i,n; float x0,xn,y0; printf(\ scanf(\ printf(\ scanf(\ do {printf(\ scanf(\ } while(n<=1); Euler(x0,xn,y0,n); scanf(\
【Rung-Kutta方法】
#include
int m; int i;
double a,b,y0; double xn,yn,yn1; double k1,k2,k3,k4; double h;
printf(\scanf(\
printf(\scanf(\
printf(\scanf(\if(m<=0) {
printf(\return 1; }
h=(b-a)/m; xn=a;yn=y0;
for(i=1;i<=m;i++) {
k1=f(xn,yn);
k2=f((xn+h/2),(yn+h*k1/2)); k3=f((xn+h/2),(yn+h*k2/2)); k4=f((xn+h),(yn+h*k3));
yn1=yn+h/6*(k1+2*k2+2*k3+k4);
xn+=h;
printf(\yn=yn1; }
scanf(\

