refactor various contrib/math

darcs
erg 2006-11-15 18:36:57 +00:00
parent 5ee8a82429
commit 9def7af3f5
2 changed files with 17 additions and 30 deletions

View File

@ -2,30 +2,28 @@ IN: math-contrib
USING: kernel sequences errors namespaces math vectors errors prettyprint io tools ;
: setup-range ( from to -- frange )
step-size get swap <frange> ;
>r step-size get r> <frange-no-endpt> ;
: integrate-rect ( from to f -- x )
>r setup-range dup decrement-length r>
[ step-size get * ] append map sum ;
>r setup-range r>
[ step-size get * + ] append >r 0 r> reduce ;
: integrate-trap ( from to f -- x )
>r setup-range r>
map dup 1 tail >r >vector dup pop drop r>
[ + 2 / step-size get * ] 2map sum ;
SYMBOL: num-steps 180 num-steps set ! simpsons
SYMBOL: num-steps 180 num-steps set-global
: setup-simpson-range ( from to -- frange )
[ swap - num-steps get /f ] 2keep swapd <frange> ;
: generate-simpson-weights ( seq -- seq )
length 2 / V{ 1 4 } clone swap 2 -
[ { 2 4 } append ] times { 1 } append ;
[ { 1 4 } % length 2 / 2 - [ { 2 4 } % ] times 1 , ] { } make ;
: integrate-simpson ( from to f -- x )
>r setup-simpson-range r> dupd map dup generate-simpson-weights
[ * ] 2map sum swap [ third ] keep first - 6 / * ;
0 [ * + ] 2reduce swap [ third ] keep first - 6 / * ;
: quadrature ( from to f -- x )
integrate-simpson ;
: quadrature ( from to f -- x ) integrate-simpson ;

View File

@ -63,33 +63,21 @@ TUPLE: frange from step length ;
C: frange ( from step to -- seq )
#! example: 0 .01 10 <frange> >array
>r pick - swap [ / ceiling 1+ ] keep -rot swapd r>
[ set-frange-length ] keep
>r pick - swap [ / ceiling 1+ >bignum ] keep r>
[ set-frange-step ] keep
[ set-frange-length ] keep
[ set-frange-from ] keep ;
: decrement-length ( frange -- )
[ frange-length 1- ] keep set-frange-length ;
: <frange-no-endpt> ( from step to -- seq )
over - <frange> ;
: <frange-no-endpt> ( from step length -- seq )
<frange> dup decrement-length ;
M: frange length ( frange -- n )
frange-length ;
: increment-start ( frange -- )
[ [ frange-from ] keep frange-step + ] keep set-frange-from ;
M: frange length ( frange -- n ) frange-length ;
M: frange nth ( n frange -- obj ) [ frange-step * ] keep frange-from + ;
: frange-range ( frange -- range )
[ frange-step ] keep frange-length 1- * ;
M: frange nth ( n frange -- obj )
[ frange-step * ] keep frange-from + ;
! : pivot ( left right index seq -- )
! [ nth ] keep [ exchange ] 3keep ;
SYMBOL: step-size .01 step-size set ! base on arguments
SYMBOL: step-size .01 step-size set-global ! TODO: base on arguments
: (limit) ( count diff quot -- x quot )
pick 10 > [ "Not converging fast enough" throw ] when
[ call ] keep >r 2dup swap - 0 < [ "not converging" throw ] when
@ -97,7 +85,8 @@ SYMBOL: step-size .01 step-size set ! base on arguments
swap [ step-size [ 2 / ] change rot 1+ -rot (limit) ] unless ;
: limit ( quot -- x )
.1 step-size set [ call ] keep step-size [ 2 / ] change 0 -rot (limit) 2drop ;
.1 step-size set [ call ] keep
step-size [ 2 / ] change 0 -rot (limit) 2drop ;
: nth-rand ( seq -- elem ) [ length random-int ] keep nth ;