vsrk4.c

来自「数值方法求解常微分方程的C实现[TEXT为主程序,其余方法(即C文件)放入Inc」· C语言 代码 · 共 55 行

C
55
字号
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern double f( double x, double y );
extern double Y_initial;
extern int N;
void vsrk4(double x_min, double x_max, double y[])
{
double rk4( double x, double y, double hh );
int i,k,j;
double xx,h,yn,ynh,delta;
double x[51];
static double hmin=0.0005; 
static double hmax=0.1;
static double eps=1.e-8;
h=hmax;
xx=x_min;
i=0;
x[0]=xx;
y[0]=Y_initial;
while( xx < x_max )
  {
again:  if( xx+h > x_max ) h=x_max-xx;
  yn=rk4(xx,y[i],h);
  ynh=rk4(xx,y[i],h/2.0);
  ynh=rk4(xx+h/2.0,ynh,h/2.0);
  delta=fabs((yn-ynh)/15.0);
  if( ( delta < eps )||( h == hmin ) )
    {
    xx=xx+h;
    i=i+1;
    x[i]=xx;
    y[i]=ynh;
    if( i >=50 ) goto endd;
    if( delta < 0.05*eps )
      {
      h=2.0*h;
      if( h > hmax ) h=hmax;
      }
    }
  else
    {
    h=h/2.0;
    if( h < hmin ) h=hmin;
    goto again;
    }
  }
endd:k=i;
printf("     xn           yn\n");
for(j=0;j<=k;j++)
   printf("%12.8f %12.8f\n",x[j],y[j]);
getch();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?