summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/meta-imp-functions.mkxl
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/meta-imp-functions.mkxl')
-rw-r--r--tex/context/base/mkxl/meta-imp-functions.mkxl342
1 files changed, 342 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/meta-imp-functions.mkxl b/tex/context/base/mkxl/meta-imp-functions.mkxl
new file mode 100644
index 000000000..dd20ea8b8
--- /dev/null
+++ b/tex/context/base/mkxl/meta-imp-functions.mkxl
@@ -0,0 +1,342 @@
+%D \module
+%D [ file=meta-imp-functions,
+%D version=2022.05.17,
+%D title=\METAPOST\ Graphics,
+%D subtitle=All kind of functions,
+%D author=Mikael Sundqvist & Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \useMPlibrary[functions]
+
+% todo: as with contours, cache
+
+\registerctxluafile{meta-imp-functions}{autosuffix}
+
+\startMPextensions
+ newscriptindex mfid_processfunction ; mfid_processfunction := scriptindex("processfunction") ;
+
+ presetparameters "function" [ name = "unknown", smoothen = false, maxpath = 65536 ] ;
+
+ def lmt_processfunction = applyparameters "function" "lmt_do_processfunction" enddef ;
+
+ vardef lmt_do_processfunction =
+ if getparameter "function" "smoothen" :
+ for k within (runscript mfid_processfunction) : pathpoint .. endfor nocycle
+ else :
+ (runscript mfid_processfunction)
+ fi
+ enddef ;
+\stopMPextensions
+
+\continueifinputfile{meta-imp-functions.mkxl}
+
+\starttext
+
+\startluacode
+ mp.registeraction {
+ name = "ms2",
+ action = function(t, x, y)
+ return -y, x
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path p ; p := lmt_processfunction [
+ name = "rungekutta"
+ lua = "ms2",
+ x = 1,
+ y = 0,
+ tmax = 6pi,
+ dt = 0.001,
+ eps = 0.00001,
+ ] xysized (5cm,5cm) ;
+ draw p withcolor red withpen pencircle scaled 1 ;
+ path q ; q := for i within p : pathpoint .. endfor nocycle ;
+ draw q withcolor green withpen pencircle scaled 1/2 ;
+\stopMPpage
+
+%
+
+\startluacode
+ mp.registeraction {
+ name = "ms3",
+ action = function(t, x, y)
+ return 1, -t*y*y
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path p ; p := lmt_processfunction [
+ name = "rungekutta"
+ lua = "ms3",
+ x = 0,
+ y = 2,
+ tmax = 10,
+ dt = 0.001,
+ eps = 0.00001,
+ ] xysized (5cm,5cm) ;
+ draw p withcolor red withpen pencircle scaled 6 ;
+\stopMPpage
+
+%
+
+\startluacode
+ mp.registeraction {
+ name = "ms4",
+ action = function(t, x, y)
+ return 1, -y
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path p ; p := lmt_processfunction [
+ name = "rungekutta"
+ lua = "ms4",
+ x = 0,
+ y = 1,
+ tmax = 10,
+ dt = 0.001,
+ eps = 0.00001,
+ ] scaled 5cm ;
+ draw p withcolor red withpen pencircle scaled 6 ;
+\stopMPpage
+
+%
+
+\startluacode
+ mp.registeraction {
+ name = "ms5",
+ action = function(t, x, y)
+ return x + y + x*x + y*y, x - y - x*x + y*y
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path b ; numeric s;
+
+ s := 1cm ;
+ b := ((-2.5,-2.5) -- (1.5,-2.5) -- (1.5,1.5) -- (-2.5,1.5) -- cycle) scaled s ;
+
+ for i = -3.05 step 0.1 until 2.5 :
+ for j = -3.05 step 0.1 until 2.5 :
+ draw lmt_processfunction [
+ name = "rungekutta",
+ lua = "ms5",
+ x = i,
+ y = j,
+ tmax = 10,
+ dt = 0.1,
+ eps = 0.001,
+ smoothen = true,
+ maxpath = 500, % crazy large paths .. so kind of bad spec here
+ ]
+ scaled s
+ withpen pencircle scaled 0.1
+ withcolor (uniformdeviate(1),uniformdeviate(1),uniformdeviate(1))
+ ;
+ endfor ;
+ endfor ;
+
+ % so how much slack ?
+
+ draw b withpen pencircle scaled 2 ;
+ clip currentpicture to b ;
+
+\stopMPpage
+
+% https://wolfram.com/xid/0dekz2-wla
+
+\startluacode
+ mp.registeraction {
+ name = "mma1",
+ action = function(t, x, y)
+ return 1, y*math.cos(x+y)
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path p ; p := lmt_processfunction [
+ name = "rungekutta"
+ lua = "mma1",
+ x = 0,
+ y = 1,
+ tmax = 30,
+ dt = 0.001,
+ eps = 0.00001,
+ ] xysized(10cm,5cm) ;
+ draw p withcolor red withpen pencircle scaled 2 ;
+ drawpoints p withcolor blue withpen pencircle scaled 2 ;
+\stopMPpage
+
+% https://wolfram.com/xid/0dekz2-gpx
+
+\startluacode
+ mp.registeraction {
+ name = "mma2",
+ action = function(t, x, y)
+ return -y-x*x, 2*x-y*y*y
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path p ; p := lmt_processfunction [
+ name = "rungekutta"
+ lua = "mma2",
+ x = 1,
+ y = 1,
+ tmax = 20,
+ dt = 0.001,
+ eps = 0.00001,
+ ] xysized(10cm,10cm) ;
+ draw p withcolor red withpen pencircle scaled 2 ;
+ drawpoints p withcolor blue withpen pencircle scaled 2 ;
+\stopMPpage
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% https://wolfram.com/xid/0dekz2-xixft
+
+\startluacode
+ mp.registeraction {
+ name = "mma3",
+ action = function(t, x, y)
+ return y, -0.1 * y - math.sin(x) + 0.5 * math.cos(t)
+ end
+ }
+\stopluacode
+
+\startMPpage
+ path p ; p := lmt_processfunction [
+ name = "rungekutta"
+ lua = "mma3",
+ x = 0,
+ y = 0,
+ tmax = 100,
+ dt = 0.001,
+ eps = 0.00001,
+ ] xysized(10cm,10cm) ;
+ draw p withcolor red withpen pencircle scaled 2 ;
+ drawpoints p withcolor blue withpen pencircle scaled 2 ;
+\stopMPpage
+
+% https://wolfram.com/xid/0dekz2-dmilmp
+% Stiff! Not working!
+
+% \startluacode
+% mp.registeraction {
+% name = "mma4",
+% action = function(t, x, y)
+% return y, - x + 1000 * (1 - x * x) * y
+% end
+% }
+% \stopluacode
+
+% \startMPpage % [instance=decimalfun]
+% path p ; p := lmt_processfunction [
+% name = "rungekutta"
+% lua = "mma4",
+% x = 2,
+% y = 0,
+% tmax = 2000,
+% dt = 0.01,
+% eps = 0.0001
+% ] xynormalized(10cm,10cm) ;
+% draw p
+% withpen pencircle scaled 2
+% withcolor red
+% ;
+% % drawpoints p withcolor blue withpen pencircle scaled 2 ;
+% \stopMPpage
+
+% https://wolfram.com/xid/0dekz2-d1orb
+% Discontinuous right-hand side
+
+\startluacode
+ mp.registeraction {
+ name = "mma5",
+ action = function(t, x, y)
+ return 1, - math.cos(y) + math.floor(t)
+ end
+ }
+\stopluacode
+
+\startMPpage
+ save n ; n := 0 ;
+ for i = "xy", "tx", "ty" :
+ path p ; p := lmt_processfunction [
+ name = "rungekutta",
+ type = i,
+ lua = "mma5",
+ x = 0,
+ y = 1,
+ tmax = 3,
+ dt = 0.001,
+ eps = 0.0001,
+ ] xysized(10cm,10cm) shifted (n*11cm,0) ;
+ draw p withcolor red withpen pencircle scaled 2 ;
+ drawpoints p withcolor blue withpen pencircle scaled 2 ;
+ n := n + 1 ;
+ endfor ;
+\stopMPpage
+
+\startluacode
+ mp.registeraction {
+ name = "mma6",
+ action = function(t, x, y)
+ return y, -x
+ end
+ }
+\stopluacode
+
+\startMPpage
+ save n ; n := 0 ;
+ for i = "xy", "tx", "ty" :
+ path p ; p := lmt_processfunction [
+ name = "rungekutta",
+ kind = i,
+ lua = "mma6",
+ x = 1,
+ y = 0,
+ tmin = 0,
+ tmax = 6.28,
+ dt = 0.001,
+ eps = 0.0000001,
+ ] xysized(10cm,10cm) shifted (n*11cm,0) ;
+ draw p withcolor red withpen pencircle scaled 2 ;
+ drawpoints p withcolor blue withpen pencircle scaled 2 ;
+ n := n + 1 ;
+ endfor ;
+\stopMPpage
+
+\startMPpage
+ save n ; n := 0 ;
+ for i = "xy", "tx", "ty" :
+ path p ; p := lmt_processfunction [
+ name = "rungekutta",
+ kind = i,
+ lua = "mma6",
+ x = 1,
+ y = 0,
+ tmin = 0,
+ tmax = 6,
+ stepsize = "fixed",
+ dt = 0.5,
+ maxpath = 3,
+ ] xysized(10cm,10cm) shifted (n*11cm,0) ;
+ draw p withcolor red withpen pencircle scaled 2 ;
+ drawpoints p withcolor blue withpen pencircle scaled 2 ;
+ n := n + 1 ;
+ endfor ;
+\stopMPpage
+
+\stoptext