Euler方法递归

时间:2017-05-26 19:26:42

标签: recursion differential-equations

我很擅长用C编码。 我试图以一种非常简单的方式将Eulers方法应用于一阶ODE,既可以作为迭代函数也可以作为递归函数。我无法将递归实现放在一起。

#include <stdio.h>
#include <stdlib.h>

float a,b,x,y,h,b;

float fun(float x,float y)
{
    float f;
    f=x+y;
    return f;
}

float euler (float x, float y, float h, float t){
    float k;
    while(x<=b) {
        y=y+h*fun(x,y);;
        x=x+h;
        printf("%0.3f\t%0.3f\n",x,y);
        }
    };

float euler_rec (float x, float y, float h, float b){
    if (x<=b) {
        y=euler_rec(x, y, h, b)+h*fun(x,y);
        }
    else {
        printf("%0.3f\t%0.3f\n",x,y);
        }
    };

int main()
{

    printf("\nEnter x0,y0,h,xn: ");
    scanf("%f%f%f%f",&x,&y,&h,&b);

    printf("\n  x\t  y\n");

    euler(x, y, h, b);

printf ("rec\n");
    euler_rec(x, y, h, b);


return 0;
}

1 个答案:

答案 0 :(得分:0)

我不建议在严肃的应用程序中使用数千或数千的递归深度。但是为了原理,您要尝试实现的是euler_rec(x0,y0,h,x)返回初始点x的时间(x0,y0)的解近似值。因此递归调用应该是

yprev = euler_rec(x0,y0,h,x-h);
y = yprev + h*f(x-h,yprev);

并且你必须构造递归函数的主体。

它应该等于

float euler_rec (float x0, float y0, float h, float x) {
    float y; 
    if(x > x0+h) {
        y = euler_rec(x0 ,y0 ,h , x-h); 
    } else {
        y = y0;
        h = x-x0;
    }
    return y + h * f(x-h, y); 
}

打印必须在递归之外进行,或者您还需要另一个在递归时保持不变的参数,以指示应该发生某些打印输出的x值。

当然,您也可以使用几乎不是递归的前向递归,因为任何优化编译器都会将其转换为迭代。先前的变体是先递归调用,第二次是计算。如果你先把计算放在第二位,递归调用第二次,那么方法读作

float euler_rec (float x, float y, float h, float b){
    if (x+1.01*h>=b) {
        h = b-x;
        return y + h * f(x,y); // insert print statement if you like
    } 
    return euler_rec(x+h, y+h*f(x,y),h,b)
}