后退的Euler格式
后退的Euler格式 2012-2013(1)专业课程实践论文 后退的Euler格式 姜皓缤,0818180213,R数学08-2班 一、算法理论 方程中含有导数项,这是微分方程的本质特征,也正是它难以求解的症结所在,数值解法的关键在于设法消退其导数项,这项手续称为离散化。由于差分是微分的近似运算,实现离散化的基本途径之一是干脆用差商替代导数。譬如,若在点列出方程 , 并用差商近似替代其中的导数,结果有 。 设的近似值已知,用它代入上式右端进行计算,并取计算结果作为y()的近似值,这就是Euler格式。 对于在点列出的方程(5.1.1),有 , 若用向后差商替代导数,则可将上式离散化得 , 即 , 此为后退的Euler格式。 二、算法框图 输出 起先 h=(b-a)/n;x[0]=x0;y[0]=y0 输入区间个数n,区间范围x0,xn,初始值y0 x[i+1]=x[i]+h; y[i+1]=y[i]+hf(x[i]+h,y[i]+hf(x[i],y[i])) 否 是 三、算法程序 #include #include float func(float x,float y) { return(y-x); } euler(float x0,float xn,float y0,int N) { float x,y,yp,yc,h; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i<=N;i++) { yp=y+h*func(x,y); x=x0+i*h; yc=y+h*func(x,yp); y=yc; printf(“y(%f)=%6.4f\n“,x,y); } } main() { float x0,xn,y0,e; int n; printf(“\n n:\n “); scanf(“%d“, printf(“ x0,xn:\n “); scanf(“%f,%f“, printf(“ y0:\n “); scanf(“%f“, euler(x0,xn,y0,n); } 四、算法实现 例1 运用后退公式,求一阶常微分方程初值问题 的数值解,,变更步长的大小,比较收敛的速度。 解: (1) 显示输出初值n,输入10回车 (2) 显示输入x的范围x0, xn,输入0,1回车 (3) 显示输入y0,输入1 回车 (4) 显示结果 例题2:用后退的Euler公式求解初值问题 解: (5) 显示输出初值n,输入10回车 (6) 显示输入x的范围x0, xn,输入1 ,6回车 (7) 显示输入y0,输入20 回车 (8) 显示结果 6 / 6