306 lines
14 KiB
HTML
306 lines
14 KiB
HTML
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<!--
|
|
|
|
Generated from r6rs.tex by tex2page, v 20100828
|
|
(running on MzScheme 4.2.4, :unix),
|
|
(c) Dorai Sitaram,
|
|
http://evalwhen.com/tex2page/index.html
|
|
|
|
-->
|
|
<head>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
<title>
|
|
Revised^6 Report on the Algorithmic Language Scheme
|
|
</title>
|
|
<link rel="stylesheet" type="text/css" href="r6rs-Z-S.css" title=default>
|
|
<meta name=robots content="index,follow">
|
|
</head>
|
|
<body>
|
|
<div id=slidecontent>
|
|
<div align=right class=navigation>[Go to <span><a href="r6rs.html">first</a>, <a href="r6rs-Z-H-17.html">previous</a></span><span>, <a href="r6rs-Z-H-19.html">next</a></span> page<span>; </span><span><a href="r6rs-Z-H-2.html#node_toc_start">contents</a></span><span><span>; </span><a href="r6rs-Z-H-21.html#node_index_start">index</a></span>]</div>
|
|
<p></p>
|
|
<a name="node_chap_D"></a>
|
|
<h1 class=chapter>
|
|
<div class=chapterheading><a href="r6rs-Z-H-2.html#node_toc_node_chap_D">Appendix D</a></div><br>
|
|
<a href="r6rs-Z-H-2.html#node_toc_node_chap_D">Example </a></h1>
|
|
<p></p>
|
|
<p>
|
|
This section describes an example consisting of the
|
|
<tt>(runge-kutta)</tt> library, which provides an <tt>integrate-system</tt>
|
|
procedure that integrates the system
|
|
</p>
|
|
<div class=mathdisplay align=left><table><tr><td></td><td><table><tr><td align=center><em>y</em><sub><em>k</em></sub><sup>⁄</sup> = <em>f</em><sub><em>k</em></sub>(<em>y</em><sub>1</sub>, <em>y</em><sub>2</sub>, <tt>...</tt>, <em>y</em><sub><em>n</em></sub>), <span style="margin-left: .27778em">‌</span> <em>k</em> = 1, <tt>...</tt>, <em>n</em></td></tr></table></td><td></td></tr></table></div>
|
|
<p class=noindent>
|
|
of differential equations with the method of Runge-Kutta.</p>
|
|
<p>
|
|
As the <tt>(runge-kutta)</tt> library makes use of the <tt>(rnrs base (6))</tt>
|
|
library, its skeleton is as follows:</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>#!r6rs
|
|
<p class=nopadding>(library (runge-kutta)</p>
|
|
|
|
<p class=nopadding> (export integrate-system</p>
|
|
|
|
<p class=nopadding> head tail)</p>
|
|
|
|
<p class=nopadding> (import (rnrs base))</p>
|
|
|
|
<p class=nopadding> <library body>)</p>
|
|
|
|
<p class=nopadding></p>
|
|
<p></tt></p>
|
|
<p>
|
|
The procedure definitions described below go in the place of <library body>.</p>
|
|
<p>
|
|
The parameter <tt>system-derivative</tt> is a function that takes a system
|
|
state (a vector of values for the state variables <em>y</em><sub>1</sub>, <tt>...</tt>, <em>y</em><sub><em>n</em></sub>)
|
|
and produces a system derivative (the values <em>y</em><sub>1</sub><sup>⁄</sup>, <tt>...</tt>,
|
|
<em>y</em><sub><em>n</em></sub><sup>⁄</sup>). The parameter <tt>initial-state</tt> provides an initial
|
|
system state, and <tt>h</tt> is an initial guess for the length of the
|
|
integration step.</p>
|
|
<p>
|
|
The value returned by <tt>integrate-system</tt> is an infinite stream of
|
|
system states.</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>(define integrate-system
|
|
<p class=nopadding> (lambda (system-derivative initial-state h)</p>
|
|
|
|
<p class=nopadding> (let ((next (runge-kutta-4 system-derivative h)))</p>
|
|
|
|
<p class=nopadding> (letrec ((states</p>
|
|
|
|
<p class=nopadding> (cons initial-state</p>
|
|
|
|
<p class=nopadding> (lambda ()</p>
|
|
|
|
<p class=nopadding> (map-streams next states)))))</p>
|
|
|
|
<p class=nopadding> states))))</p>
|
|
<p></tt></p>
|
|
<p>
|
|
The <tt>runge-kutta-4</tt> procedure takes a function, <tt>f</tt>, that produces a
|
|
system derivative from a system state. The <tt>runge-kutta-4</tt> procedure
|
|
produces a function that takes a system state and
|
|
produces a new system state.</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>(define runge-kutta-4
|
|
<p class=nopadding> (lambda (f h)</p>
|
|
|
|
<p class=nopadding> (let ((*h (scale-vector h))</p>
|
|
|
|
<p class=nopadding> (*2 (scale-vector 2))</p>
|
|
|
|
<p class=nopadding> (*1/2 (scale-vector (/ 1 2)))</p>
|
|
|
|
<p class=nopadding> (*1/6 (scale-vector (/ 1 6))))</p>
|
|
|
|
<p class=nopadding> (lambda (y)</p>
|
|
|
|
<p class=nopadding> ;; y is a system state</p>
|
|
|
|
<p class=nopadding> (let* ((k0 (*h (f y)))</p>
|
|
|
|
<p class=nopadding> (k1 (*h (f (add-vectors y (*1/2 k0)))))</p>
|
|
|
|
<p class=nopadding> (k2 (*h (f (add-vectors y (*1/2 k1)))))</p>
|
|
|
|
<p class=nopadding> (k3 (*h (f (add-vectors y k2)))))</p>
|
|
|
|
<p class=nopadding> (add-vectors y</p>
|
|
|
|
<p class=nopadding> (*1/6 (add-vectors k0</p>
|
|
|
|
<p class=nopadding> (*2 k1)</p>
|
|
|
|
<p class=nopadding> (*2 k2)</p>
|
|
|
|
<p class=nopadding> k3))))))))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(define elementwise</p>
|
|
|
|
<p class=nopadding> (lambda (f)</p>
|
|
|
|
<p class=nopadding> (lambda vectors</p>
|
|
|
|
<p class=nopadding> (generate-vector</p>
|
|
|
|
<p class=nopadding> (vector-length (car vectors))</p>
|
|
|
|
<p class=nopadding> (lambda (i)</p>
|
|
|
|
<p class=nopadding> (apply f</p>
|
|
|
|
<p class=nopadding> (map (lambda (v) (vector-ref v i))</p>
|
|
|
|
<p class=nopadding> vectors)))))))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(define generate-vector</p>
|
|
|
|
<p class=nopadding> (lambda (size proc)</p>
|
|
|
|
<p class=nopadding> (let ((ans (make-vector size)))</p>
|
|
|
|
<p class=nopadding> (letrec ((loop</p>
|
|
|
|
<p class=nopadding> (lambda (i)</p>
|
|
|
|
<p class=nopadding> (cond ((= i size) ans)</p>
|
|
|
|
<p class=nopadding> (else</p>
|
|
|
|
<p class=nopadding> (vector-set! ans i (proc i))</p>
|
|
|
|
<p class=nopadding> (loop (+ i 1)))))))</p>
|
|
|
|
<p class=nopadding> (loop 0)))))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(define add-vectors (elementwise +))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(define scale-vector</p>
|
|
|
|
<p class=nopadding> (lambda (s)</p>
|
|
|
|
<p class=nopadding> (elementwise (lambda (x) (* x s)))))</p>
|
|
<p></tt></p>
|
|
<p>
|
|
The <tt>map-streams</tt> procedure is analogous to <tt>map</tt>: it applies its first
|
|
argument (a procedure) to all the elements of its second argument (a
|
|
stream).</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>(define map-streams
|
|
<p class=nopadding> (lambda (f s)</p>
|
|
|
|
<p class=nopadding> (cons (f (head s))</p>
|
|
|
|
<p class=nopadding> (lambda () (map-streams f (tail s))))))</p>
|
|
<p></tt></p>
|
|
<p>
|
|
Infinite streams are implemented as pairs whose car holds the first
|
|
element of the stream and whose cdr holds a procedure that delivers the rest
|
|
of the stream.</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>(define head car)
|
|
<p class=nopadding>(define tail</p>
|
|
|
|
<p class=nopadding> (lambda (stream) ((cdr stream))))</p>
|
|
<p></tt></p>
|
|
<p>
|
|
</p>
|
|
<div class=bigskip></div>
|
|
<p style="margin-top: 0pt; margin-bottom: 0pt">
|
|
The following program illustrates the use of <tt>integrate-system</tt> in
|
|
integrating the system
|
|
</p>
|
|
<div class=mathdisplay align=left><table><tr><td></td><td><table><tr><td align=center> <em>C</em> </td><td><table><tr><td align=center><em>d</em><em>v</em><sub><em>C</em></sub> </td></tr><tr><td style="height=1pt; background-color: black"></td></tr><tr><td align=center> <em>d</em><em>t</em></td></tr></table></td><td> = −<em>i</em><sub><em>L</em></sub> − </td><td><table><tr><td align=center><em>v</em><sub><em>C</em></sub> </td></tr><tr><td style="height=1pt; background-color: black"></td></tr><tr><td align=center> <em>R</em></td></tr></table></td><td></td></tr></table></td><td></td></tr></table></div>
|
|
<p class=noindent></p>
|
|
<div class=mathdisplay align=left><table><tr><td></td><td><table><tr><td align=center> <em>L</em> </td><td><table><tr><td align=center><em>d</em><em>i</em><sub><em>L</em></sub> </td></tr><tr><td style="height=1pt; background-color: black"></td></tr><tr><td align=center> <em>d</em><em>t</em></td></tr></table></td><td> = <em>v</em><sub><em>C</em></sub></td></tr></table></td><td></td></tr></table></div>
|
|
<p class=noindent>
|
|
which models a damped oscillator.</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>#!r6rs
|
|
<p class=nopadding>(import (rnrs base)</p>
|
|
|
|
<p class=nopadding> (rnrs io simple)</p>
|
|
|
|
<p class=nopadding> (runge-kutta))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(define damped-oscillator</p>
|
|
|
|
<p class=nopadding> (lambda (R L C)</p>
|
|
|
|
<p class=nopadding> (lambda (state)</p>
|
|
|
|
<p class=nopadding> (let ((Vc (vector-ref state 0))</p>
|
|
|
|
<p class=nopadding> (Il (vector-ref state 1)))</p>
|
|
|
|
<p class=nopadding> (vector (- 0 (+ (/ Vc (* R C)) (/ Il C)))</p>
|
|
|
|
<p class=nopadding> (/ Vc L))))))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(define the-states</p>
|
|
|
|
<p class=nopadding> (integrate-system</p>
|
|
|
|
<p class=nopadding> (damped-oscillator 10000 1000 .001)</p>
|
|
|
|
<p class=nopadding> '#(1 0)</p>
|
|
|
|
<p class=nopadding> .01))</p>
|
|
|
|
<p class=nopadding></p>
|
|
|
|
<p class=nopadding>(letrec ((loop (lambda (s)</p>
|
|
|
|
<p class=nopadding> (newline)</p>
|
|
|
|
<p class=nopadding> (write (head s))</p>
|
|
|
|
<p class=nopadding> (loop (tail s)))))</p>
|
|
|
|
<p class=nopadding> (loop the-states))</p>
|
|
<p></tt></p>
|
|
<p>
|
|
This prints output like the following:</p>
|
|
<p>
|
|
</p>
|
|
|
|
<tt>#(1 0)
|
|
<p class=nopadding>#(0.99895054 9.994835e-6)</p>
|
|
|
|
<p class=nopadding>#(0.99780226 1.9978681e-5)</p>
|
|
|
|
<p class=nopadding>#(0.9965554 2.9950552e-5)</p>
|
|
|
|
<p class=nopadding>#(0.9952102 3.990946e-5)</p>
|
|
|
|
<p class=nopadding>#(0.99376684 4.985443e-5)</p>
|
|
|
|
<p class=nopadding>#(0.99222565 5.9784474e-5)</p>
|
|
|
|
<p class=nopadding>#(0.9905868 6.969862e-5)</p>
|
|
|
|
<p class=nopadding>#(0.9888506 7.9595884e-5)</p>
|
|
|
|
<p class=nopadding>#(0.9870173 8.94753e-5)</p>
|
|
|
|
<p class=nopadding></p>
|
|
<p></tt></p>
|
|
<p>
|
|
</p>
|
|
<p></p>
|
|
<div class=smallskip></div>
|
|
<p style="margin-top: 0pt; margin-bottom: 0pt">
|
|
<div align=right class=navigation>[Go to <span><a href="r6rs.html">first</a>, <a href="r6rs-Z-H-17.html">previous</a></span><span>, <a href="r6rs-Z-H-19.html">next</a></span> page<span>; </span><span><a href="r6rs-Z-H-2.html#node_toc_start">contents</a></span><span><span>; </span><a href="r6rs-Z-H-21.html#node_index_start">index</a></span>]</div>
|
|
</p>
|
|
<p></p>
|
|
</div>
|
|
</body>
|
|
</html>
|