Runge-Kutta method: Difference between revisions

→‎{{header|C}}: Re add (erroneously?) C example, removed with no explanation
(→‎{{header|C}}: Re add (erroneously?) C example, removed with no explanation)
Line 251:
180 LET Y=Y+.1*(K1+2*(K2+K3)+K4)/6
190 NEXT</lang>
 
=={{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 = (double *)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>
{{out}} (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|C#}}==
10,327

edits