Skip to content

Commit

Permalink
added RungeKutta stepper.
Browse files Browse the repository at this point in the history
  • Loading branch information
djuber committed May 29, 2012
1 parent 9171181 commit 53e5b22
Show file tree
Hide file tree
Showing 17 changed files with 109 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ stepping
doStep: aState time: t
"This method should take one step from inState at time t of size dt, and modify the state, then answer it. The default implementation here is Euler Method. Subclasses should override"
| dxdt |
dxdt := system x: aState t: t.
self stepSize isNil ifTrue: [self error: 'step size required by stepper'].
dxdt := system x: aState t: t.
aState isNumber
ifTrue: [^ (self stepSize * dxdt + aState)]
"a collection"
ifFalse:
[(1 to aState size)
[(1 to: aState size)
do: [:i | | xi |
xi := aState at: i.
aState at: i put: (dxdt at: i) * self stepSize + xi].
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
stepping
doStep: aState time: t stepSize: dt
doStep: aState time: t stepSize: timeStep
"This method should take one step from inState at time t of size dt, and modify the state, then answer it. The default implementation here is Euler Method. Subclasses should override"
| dxdt |
dxdt := system x: aState t: t.
aState isNumber
ifTrue: [^ (dt * dxdt + aState)]
ifFalse:
[(1 to aState size)
do: [:i | | xi |
xi := aState at: i.
aState at: i put: (dxdt at: i) * dt + xi].
^ aState.]
self stepSize: timeStep.
^ self doStep: aState time: t.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ solving
solve: aSystem startState: initialState startTime: initialTime endTime: endTime
| state |
self system: aSystem.
self stepper: ((self stepperClass) onSystem: self system).
stepper ifNil: [
self stepper: ((self stepperClass) onSystem: self system)].
state := initialState.
(initialTime to: endTime by: self dt) do:
[:time |
Expand Down
3 changes: 3 additions & 0 deletions Math-ODE.package/RungeKuttaStepper.class/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
A RungeKuttaStepper is a specialization on Explicit Stepper that provides a higer order estimate. The Euler method implemented in ExplicitStepper is order 1, and the error obtained is proportional to the step size.

The RungeKuttaStepper is order 4, the error term is proportional to the step size to the fourth power.
4 changes: 4 additions & 0 deletions Math-ODE.package/RungeKuttaStepper.class/class/order.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
accessing
order
"RungeKutta is a fourth order method."
^ 4
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
stepping
collectionDoStep: aState time: t
"aState is a collection/vector, and system is a vector function. Take a single step using fourth order runge-kutta."
| k1 k2 k3 k4 midPoint endPoint|
midPoint := self stepSize / 2 + t.
endPoint := self stepSize + t.
k1 := system x: aState t: t.
k2 := system x: aState + (k1 * self stepSize / 2) t: midPoint.
k3 := system x: aState + (k2 * self stepSize / 2 ) t: midPoint.
k4 := system x: aState + (k3 * self stepSize) t: endPoint.
Transcript show: t; show: aState; cr.
^ aState + ((k1 + k2 + k2 + k3 + k3 + k4) / 6 * self stepSize).

10 changes: 10 additions & 0 deletions Math-ODE.package/RungeKuttaStepper.class/instance/doStep.time..st
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
stepping
doStep: aState time: t
"This method should take one step from inState at time t of size dt, and modify the state, then answer it."
self stepSize isNil ifTrue: [self error: 'step size required by stepper'].
aState isNumber
ifTrue:
[^ (self numberDoStep: aState time: t)]
"a collection"
ifFalse:
[^ (self collectionDoStep: aState time: t)]
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
stepping
numberDoStep: aState time: t
"state is a number. Take a single step at t."
| k1 k2 k3 k4 |
k1 := system x: aState t: t.
k2 := system x: aState + (k1 * self stepSize / 2 ) t: self stepSize / 2 + t.
k3 := system x: aState + (k2 * self stepSize / 2 ) t: self stepSize / 2 + t.
k4 := system x: aState + (self stepSize * k3) t: self stepSize + t.
^ aState + ((k1 + k2 + k2 + k3 + k3 + k4)/ 6 * self stepSize).
16 changes: 16 additions & 0 deletions Math-ODE.package/RungeKuttaStepper.class/properties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"category" : "Math-ODE",
"classinstvars" : [
],
"classtraitcomposition" : "{}",
"classvars" : [
],
"commentStamp" : "<historical>",
"instvars" : [
],
"name" : "RungeKuttaStepper",
"pools" : [
],
"super" : "ExplicitStepper",
"traitcomposition" : "{}",
"type" : "normal" }
1 change: 0 additions & 1 deletion Math-ODE.package/monticello.meta/categories.st
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
SystemOrganization addCategory: #'Math-ODE'!
SystemOrganization addCategory: #'Math-ODE-Tests'!
2 changes: 1 addition & 1 deletion Math-ODE.package/monticello.meta/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
(name 'Math-ODE-DanielUber.8' message 'empty log message' id '5c0bc90a-2387-41bc-ab90-a88883002a50' date '23 May 2012' time '2:26:31.909 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.7' message 'added stepSize method to ODESolver to match documentation.' id '955dc50b-d09e-41cf-b8dd-f0ae03bc864f' date '22 May 2012' time '1:13:52.298 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.6' message 'added classes from odeint-v2. Need to flush out methods.' id 'ff724335-5ab4-435c-8c05-59aba765771b' date '22 May 2012' time '1:08:22.878 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.5' message 'removed stepSize method' id 'e61dae0a-b3ed-4cdb-a664-339a0f9b5b1e' date '22 May 2012' time '12:19:42.946 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.4' message 'added ODESolver. Need to seriously refactor this.' id '571a4c4d-eaf0-4e41-86c4-759345442aaa' date '22 May 2012' time '12:00:41.72 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.3' message 'added dostep:time:stepSize: to Explicit Stepper.' id '22698f56-b98a-42f8-aa9a-a5ebd7040fba' date '22 May 2012' time '11:00:33.138 am' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.2' message 'added Stepper instance side order method' id '1985fcfd-5303-402a-9827-079a288c913c' date '22 May 2012' time '10:28:29.012 am' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.1' message 'adding tests' id 'b3f035a5-9b7e-4620-82d1-01b71791d425' date '22 May 2012' time '10:22:15.344 am' author 'DanielUber' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())
(name 'Math-ODE-DanielUber.10' message 'RungeKuttaStepper added. Corrected issue where ODESolver would overwrite stepper.' id 'aa5aa7b0-eb57-457f-a08a-f9971db062b3' date '29 May 2012' time '11:38:04.988 am' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.9' message 'working copy' id '7356b953-4511-44c1-baed-671b73abdd00' date '29 May 2012' time '8:07:06.734 am' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.8' message 'empty log message' id '5c0bc90a-2387-41bc-ab90-a88883002a50' date '23 May 2012' time '2:26:31.909 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.7' message 'added stepSize method to ODESolver to match documentation.' id '955dc50b-d09e-41cf-b8dd-f0ae03bc864f' date '22 May 2012' time '1:13:52.298 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.6' message 'added classes from odeint-v2. Need to flush out methods.' id 'ff724335-5ab4-435c-8c05-59aba765771b' date '22 May 2012' time '1:08:22.878 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.5' message 'removed stepSize method' id 'e61dae0a-b3ed-4cdb-a664-339a0f9b5b1e' date '22 May 2012' time '12:19:42.946 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.4' message 'added ODESolver. Need to seriously refactor this.' id '571a4c4d-eaf0-4e41-86c4-759345442aaa' date '22 May 2012' time '12:00:41.72 pm' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.3' message 'added dostep:time:stepSize: to Explicit Stepper.' id '22698f56-b98a-42f8-aa9a-a5ebd7040fba' date '22 May 2012' time '11:00:33.138 am' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.2' message 'added Stepper instance side order method' id '1985fcfd-5303-402a-9827-079a288c913c' date '22 May 2012' time '10:28:29.012 am' author 'DanielUber' ancestors ((name 'Math-ODE-DanielUber.1' message 'adding tests' id 'b3f035a5-9b7e-4620-82d1-01b71791d425' date '22 May 2012' time '10:22:15.344 am' author 'DanielUber' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,9 @@ testDoStepTime
self should: [stepper stepSize = dt].
self should: [(stepper doStep: 0 time: 10) = 0 ].
self should: [(stepper doStep: 10 time: 0 stepSize: 1) = 10 ].
self should: [(stepper doStep: 1 time: 1) = 1.1].

"stepSize parameter changes the stored stepSize"
self should: [(stepper stepSize = 1)].

self should: [(stepper doStep: 1 time: 1) = 2].
self should: [(stepper doStep: 10 time: 1 stepSize: 0.2) = 12.0].
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
as yet unclassified
testSimpleSystem
| solver stepper system dt |
dt := 0.01.
system := ExplicitSystem block: [:x :t | t sin].
stepper := RungeKuttaStepper onSystem: system.
solver := (ODESolver new) stepper: stepper; system: system; dt: dt.
self should: [(solver solve: system startState: -1 startTime: 0 endTime: Float pi) closeTo: 1].

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
as yet unclassified
testVectorSystem
| solver stepper system dt |
dt := 0.01.
system := ExplicitSystem block: [:x :t | | c | c:= DhbVector new: 2.
c at: 1 put: t sin.
c at: 2 put: t cos.
c].
stepper := RungeKuttaStepper onSystem: system.
solver := (ODESolver new) stepper: stepper; system: system; dt: dt.
self should: [((solver solve: system startState: #(-1 0) startTime: 0 endTime: Float pi ) at: 1)closeTo: 1].
self should: [((solver solve: system startState: #(-1 0) startTime: 0 endTime: Float pi / 2 ) at: 2 ) closeTo: 1].
16 changes: 16 additions & 0 deletions Math-ODETests.package/RungeKuttaStepperTest.class/properties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"category" : "Math-ODETests",
"classinstvars" : [
],
"classtraitcomposition" : "{}",
"classvars" : [
],
"commentStamp" : "",
"instvars" : [
],
"name" : "RungeKuttaStepperTest",
"pools" : [
],
"super" : "TestCase",
"traitcomposition" : "{}",
"type" : "normal" }
4 changes: 2 additions & 2 deletions Math-ODETests.package/monticello.meta/version
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
(name 'Math-ODETests-DanielUber.7' message 'empty log message' id 'cfd892ed-878f-4133-be64-f3e0f16b1435' date '23 May 2012' time '2:26:52.338 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.6' message 'added stepSize test to ODESolver
' id '25e7cdfa-5187-4dd6-964e-6e8792997cc5' date '22 May 2012' time '1:13:27.876 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.5' message 'updated ODESolver test case' id 'b4987f9f-42e5-4419-82bc-b69cc8005a51' date '22 May 2012' time '12:10:31.248 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.4' message 'added an ODESolver Test case.' id 'de593a5a-7329-481d-9998-7110fe2440d2' date '22 May 2012' time '12:00:15.938 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.3' message 'added a simple test for explicit stepper' id '483279a1-a0be-4709-9d9e-bcbc0bb28328' date '22 May 2012' time '11:00:01.4 am' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.2' message 'simple tests.' id 'f7dcc5d5-7a0f-49a5-86b8-78b37af92772' date '22 May 2012' time '10:26:58.064 am' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.1' message 'empty log message' id '0e80a988-7d99-442a-88e9-3585a72553d7' date '22 May 2012' time '10:21:20.378 am' author 'DanielUber' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())
(name 'Math-ODETests-DanielUber.9' message 'RungeKuttaStepper Test cases.' id '602a2efe-2b9f-4ffc-a77f-16cd4771112a' date '29 May 2012' time '11:37:30.278 am' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.8' message 'working copy' id '40e8f700-48d2-41f6-86f0-1ec4b408fdda' date '29 May 2012' time '8:07:55.66 am' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.7' message 'empty log message' id 'cfd892ed-878f-4133-be64-f3e0f16b1435' date '23 May 2012' time '2:26:52.338 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.6' message 'added stepSize test to ODESolver
' id '25e7cdfa-5187-4dd6-964e-6e8792997cc5' date '22 May 2012' time '1:13:27.876 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.5' message 'updated ODESolver test case' id 'b4987f9f-42e5-4419-82bc-b69cc8005a51' date '22 May 2012' time '12:10:31.248 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.4' message 'added an ODESolver Test case.' id 'de593a5a-7329-481d-9998-7110fe2440d2' date '22 May 2012' time '12:00:15.938 pm' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.3' message 'added a simple test for explicit stepper' id '483279a1-a0be-4709-9d9e-bcbc0bb28328' date '22 May 2012' time '11:00:01.4 am' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.2' message 'simple tests.' id 'f7dcc5d5-7a0f-49a5-86b8-78b37af92772' date '22 May 2012' time '10:26:58.064 am' author 'DanielUber' ancestors ((name 'Math-ODETests-DanielUber.1' message 'empty log message' id '0e80a988-7d99-442a-88e9-3585a72553d7' date '22 May 2012' time '10:21:20.378 am' author 'DanielUber' ancestors () stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())) stepChildren ())
Expand Down

0 comments on commit 53e5b22

Please sign in to comment.