Subversion Repositories wimsdev

Rev

Rev 13592 | Blame | Compare with Previous | Last modification | View Log | RSS feed

!if $wims_read_parm!=slib_header
  !goto proc
!endif
slib_author=Bernadette, Perrin-Riou

slib_parms=11\
,f1\
,f2\
400,size\
-10,tmin\
10,tmax\
-10,xmin and ymin\
 10,xmax and ymax\
[red,blue,green],color for draw of x(t), y(t), (x,y)\
[x0,y0],initial point of the solution at t=tmin\
,data (in brackets) for sliders separated by a semi-colon ; (for each one: symbol used in expressions f1 and f2, name of the slider, label for the slider, init values (min,default,max).\
,a number to identify the applet in case of multiple ones.

slib_example= CC-y^2, x-y,300,-10,10,-10,10,[red,yellow,orange],[2,1],[CC,c,variable T,0,5,10],2


 x-y+sin(t), x+y,400,-10,10,-10,10,green,[2,1],,3\
 CC*x-y, x+y,400,-10,10,-10,10,green,[0,2,0,4],[CC,c,nom de c,0,1,4],5

!exit

:proc
!reset slib_size1 slib_out slib_number slib_script_main
!distribute items $wims_read_parm into slib_f1,slib_f2,slib_size1,slib_tmin,slib_tmax,slib_ymin,slib_ymax,slib_color,slib_init,slib_cursor,slib_number,slib_option
!default slib_size1=400
!default slib_tmin=-10
!default slib_tmax=10
!default slib_ymin=-10
!default slib_ymax=10
!default slib_number=!randint 10000,30000

!set slib_color=!declosing $slib_color
!distribute items $slib_color into slib_colorx, slib_colory, slib_colorxy
!default slib_colorx=red
!default slib_colory=blue
!default slib_colorxy=green
!reset slib_dim
slib_glider=glider
!if $slib_f1=1
  slib_dim=1
  slib_glider=point
!endif

slib_N=$slib_xmax
slib_init=!declosing $slib_init
!default slib_init=0,0

slib_cursorcnt=0
slib_cursor=!declosing $slib_cursor
!if $slib_cursor != $empty
  !if ; isin $slib_cursor
    slib_cursorcnt=!itemcnt $(slib_cursor[;1])
  !else
    slib_cursorcnt=1
  !endif
  slib_cursor_dec= $[($slib_ymax-($slib_ymin))/20]
!endif
!reset slib_script_cursor
brd=brd$slib_number
brd1=brdchild$slib_number

slib_posx=$[round(($slib_tmax+($slib_tmin))/2)]
slib_posxc=$[round((6*$slib_tmax+3*($slib_tmin))/9)]
!for slib_j = 1 to $slib_cursorcnt
  slib_posy=$[$slib_ymax-$slib_cursor_dec*$slib_j]
  slib_script_cursor=$slib_script_cursor\
   $(slib_cursor[$slib_j;2]) = $brd.create('slider', [[$[$slib_tmin+1],$slib_posy],[$slib_posx,$slib_posy],[$(slib_cursor[$slib_j;4..6])]],{name:'$(slib_cursor[$slib_j;2])',strokeColor:'black',fillColor:'black', snapWidth:0.1});\
\
   $(slib_cursor[$slib_j;2])_name=$brd.create('text', [$slib_posxc,$slib_posy, "$(slib_cursor[$slib_j;3])"]);
  slib_f1=!replace internal $(slib_cursor[$slib_j;1]) by $(slib_cursor[$slib_j;2]) in $slib_f1
  slib_f2=!replace internal $(slib_cursor[$slib_j;1]) by $(slib_cursor[$slib_j;2]) in $slib_f2
!next

slib_script_main=var $brd = JXG.JSXGraph.initBoard('jsxbox$slib_number', \
  {boundingbox:[$[$(slib_tmin)-1],$slib_ymax,$slib_tmax,$slib_ymin],axis:true,grid:true,showCopyright:false});\
\
  $slib_script_cursor\
  var L=$brd.create('line',[[$slib_tmin,0],[$slib_tmin,$slib_ymax]],{fixed:true});\
    starty$slib_number = $brd.create('$slib_glider', [0, $(slib_init[2]), L], {name:'$slib_n_y',strokeColor:'$slib_colory',fillColor:'$slib_colory',snapWidth:1});\
    startx$slib_number = $brd.create('$slib_glider', [0, $(slib_init[1]),L], {name:'$slib_n_x',strokeColor:'$slib_colorx',fillColor:'$slib_colorx'});\
\
    /* Variables for the JXG.Curves*/\
    var gy$slib_number = null;\
    var gx$slib_number = null;\
  var txt1_$slib_number = $brd.jc.snippet('$slib_f1',true,'x,y,t');\
  var txt2_$slib_number = $brd.jc.snippet('$slib_f2',true,'x,y,t');\
  var f$slib_number = function (t, xx){return [txt1_$slib_number(xx[0], xx[1],t), txt2_$slib_number(xx[0], xx[1], t)]};\
\
    /* Initialise ODE and solve it with JXG.Math.Numerics.rungeKutta()*/\
    function ode$slib_number(f) {\
        /* evaluation interval*/\
        var I = [$slib_tmin, $slib_tmax];\
        /* Number of steps. 1000 should be enough*/\
        var N = 1000;\
 \
        /* Initial value*/\
        var x0 = [startx$slib_number.Y(), starty$slib_number.Y()];\
 \
        /* Solve ode*/\
        var data = JXG.Math.Numerics.rungeKutta('rk4', x0, I, N, f);\
\
        /* to plot the data against time we need the times where the equations were solved*/\
        var t$slib_number = [];\
        var q = I[0];\
        var h = (I[1]-I[0])/N;\
        for(var i=0; i<data.length; i++) {\
            data[i].push(q);\
            q += h;\
        };\
        return data;\
    };\
var data$slib_number = ode$slib_number(f$slib_number);\
\
    /* copy data to arrays so we can plot it using JXG.Curve*/\
    var t$slib_number = [];\
    var datax$slib_number = [];\
    var datay$slib_number = [];\
    for(var i=0; i<data$slib_number.length; i++) {\
        t$slib_number[i] = data$slib_number[i][2];\
        datay$slib_number[i] = data$slib_number[i][1];\
        datax$slib_number[i] = data$slib_number[i][0];\
    };\
    /* Plot x*/\
    gx$slib_number = $brd.create('curve', [t$slib_number, datax$slib_number], {strokeColor:'$slib_colorx', strokeWidth:'2px'});\
    gx$slib_number.updateDataArray = function() {\
        var data = ode$slib_number(f$slib_number);\
        this.dataX = [];\
        this.dataY = [];\
        for(var i=0; i<data.length; i++) {\
            this.dataX[i] = t$slib_number[i];\
            this.dataY[i] = data[i][0];\
        }\
    };

!if $slib_dim!=1
   slib_script_main= $slib_script_main\
   /* Plot y*/\
    gy$slib_number = $brd.create('curve', [t$slib_number, datay$slib_number], {strokeColor:'$slib_colory', strokeWidth:'2px'});\
    gy$slib_number.updateDataArray = function() {\
        var data = ode$slib_number(f$slib_number);\
        this.dataX = [];\
        this.dataY = [];\
        for(var i=0; i<data.length; i++) {\
            this.dataX[i] = t$slib_number[i];\
            this.dataY[i] = data[i][1];\
        }\
    };

!endif

!readproc slib/geo2D/jsxgraph jsxbox$slib_number, $slib_size1 x $slib_size1, $slib_script_main

!if $slib_dim!=1
  slib_out_main=$slib_out

  slib_script_child=var $brd1 = JXG.JSXGraph.initBoard('jsxboxchild$slib_number', {boundingbox: [$slib_ymin,$slib_ymax,$slib_ymax,$slib_ymin], axis:true,grid:true,showCopyright:false});\
  $brd1.renderer.container.style.backgroundColor ='white';\
  var gxy$slib_number=$brd1.create('curve', [datax$slib_number, datay$slib_number], {strokeColor:'$slib_colorxy', strokeWidth:'2px'});\
    gxy$slib_number.updateDataArray = function() {\
        var data = ode$slib_number(f$slib_number);\
        this.dataX = [];\
        this.dataY = [];\
        for(var i=0; i<data.length; i++) {\
            this.dataX[i] = data[i][0];\
            this.dataY[i] = data[i][1];\
        }\
    };\
    $brd.addChild($brd1);

  !reset slib_script_main slib_size
  !readproc slib/geo2D/jsxgraph jsxboxchild$slib_number, $slib_size1 x $slib_size1, $slib_script_child
  slib_out=!replace internal class="jxgbox" by class="jxgboxchild" in $slib_out
  slib_out=$slib_out_main\
  $slib_out
!endif