Runge-Kutta method: Difference between revisions

Line 85:
y(9.0) = 451.56245928 Error: 4.07232E-05
y(10.0) = 675.99994902 Error: 5.09833E-05</pre>
 
=={{header|C}}==
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
double rk4(double(*f)(double, double), double dx, double x, double y)
{
double k1 = dx * f(x, y),
k2 = dx * f(x + dx / 2, y + k1 / 2),
k3 = dx * f(x + dx / 2, y + k2 / 2),
k4 = dx * f(x + dx, y + k3);
return y + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
}
 
double rate(double x, double y)
{
return x * sqrt(y);
}
 
int main(void)
{
double *y, x, y2;
double x0 = 0, x1 = 10, dx = .1;
int i, n = 1 + (x1 - x0)/dx;
y = malloc(sizeof(double) * n);
 
for (y[0] = 1, i = 1; i < n; i++)
y[i] = rk4(rate, dx, x0 + dx * (i - 1), y[i-1]);
 
printf("x\ty\trel. err.\n------------\n");
for (i = 0; i < n; i += 10) {
x = x0 + dx * i;
y2 = pow(x * x / 4 + 1, 2);
printf("%g\t%g\t%g\n", x, y[i], y[i]/y2 - 1);
}
 
return 0;
}</lang>output (errors are relative)<pre>
x y rel. err.
------------
0 1 0
1 1.5625 -9.3262e-08
2 4 -2.2987e-07
3 10.5625 -2.75462e-07
4 25 -2.49396e-07
5 52.5625 -2.05844e-07
6 100 -1.65946e-07
7 175.562 -1.33956e-07
8 289 -1.09222e-07
9 451.562 -9.01828e-08
10 676 -7.54191e-08
</pre>
 
=={{header|D}}==
Anonymous user