首先给出改进的Euler法的公式:
然后对算法进行分析,在数值书上171面上的例3,题目是{ y'=-y+x+1, y(0)=1}第一个是变化率:dy/dx,取h=0.1,计算至x=0.5:
书上给出的解答: 显然: f(x,y)=x-y+1, a=x0=0,b=0.5,y0=1,n=5. 然而我完全看不懂怎么算出来的,总之这是根据已知条件推出隐藏条件,然后触发主任务完成的条件.然后把隐藏条件a,,b,y0,n,输入,对着公式转化成算法,那么主线任务就完成了.下面给出代码:
/********************************************
> File Name: Euler.c
> Author:chendiyang
> School:WUST_CST_1501班
> Myblog:www.chendsir.com
> Mail:1441353519@qq.com
> Created Time: 2017年05月7日 星期日 17时22分08秒
************************************************************************/
#include <stdio.h>
#include <math.h>
double f(double x, double y) //dy/dx=f(x,y),书上171面y'=-y+x+1
{
return -y + x + 1;
}
int main()
{
int m;
int i;
double a, b, y0;
double xn, yn, xnl, ynl, ynlb;
double h, tmp;
printf("请输入区间的上下限a,b的值:");
scanf("%lf%lf", &a, &b);
printf("请输入y0的值:");
scanf("%lf", &y0);
printf("请输入m来把区间分成m等份:");
scanf("%d", &m);
if (m <= 0)
{
printf("请输入大于1的数\n");
return 1;
}
h = (b - a) / m;
xn = a;
yn = y0;
for (i = 1; i <= m; i++)
{
xnl = xn + h;
ynlb = yn + h * f(xn, yn);
ynl = yn + h / 2 * (f(xn, yn) + f(xnl, ynlb));
printf("x%d=%lf,y%d=%lf\n", i, xnl, i, ynl);
xn = xnl;
yn = ynl;
}
return 0;
}
运行结果: