/*
* testrkf3.c
*/
#include <stdio.h>
#include <math.h>
#include "rkf3.h"
void myf(double t, double *x, double *f)
{
f[0] = x[1];
f[1] = - x[0];
}
int main()
{
int i, n;
double a = 0, b = 1;
double x[2], newx[2], localerror, error, diff, lastdiff, lasterror;
double k[2][RKF45_STAGE], work[2];
double h;
printf("真の値=%20.15f\n", cos(b));
printf(" n x 誤差 推定誤差\n");
for (n = 1; n <= 10000; n *= 2) {
x[0] = cos(a); x[1] = - sin(a);
h = (b - a) / n;
error = 0;
for (i = 0; i < n; i++) {
bf_rkf45(2, myf,
a + i * h, x, h, newx, &localerror,
k, work);
x[0] = newx[0];
x[1] = newx[1];
error += fabs(localerror);
}
diff = fabs(x[0] - cos(b));
printf("%5d %18.15f %7.1e %7.1e", n, x[0], diff, error);
if (n != 1) {
printf(" %4.1f分の1 %4.1f分の1", lastdiff / diff, lasterror / error);
}
printf("\n");
lastdiff = diff; lasterror = error;
}
return 0;
}