我很擅长用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;
}
答案 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)
}