|
|
◆ Dopn1210()
| Sub Dopn1210 |
( |
N As |
Long, |
|
|
F2 As |
LongPtr, |
|
|
T As |
Double, |
|
|
Y() As |
Double, |
|
|
Yp() As |
Double, |
|
|
Tout As |
Double, |
|
|
Tend As |
Double, |
|
|
RTol() As |
Double, |
|
|
ATol() As |
Double, |
|
|
Mode As |
Long, |
|
|
Info As |
Long, |
|
|
Optional Neval As |
Long, |
|
|
Optional Nstep As |
Long, |
|
|
Optional Naccept As |
Long, |
|
|
Optional Nreject As |
Long, |
|
|
Optional MaxIter As |
Long = 0, |
|
|
Optional ErrCntl As |
Long = 0, |
|
|
Optional Cnt As |
Long = 0, |
|
|
Optional Hinit As |
Double = 0, |
|
|
Optional Hmax As |
Double = 0, |
|
|
Optional Fac1 As |
Double = 0, |
|
|
Optional Fac2 As |
Double = 0, |
|
|
Optional Safe As |
Double = 0 |
|
) |
| |
Initial value problem of ordinary differential equations (12(10)-th order Runge-Kutta-Nystrom method) (for second order differential equations)
- Purpose
- This program integrates a system of second order ordinary differential equations of the form
d2y/dt2 = f2(t, y), y = y0, y' = y'0 at t = t0
where y and y' are the n vectors and the system consists of n equations. t0, y0 and y'0 are the given initial values of t, y and y', respectively.
This program is based on the Runge-Kutta-Nystroem method of order 12(10). See for details (RKN12(10)17M) in the reference (1).
- Parameters
-
| [in] | N | Number of differential equations. (N >= 1) |
| [in] | F2 | The user supplied subroutine, which calculates the derivatives of the differential equations, defined as follows. Sub F2(N As Long, T As Double, Y() As Double, Ypp() As Double)
Compute d2y/dt2 and store in Ypp().
End Sub
where N is the number of equations, and d2y/dt2 (= f2(t, y)) is the computed second derivative at given T and Y(). |
| [in,out] | T | Independent variable t. This program integrates from the initial value of t to Tend. Depending on the setting of Mode, this program may return at Tout or every successful step to provide an intermediate result. [in] An initial value of t (t0).
[out] T = Tend if the integration has been completed. Or T = Tout or T of the latest step depending on Mode in the case of intermediate return. |
| [in,out] | Y() | Array Y(LY - 1) (LY >= N)
Dependent variable y.
[in] Initial value of y (y0) at initial t (t0).
[out] The value of y (computed numerical solution) at t = T. |
| [in,out] | Yp() | Array Yp(LYp - 1) (LYp >= N)
y', derivatives of y.
[in] Initial values of derivtive y' (y'0) at initial t (t0).
[out] The value of y' (computed numerical solution) at t = T. |
| [in] | Tout | Set Tout to the point (t) at which an intermediate result is desired in mode = 2. Tout is not referenced in Mode = 0 or 1.
In Mode 2, y at Tout is computed and returned with Info = 2. To continue the integration to get result at new Tout, it is possible to call this program again with new Tout and without changing other variables including Info.
T < Tout <= Tend is required. However, if the integration is in backward direction, Tend <= Tout < T is required. If Tend is reached before Tout, the integration is terminated immediately and T = Tend and Info = 0 is returned. |
| [in] | Tend | The point at which an integration is completed. If Tend is reached, the integration is terminated and T = Tend and Info = 0 is returned. The integration is possible for both forward (Tend > T) and backward (Tend < T) direction. |
| [in] | Rtol() | Array Rtol(LRtol - 1) (LRtol >= 1) (all elements of Rtol() >= 0)
The relative error tolerance(s) to specify how accurately compute the solution. This parameter may be a scalar or an array according to the values of LRtol and LAtol (Scalar if LRtol < N or LAtol < N, array if LRtol >= N and LAtol >= N).
Rtol is used together with Atol in a local error test at each step. The integration is performed using step sizes which are automatically selected so as to achieve the following criteria.
Scalar case (i = 0 to N - 1):
(local error) <= max(Rtol(0)*Abs(Y(i)) + Atol(0), Rtol(0)*Abs(Yp(i)) + Atol(0)) (if ErrCntl = 0)
(local error) <= Rtol(0)*Abs(Y(i)) + Atol(0) (if ErrCntl = 1)
Both Rtol(0) and Atol(0) must not be 0 at the same time.
Array case (i = 0 to N - 1):
(local error) <= max(Rtol(i)*Abs(Y(i)) + Atol(i), Rtol(i)*Abs(Yp(i)) + Atol(i)) (if ErrCntl = 0)
(local error) <= Rtol(i)*Abs(Y(i)) + Atol(i) (if ErrCntl = 1)
Both Rtol(i) and Atol(i) must not be 0 at the same time. |
| [in] | Atol() | Array Atol(LAtol - 1) (LAtol >= 1) (all elements of Atol() >= 0)
The absolute error tolerance(s) to specify how accurately compute the solution. This parameter may be a scalar or an array according to the values of LRtol and LAtol (Scalar if LRtol < N or LAtol < N, array if LRtol >= N and LAtol >= N).
Atol is used together with Rtol in a local error test at each step (Refer to Rtol above). |
| [in] | Mode | Mode of operation.
This program integrates from t0 to Tend. Three modes of operation are provided depending on the timing of returning imtermediate results. When Tend is reached, the integration is terminated and Info = 0 is returned in any of four modes. = 0: Not return until Tend. Tout is not referenced.
= 1: Returns at every successful step (Info = 1 is returned). Tout is not referenced. The end point of the last step is returned in T. In the final step, the step size is adjusted to fit into Tend.
= 2: Returns at Tout during the ingegration to provide an intermediate result (T = Tout and Info = 2 are returned). To continue the integration to get result at new Tout, it is possible to call this program again with new Tout. In the final step, the step size is adjusted to fit into Tout.
Note - Mode = 3 is not supported in this program. |
| [in,out] | Info | [in] Control code.
= 0: Set Info = 0 on the initial call to start new problem. All variables will be initialized and the computation will begin.
= 1, 2: When returned with Info = 1 or 2, it is possible to call this program again with new Tout and without changing Info to continue the integration.
[out] Return code.
= 0: Successful exit. Integration to Tend completed.
< 0: The (-Info)-th argument is invalid.
= 1: Returned to provide intermediate result in Mode = 1. It is possible to call this program again to forward to the next step.
= 2: Returned at T = Tout to provide intermediate result in Mode = 2. It is possible to call this program again with new Tout.
= 11: (Error) Maximum number of steps exceeded.
= 12: (Error) Step size becomes too small. |
| [out] | Neval | (Optional)
Number of function evaluations. |
| [out] | Nstep | (Optional)
Number of all computed steps. |
| [out] | Naccept | (Optional)
Number of accepted steps. |
| [out] | Nreject | (Optional)
Number of rejected steps. |
| [in] | Maxiter | (Optional)
Maximum number of allowed steps. (default = 10000) |
| [in] | ErrCntl | (Optional)
Specifies how determine the acceptance of the step. (default = 0)
= 0: Determine the acceptance of the step using the estimated errors of both y and y'.
= 1: Determine the acceptance of the step using the estimated error of y only. |
| [in] | Cnt | (Optional)
Specifies when counters (Neval, Nstep, Naccept and Nreject) are reset to zero. (default = 0)
= 0: Reset if Info = 0.
= 1: Do not reset even if Info = 0. |
| [in] | Hinit | (Optional)
Initial step size. (default = estimated by the program) |
| [in] | Hmax | (Optional)
Maximaum step size. (default = Abs(Tend - T)) |
| [in] | Fac1,Fac2 | (Optional)
Parameters for step size selection. (default: Fac1 = 0.2, Fac2 = 10)
The new step size is chosen subject to the restriction Fac1 <= Hnew/Hold <= Fac2. |
| [in] | Safe | (Optional)
The safety factor in step size prediction. (0.0001 < Safe < 1) (default = 0.9) |
- References
- (1) J. R. Dormand, M. E. A. El-Mikkawy, P. J. Prince, "High Order Embedded Runge-Kutta-Nystrom Formulae", IMA J. of Numerical Analysis, 7, 423-430 (1987).
- Example Program
- Solve the following initial value problem of ordinary differential equations.
y1'' = -y1/R
y2'' = -y2/R
where R = (y1^2 + y2^2)^(3/2)/(π/4)^2
(y1 = 0.75, y2 = 0, y1' = 0, y2' = (π/4)√(1.25/0.75) at t = 0)
Sub F2(N As Long, T As Double, Y() As Double, Yp2() As Double)
Dim R As Double
R = (Y(0) ^ 2 + Y(1) ^ 2) ^ (3 / 2) / Atn(1) ^ 2
Yp2(0) = -Y(0) / R
Yp2(1) = -Y(1) / R
End Sub
Sub Ex_Dopn1210()
Const N = 2
Dim T As Double, Y(N - 1) As Double, Yp(N - 1) As Double, Tend As Double, Tout As Double
Dim RTol(0) As Double, ATol(0) As Double, Mode As Long, Neval As Long, Info As Long
RTol(0) = 0.0000000001 '1.0e-10
ATol(0) = RTol(0)
Mode = 2
T = 0: Y(0) = 0.75: Y(1) = 0: Yp(0) = 0: Yp(1) = Atn(1) * Sqr(1.25 / 0.75)
Tend = 12
Info = 0
Do
Tout = T + 1
Call Dopn1210(N, AddressOf F2, T, Y(), Yp(), Tout, Tend, RTol(), ATol(), Mode, Info, Neval)
Debug.Print T, Y(0), Y(1)
Loop While Tout < Tend
Debug.Print Neval, Info
End Sub
Sub Dopn1210(N As Long, F2 As LongPtr, T As Double, Y() As Double, Yp() As Double, Tout As Double, Tend As Double, RTol() As Double, ATol() As Double, Mode As Long, Info As Long, Optional Neval As Long, Optional Nstep As Long, Optional Naccept As Long, Optional Nreject As Long, Optional MaxIter As Long=0, Optional ErrCntl As Long=0, Optional Cnt As Long=0, Optional Hinit As Double=0, Optional Hmax As Double=0, Optional Fac1 As Double=0, Optional Fac2 As Double=0, Optional Safe As Double=0) Initial value problem of ordinary differential equations (12(10)-th order Runge-Kutta-Nystrom method)...
- Example Results
1 0.294417538441605 0.81217851938271
2 -0.490299791957706 0.939874996671345
3 -1.05403151582648 0.575706078629462
4 -1.25000000000367 1.12305321292583E-11
5 -1.05403151583639 -0.575706078603672
6 -0.490299792087631 -0.939874996627474
7 0.294417538355432 -0.812178519286131
8 0.749999999971532 2.76490746964342E-10
9 0.294417538183787 0.81217851945881
10 -0.490299792231615 0.939874996421753
11 -1.05403151590449 0.575706078053656
12 -1.24999999966515 -7.87683054198629E-10
561 0
|