add numerical recipes library
This commit is contained in:
52
lib/nr/ansi/recipes/rkck.c
Normal file
52
lib/nr/ansi/recipes/rkck.c
Normal file
@@ -0,0 +1,52 @@
|
||||
|
||||
#define NRANSI
|
||||
#include "nrutil.h"
|
||||
|
||||
void rkck(float y[], float dydx[], int n, float x, float h, float yout[],
|
||||
float yerr[], void (*derivs)(float, float [], float []))
|
||||
{
|
||||
int i;
|
||||
static float a2=0.2,a3=0.3,a4=0.6,a5=1.0,a6=0.875,b21=0.2,
|
||||
b31=3.0/40.0,b32=9.0/40.0,b41=0.3,b42 = -0.9,b43=1.2,
|
||||
b51 = -11.0/54.0, b52=2.5,b53 = -70.0/27.0,b54=35.0/27.0,
|
||||
b61=1631.0/55296.0,b62=175.0/512.0,b63=575.0/13824.0,
|
||||
b64=44275.0/110592.0,b65=253.0/4096.0,c1=37.0/378.0,
|
||||
c3=250.0/621.0,c4=125.0/594.0,c6=512.0/1771.0,
|
||||
dc5 = -277.00/14336.0;
|
||||
float dc1=c1-2825.0/27648.0,dc3=c3-18575.0/48384.0,
|
||||
dc4=c4-13525.0/55296.0,dc6=c6-0.25;
|
||||
float *ak2,*ak3,*ak4,*ak5,*ak6,*ytemp;
|
||||
|
||||
ak2=vector(1,n);
|
||||
ak3=vector(1,n);
|
||||
ak4=vector(1,n);
|
||||
ak5=vector(1,n);
|
||||
ak6=vector(1,n);
|
||||
ytemp=vector(1,n);
|
||||
for (i=1;i<=n;i++)
|
||||
ytemp[i]=y[i]+b21*h*dydx[i];
|
||||
(*derivs)(x+a2*h,ytemp,ak2);
|
||||
for (i=1;i<=n;i++)
|
||||
ytemp[i]=y[i]+h*(b31*dydx[i]+b32*ak2[i]);
|
||||
(*derivs)(x+a3*h,ytemp,ak3);
|
||||
for (i=1;i<=n;i++)
|
||||
ytemp[i]=y[i]+h*(b41*dydx[i]+b42*ak2[i]+b43*ak3[i]);
|
||||
(*derivs)(x+a4*h,ytemp,ak4);
|
||||
for (i=1;i<=n;i++)
|
||||
ytemp[i]=y[i]+h*(b51*dydx[i]+b52*ak2[i]+b53*ak3[i]+b54*ak4[i]);
|
||||
(*derivs)(x+a5*h,ytemp,ak5);
|
||||
for (i=1;i<=n;i++)
|
||||
ytemp[i]=y[i]+h*(b61*dydx[i]+b62*ak2[i]+b63*ak3[i]+b64*ak4[i]+b65*ak5[i]);
|
||||
(*derivs)(x+a6*h,ytemp,ak6);
|
||||
for (i=1;i<=n;i++)
|
||||
yout[i]=y[i]+h*(c1*dydx[i]+c3*ak3[i]+c4*ak4[i]+c6*ak6[i]);
|
||||
for (i=1;i<=n;i++)
|
||||
yerr[i]=h*(dc1*dydx[i]+dc3*ak3[i]+dc4*ak4[i]+dc5*ak5[i]+dc6*ak6[i]);
|
||||
free_vector(ytemp,1,n);
|
||||
free_vector(ak6,1,n);
|
||||
free_vector(ak5,1,n);
|
||||
free_vector(ak4,1,n);
|
||||
free_vector(ak3,1,n);
|
||||
free_vector(ak2,1,n);
|
||||
}
|
||||
#undef NRANSI
|
||||
Reference in New Issue
Block a user