Mijn oude simulaties van de universiteit doen het sinds enkele jaren meer. Daarom heb ik begin maart de taak op me genomen een nieuw simulatiesysteem op te zetten, maar dan zonder Java en zonder Java-applets. Het is nog lang niet af, maar gewoon even een tussendoortje om de huidige web-technieken, methoden en concepten (zoals JavaScript, HTML5 en THESIS-concepten) voor diverse browsers op het internet uit te proberen. De eerste versie is in een weekje gemaakt. De tweede versie duurde drie weken! En is vooralsnog heel experimenteel. Het is een concept (en voor mij een sjabloon) waarin ook andere wiskundige modellen getest kunnen worden. Het betreft nu een 'internet software systeem' om de output van een wiskundig model om groeiende grafieken en animaties op een beeldscherm te kunnen krijgen. Het gedrag van het wiskundig model wordt dan gesimuleerd voor onderwijsdoeleinden.
Hieronder vind je dan ook mijn nieuwste 'simulatieprogramma' Het is een losse compacte 'simulator'. De simulator is gemaakt met dit simulatiesysteem. Het wiskundig model hier is het 'viskweekvijver' model van de Universiteit Wageningen. Oorspronkelijk komt het van wetenschappers uit de Sovjet Unie. P. van Schaik Zillesen heeft dit met een team van de Stichting Leerplanontwikkeling Enschede (SLO) rond 1989 ontwikkeld. Daarna heb ik het model (Viskweekvijver versie 16 dec 2001) rond 2003 in Java op het internet gezet [Referentie: P. van Schaik Zillesen, A. Hartsuijker, J. Hondebrink en V. Labordus, Informatica project Voortgezet Onderwijs, Natuuronderwijs 12-16 jarigen. 'Een vijver in de computer', SLO, 1989, ISBN 90 329 0809 X. Werkboek en floppy. Zie foto's onderin].
Deze simulator heeft grafische output en enkele 'model-driven animaties' plus twee 'parallelle instructies', ontworpen conform de 'Parallelle Instructie' theorie van Min en de 'Cognitive Laod' theorie van Mayer [R. Min, de PI theorie, 2004, R. Maijer, the Cognitive Load, 2002].
Als je TT wat kleiner maakt, loopt de tijd over een langere periode.
Als je TT wat groter maakt, loopt de tijd over een kortere periode.
DIT IS HET (VOORLOPIGE) SIMULATIE- EN ANIMATIEGEDEELTE:
Herstarten doe je met pagina vernieuwen.
NUMERIEKE OUTPUT:
2. AAA: (losse sinus) (dummy)
3. TEMP_SEIZOEN: (in zomer 22 graden)
4. L_SEIZOEN: (in zomer positief anders negatief)
Tijd (t): (0 --> 360?)
N, O, F en P:
1. Nitraat N: (bovenste zwarte lijn) (op t=0: 0.15)
5. Zuurstof O: (orange) (op t=0: 9.8)
6. Algen F: (onderste zwarte lijn) (op t=0: 20.0)
7. Phosfaat P: (op t=0: 0.3)
Flows:
9. QGF mbt. F: (Q)
10. QFZ F mbt. Z: (Q)
11. QFB F mbt. B: (Q)
12. QDP D mbt. P: (Q)
13. QAC A mbt. C: (flow)
15. QDN D mbt. N: (flow)
17. QFO F mbt. O: (flow)
23. QFS F mbt. S: (flow)
24. QFO F mbt. O: (flow)
25. QAC: (flow)
26. QAD: (flow)
27. QOD: (flow)
Interventies:
14. PU: (fixed)
16. NU: (fixed)
18. OU: (fixed)
20. AU: (fixed)
Visvoer:
19. A: (op t=0: 0) (Rood?)
Afval:
8. D: (op t=0: 7.2) (Bruin?)
Watervlooien (Z):
30. F mbt. Z:
31. D mbt. Z:
32. O mbt. Z:
--> Z: (op t=0: 0 of 10)
Bodemdieren (B):
40. F mbt. B:
41. Z mbt. B:
42. D mbt. B:
43. O mbt. B:
--> B: (op t=0: 0 of 10)
Karpers:
50. Z mbt. C:
51. B mbt. C:
52. A mbt. C:
53. O mbt. C:
--> C: Karpers (op t=0: 100) (Oranje?)
Zilverkarpers:
60. D mbt. S:
61. O mbt. S:
62. F mbt. S:
--> S: Zilverkarpers (op t=0: 50) (Geel?)
Restjes:
70. FF(L,F,D):
71. E1(TEMP):
72. E2(O):
73. E3(O):
74. W(MUFSMAX,HLP7,F):
75. REA:
76. TEMP:
77. L:
Output-voorbeeld - startwaardes en (mogelijke) eindwaarden:
|
De extinctie-functie, de instraling, geeft aan hoe hoe helder het water is. Bij 0 is het water helder; bij 1 is het water zeer vies. Naar mate er minder licht is/komt, wordt het zicht beperkt. Naar mate de extinctie hoger is, wordt het licht minder.
REFERENTIES:
Viskweekvijver (kaal): https://www.rikmin.nl/Examples/Vijver/V5.htm
Viskweekvijver (achtergronden): https://www.rikmin.nl/Book/7.html
Hierna (in april en mei 2025) ga ik met deze systeemvariant verder om de vloeistoffen huishouding in het menselijk lichaam te simularen en het cardiovasculaire systeem van CARDIO (Coleman) en HUMAN (Guyton). De oude versies gebruikte java. De nieuwe versie dus alleen JavaScript en HTML5.
Rik Min, Enschede. Eerste versie ('de druk in de aorta'): 12 t/m 19 mrt. 2025. Tweede versie ('vissen kweken in een viskweekvijver'). Ontwikkelperiode 24 mrt - 14 april 2025.
NAWOORD: De afgelopen jaren werd java en mijn java-applets als virussen beschouwd. Ik kon er niet meer met goed fatsoen mensen mee laten werken. In maart 2025 had ik ook nog eens een paar slechte (politieke) weken. De geo-politiek stond mij totaal niet aan. Om mij af te reageren ben ik een paar uur per dag aan het programmeren geslagen. Nu met HTML5 en alleen met JavaScript, zonder Java en zonder mijn oude library's als SimLib en WebLib. (Zie elders.)
Rik Min, met dank aan Piet v. Schaick Zillesen, bioloog (ISM/TO/UT) & Jan de Goeijen. Model: Universiteit Wageningen. Studenten: Saskia Meulman, JS, AH, CW en AS. Eerste internet versie rond 2002: Daarna geupdated: 2004, 2010, 2019 en 2020. Weer latere versies: Start 27 maart 2024. Afgerond: 16 april 2025.
All starting values KPF = 0.1; KNF = 0.1; KFZ = 15.0; KDZ = 60.0; KFB = 15.0; KZB = 1.0; KDB = 60.0; KZC = 1.0; KBC = 5.0; KAC = 0.2; KFS = 20.0; KDS = 60.0; MUFMAX = 4.5; MUFZMAX = 1.4; MUDZMAX = 0.5; MUFBMAX = 0.2; MUZBMAX = 0.4; MUDBMAX = 0.2; MUZCMAX = 0.02; MUBCMAX = 0.06; MUACMAX = 0.03; MUFSMAX = 0.1; MUDSMAX = 0.07; hier ontbrak bij ergens MUxxxMAX, MBF = 0.3; MBZ = 0.3; MBB = 0.3; MBC = 0.3; MBS = 0.3; MBBC = 0.4; MBBS = 0.4; RCMAX = 13.0; RSMAX = 10.0; MBOF = 0.001; MBOZ = 0.001; MBOB = 0.001; MBOC = 0.001; MBOS = 0.001; MF = 0.025; MZ = 0.005; MB = 0.05; RESPF = 0.001; RESPZ = 0.01; RESPB = 0.01; RESPC = 0.01; RESPS = 0.01; UDP = 0.00004; UDN = 0.002; PHOT = 1.0; ALPHA = 0.2; RE = 0.4; OKT = 0.085; SED = 0.05; SEDP = 0.1; LOPT = 3000.0; KW = 0.2; KF = 0.05; KD = 0.8; KPD = 0.5; HK = 0.1; BKR = 20.0; ZCR = 5.0; FCR = 30.0; MB2 = 10.0; MZ2 = 3.0; MF2 = 15.0; LABDAB = 1.0; LABDAZ = 1.0; LABDAF = 1.0; KA = 2.0; MK = 5.0; COP = 2.0; MG = 1.0; COD = 2.0; HLP1 = MBBC / RCMAX; HLP2 = MBBS / RSMAX; HLP3 = XKWAD (KPF); HLP4 = XKWAD (KNF); HLP5 = XKWAD (KFZ); HLP6 = XKWAD (KFB); HLP7 = XKWAD (KFS); HLP8 = XKWAD (KDZ); HLP9 = XKWAD (KZB); HLP10 = XKWAD (KBC); HLP11 = W(MUBCMAX, HLP10, BKR); HLP12 = XKWAD (KZC); HLP13 = XKWAD (KDB); HLP14 = XKWAD (KAC); HLP15 = XKWAD (KDS); Topt[1]=24.0; Topt[2]=24.0; Topt[3]=24.0; Topt[4]=26.0; Topt[5]=26.0; Topt[6]=26.0; Q1[1]=15.0;//=24-9 Q1[2]=15.0; Q1[3]=15.0; Q1[4]=14.0; Q1[5]=12.5; Q1[6]=11.0; Q2[1]=10.0;//=34-24 Q2[2]=10.0; Q2[3]=10.0; Q2[4]=11.0; Q2[5]=11.0; Q2[6]=11.0; M[1]=3.0;//dummy M[2]=3.0;//zuurstofhalfwaarde voor onderhoud Z M[3]=3.0;//dummy M[4]=3.0;//zuurstof ... C M[5]=3.0;//zuurstof ... S M[6]=3.0;//zuurstof ... H LABDA[1]=1.0;//dummy LABDA[2]=1.0;//helling zuurstofcurve Z LABDA[3]=1.0;//dummy LABDA[4]=1.0;//helling zuurstofcurve C LABDA[5]=1.0;//helling zuurstofcurve S LABDA[6]=1.0;//helling zuurstofcurve H F = 20.0; Z = 0.0; B = 0.0; C = 0.0; S = 0.0; P = 0.03; N = 0.15; O = 9.8; A = 0.0; D = 7.2; L = 0.0; F0 = 2.0; L_JAARMAX = 3000.0; TEMP_JAARMAX = 20.0; REA = REA_MOMENT(); TEMP = TEMP_MOMENT(); NU = 0.0; PU = 0.0; OU = 0.0; AU = 0.0; DPU = 0.01; DNU = 0.03; PTOEG = 0.0; NTOEG = 0.0; OTOEG = 0.0; VTOEG = 0.0; Tmin = 0.0; T = 0.0; dt = 0.04; Tmax = 30.1; }
double TEMP_MOMENT() { double TEMP_TIJD, TEMP_SEIZOEN, resultaat; TEMP_TIJD = -Math.cos(6.283185 * (T - Math.floor(T))); TEMP_SEIZOEN = 6+6+((1-Math.cos(t*0.0172142))*(TEMP_JAARMAX-7)*0.5); resultaat = TEMP_SEIZOEN * TEMP_TIJD; return resultaat; } double L_MOMENT() { double L_NU, L_TIJD, L_SEIZOEN, resultaat; L_TIJD = - Math.cos( 6.283185 * (T - Math.floor(T))); L_SEIZOEN = - Math.cos(T * 0.0172142) * 0.5; L_NU = (L_TIJD + L_SEIZOEN) * L_JAARMAX / 1.5; if (L_NU < 0.0) {resultaat = 0.0;} else {resultaat = L_NU;} return resultaat; } double REA_MOMENT() { double TEMPTEMP, TEMPTEMPTEMP, resultaat; TEMPTEMP = XKWAD(TEMP); TEMPTEMPTEMP = TEMPTEMP * TEMP; resultaat = 14.61996 -0.40420 * TEMP + 0.00842 * TEMPTEMP - 0.00009 * TEMPTEMPTEMP; return resultaat; }
The model in the loop PU = Input1.getValue(); // pakt hier de benodigde de parameters NU = Input2.getValue(); AU = Input3.getValue(); OU = Input4.getValue(); T = T + dt; // Ik nam kleine t en geen grote T! TEMP = TEMP_MOMENT(); L = L_MOMENT(); REA = REA_MOMENT(); PKWAD = XKWAD(P); NKWAD = XKWAD(N); QGF = FT(1)*FF(L,F,D)*MUFMAX*MIN(PKWAD/(HLP3+PKWAD),NKWAD/(5*(HLP4 +NKWAD)))*F; QFZ = FT(2)*FO(2) * W(MUFZMAX,HLP5,F)*Z; QFB = FT(3)*W(MUFBMAX,HLP6,F)*B; QFS = FT(5)*FO(5) * S*W(MUFSMAX,HLP7,F); QFD = MBF*QGF; if (F > F0) {QFD = QFD + MF*F;}; QFE = MBOF*F; QDZ = FT(2)*FO(2) * Z*W(MUDZMAX,HLP8,D); QZB = FT(3) * W(MUZBMAX,HLP9,Z)*B; HLP16 = W(MUBCMAX,HLP10,B); QZC = FT(4)*FO(4)*MIN((HLP11-HLP16),(W(MUZCMAX,HLP12,Z)*JOTA(B,LABDAB,MB2)))*C; QZD = MBZ*(QFZ + QDZ) + FOX(O)*MZ*Z; QZE = MBOZ*Z; QDB = FT(3)*B*W(MUDBMAX,HLP13,D); QBC = FT(4)*FO(4)*HLP16*C; // probleem?? QBD = MBB * (QFB + QZB + QDB); QBE = MBOB*B; QAC = FT(4) * FO(4) * C*W(MUACMAX,HLP14,A); QDS = FT(5) * FO(5) * S*W(MUDSMAX,HLP15,D); RC = QAC * QBC + QZC; RS = QFS + QDS; QCD = (MBC + HLP1 * RC) * RC; QCE = MBOC * C; QSD = (MBS + HLP2 * RS) * RS; QSE = MBOS * S; QDP = UDP * E1(TEMP) * E2(O) * D; QPF = QGF / 106.0; QPD = SEDP * E3(O) * P; QDN = UDN * E1(TEMP) * E2(O) * D; QNF = QGF * 0.0472; QFO = PHOT * QGF; QOF = RESPF * F; QOZ = RESPZ * Z; QOB = RESPB * B; QOC = RESPC * C; QOS = RESPS * S; QOD = OKT * D; QAD = ALPHA * A; DELTAPU = PU * dt; DELTANU = NU * dt; DELTAOU = OU * dt; DELTAAU = AU * dt; DFDT = (QGF - QFZ - QFB - QFS - QFD - QFE)*dt; DZDT = (QFZ + QDZ - QZB - QZC - QZD - QZE)*dt; DBDT = (QFB + QZB + QDB - QBC - QBD - QBE)*dt; DCDT = (QAC + QBC + QZC - QCD - QCE)*dt; DSDT = (QFS + QDS - QSD - QSE)*dt; DPDT = DELTAPU + (QDP - QPF - QPD + DPU)*dt; DNDT = DELTANU + (QDN - QNF + DNU)*dt; DODT = DELTAOU + (QFO + RE * (REA - O) - QOF - QOZ - QOB - QOC - QOS - QOD)*dt; DADT = DELTAAU + (AU - QAC - QAD)*dt; DDDT = (QFD +QZD +QBD +QCD +QSD +QAD -QPD -QDN -QDZ -QDB -QDS -SED*D)*dt; F = F + DFDT; if (F < 0.0) {F = 0.0;} Z = Z + DZDT; if (Z < 0.0) {Z = 0.0;} B = B + DBDT; if (B < 0.0) {B = 0.0;} C = C + DCDT; if (C < 0.0) {C = 0.0;} S = S + DSDT; if (S < 0.0) {S = 0.0;} P = P + DPDT; if (P < 0.0) {P = 0.0;} N = N + DNDT; if (N < 0.0) {N = 0.0;} O = O + DODT; if (O < 0.0) {O = 0.0;} A = A + DADT; if (A < 0.0) {A = 0.0;} D = D + DDDT; if (D < 0.0) {D = 0.0;} PTOEG = PTOEG + DELTAPU; NTOEG = NTOEG * DELTANU; OTOEG = OTOEG + DELTAOU; VTOEG = VTOEG + DELTAAU;
Graph1.newValue(N);
Graph2.newValue(TEMP);
Graph3.newValue(QDP);
Graph4.newValue(E1(TEMP));
Graph5.newValue(O);
Graph6.newValue(F);
Graph7.newValue(P);
Graph8.newValue(E2(O));
Text1.setText(Double.toString(N));
Text2.setText(Double.toString(TEMP));
Text3.setText(Double.toString(QDP));
Text4.setText(Double.toString(E1(TEMP)));
Text5.setText(Double.toString(O));
Text6.setText(Double.toString(F));
Text7.setText(Double.toString(P));
Text8.setText(Double.toString(E2(O)));
until (T < Tmax);
Enschede, 16/dec/2001