diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2019-02-04 13:09:03 +0100 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2019-02-04 13:09:03 +0100 |
commit | 04e68443040c7abad84d66477e98f93bed701760 (patch) | |
tree | 2b6202afae659e773bf6916157d23e83edfa44e3 /app/schulis-simulationssystem/3.0/src/ls zustaende parameter kurve | |
download | eumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.gz eumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.bz2 eumel-src-04e68443040c7abad84d66477e98f93bed701760.zip |
Initial import
Diffstat (limited to 'app/schulis-simulationssystem/3.0/src/ls zustaende parameter kurve')
-rw-r--r-- | app/schulis-simulationssystem/3.0/src/ls zustaende parameter kurve | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/app/schulis-simulationssystem/3.0/src/ls zustaende parameter kurve b/app/schulis-simulationssystem/3.0/src/ls zustaende parameter kurve new file mode 100644 index 0000000..4b16b2a --- /dev/null +++ b/app/schulis-simulationssystem/3.0/src/ls zustaende parameter kurve @@ -0,0 +1,6 @@ +PACKETzustaendeparameterkurveDEFINESneuekurve,neuerzustand,text,neuerparameter,platz,replace,SUB,schreibe,schreibebeobachtungspunkt,minimalwerte,maximalwerte,leseerstenbeobachtungspunkt,lesenaechstenbeobachtungspunkt,leseersten,lesenaechsten,lesevorherigen,naechstezeit,vorherigezeit,KURVE,ZUSTAND,PARAMETER,DSUB,:=,CAT,copy,zustand,parameter,endederloesung,anfangderloesung,endedestabspeichers,letzterwert,letztezeit,PLUS,kurve1,epsilon,imdefbereich:LETmaxdimension=20;LETmaxpunktspeicher=1000,maxbpunktspeicher=1000;LETreallaenge=8;LETtypnrkurve=1088;REAL CONSTdelta:=0.001;REAL CONSTminusdelta:=-0.001;LETstoptaste="a",abbruch=36,kurveleer=99;TYPE ZUSTAND=STRUCT(ROWmaxdimensionREALkoordinate,INTdimension);TYPE PARAMETER=STRUCT(ZUSTANDvektor);LET PUNKT=STRUCT(TEXTvektor,REALzeit);LET PUNKTE=STRUCT(INTzeilen,INTzeilenposition,ROWmaxpunktspeicherPUNKTtupel);LET BEOBACHTUNGSPUNKTE=STRUCT(INTzeilen,INTzeilenposition,ROWmaxbpunktspeicherPUNKTtupel);TYPE KURVE=BOUND STRUCT(INTinternedimension,PUNKTEpunkte,TEXTdsname,BEOBACHTUNGSPUNKTEbpunkte,ZUSTANDminimum,maximum);REAL VAReps:=0.0000000005;LETminh=0.00005;REAL CONSTnull:=1.0/1.0e60;PROCepsilon(REAL CONSTepseingabe):eps:=epseingabeEND PROCepsilon;ZUSTAND OP+(ZUSTAND CONSTa,ZUSTAND CONSTb):INT VARi;ZUSTAND VARz;FORiFROM1UPTOa.dimensionREPz.koordinate(i):=a.koordinate(i)+b.koordinate(i)PER;z.dimension:=a.dimension;z.END OP+;ZUSTAND OP PLUS(ZUSTAND CONSTa,ZUSTAND CONSTb):INT VARi;ZUSTAND VARz;FORiFROM1UPTOa.dimensionREPz.koordinate(i):=a.koordinate(i)PER;FORiFROMa.dimension+1UPTOa.dimension+b.dimensionREPz.koordinate(i):=b.koordinate(i-a.dimension)PER;z.dimension:=a.dimension+b.dimension;z.END OP PLUS;ZUSTAND OP*(REAL CONSTzahl,ZUSTAND CONSTb):INT VARi;ZUSTAND VARz;z.dimension:=b.dimension;FORiFROM1UPTOb.dimensionREPz.koordinate(i):=zahl*b.koordinate(i)PER;z.END OP*;ZUSTAND OP-(ZUSTAND CONSTa,ZUSTAND CONSTb):a+((-1.0)*b)END OP-;INT OP DSUB(ZUSTAND CONSTz):z.dimensionEND OP DSUB;ZUSTAND PROCneuerzustand(INT CONSTdimension):ZUSTAND VARz;INT VARi;FORiFROM1UPTOdimensionREPz.koordinate(i):=0.0PER;z.dimension:=dimension;zEND PROCneuerzustand;PARAMETER PROCneuerparameter(INT CONSTdimension):PARAMETER VARp;p.vektor:=neuerzustand(dimension);pEND PROCneuerparameter;PROCreplace(ZUSTAND VARzustand,INT CONSTi,REAL CONSTwert):IFdecimalexponent(wert)<-126THENzustand.koordinate(i):=0.0ELSEzustand.koordinate(i):=wertFI END PROCreplace;PROCreplace(PARAMETER VARparameter,INT CONSTindex,REAL CONSTwert):replace(parameter.vektor,index,wert);END PROCreplace;REAL OP SUB(ZUSTAND CONSTzustand,INT CONSTi):zustand.koordinate(i)ENDOP SUB;REAL OP SUB(PARAMETER CONSTparameter,INT CONSTi):parameter.vektorSUBiENDOP SUB;TEXT PROCtext(ZUSTAND CONSTz):INT VARi;TEXT VARt:=(z.dimension*reallaenge)*"�";FORiFROM1UPTOz.dimensionREP IFdecimalexponent(z.koordinate(i))<-126THENreplace(t,i,0.0)ELSEreplace(t,i,z.koordinate(i))FI PER;tEND PROCtext;TEXT PROCtext(PARAMETER CONSTparameter):text(parameter.vektor)END PROCtext;ZUSTAND PROCzustand(TEXT CONSTt):INT VARi;ZUSTAND VARz:=neuerzustand(length(t)DIVreallaenge);FORiFROM1UPTOz.dimensionREPz.koordinate(i):=tRSUBiPER;zEND PROCzustand;PARAMETER PROCparameter(TEXT CONSTt):PARAMETER VARp;p.vektor:=zustand(t);pEND PROCparameter;OP:=(KURVE VARkurve,DATASPACE CONSTspace):CONCR(kurve):=spaceENDOP:=;DATASPACE PROCneuekurve(INT CONSTdimension,TEXT CONSTdsname):KURVE VARkurve;forget(dsname,quiet);kurve:=new(dsname);kurve.dsname:=dsname;kurve.minimum:=neuerzustand(dimension);kurve.maximum:=neuerzustand(dimension);kurve.internedimension:=dimension+1;kurve.punkte.zeilenposition:=1;kurve.punkte.zeilen:=0;kurve.bpunkte.zeilenposition:=1;kurve.bpunkte.zeilen:=0;type(old(dsname),typnrkurve);old(dsname).ENDPROCneuekurve;PROCschreibe(KURVE VARkurve,REAL CONSTzeit,ZUSTAND CONSTz):IFnochplatzda(kurve)THEN IFkurve.punkte.zeilenposition=1THENkurve.minimum:=z;kurve.maximum:=z;ELSEpruefeobkomponentenminimalodermaximalFI;kurve.punkte.tupel(kurve.punkte.zeilenposition).vektor:=text(z);IFdecimalexponent(zeit)<-126 +THENkurve.punkte.tupel(kurve.punkte.zeilenposition).zeit:=0.0ELSEkurve.punkte.tupel(kurve.punkte.zeilenposition).zeit:=zeit;FI;kurve.punkte.zeilenpositionINCR1;kurve.punkte.zeilenINCR1FI.pruefeobkomponentenminimalodermaximal:INT VARi;FORiFROM1UPTOz.dimensionREP IFz.koordinate(i)<kurve.minimum.koordinate(i)THENkurve.minimum.koordinate(i):=z.koordinate(i)ELIFz.koordinate(i)>kurve.maximum.koordinate(i)THENkurve.maximum.koordinate(i):=z.koordinate(i)FI PER.ENDPROCschreibe;PROCschreibebeobachtungspunkt(KURVE VARkurve,REAL CONSTzeit,ZUSTAND CONSTz):IFnochtabplatzda(kurve)CANDnochplatzda(kurve)THENschreibe(kurve,zeit,z);schreibeintabspeicherFI.schreibeintabspeicher:kurve.bpunkte.tupel(kurve.bpunkte.zeilenposition).vektor:=text(z);kurve.bpunkte.tupel(kurve.bpunkte.zeilenposition).zeit:=zeit;kurve.bpunkte.zeilenpositionINCR1;kurve.bpunkte.zeilenINCR1.ENDPROCschreibebeobachtungspunkt;ZUSTAND PROCminimalwerte(KURVE CONSTkurve):kurve.minimumENDPROCminimalwerte;ZUSTAND PROCmaximalwerte(KURVE CONSTkurve):kurve.maximumENDPROCmaximalwerte;BOOL PROCnochplatzda(KURVE VARkurve):NOT(kurve.punkte.zeilenposition>maxpunktspeicher)END PROCnochplatzda;BOOL PROCnochtabplatzda(KURVE VARkurve):NOT(kurve.bpunkte.zeilenposition>maxbpunktspeicher)END PROCnochtabplatzda;BOOL PROCplatz(KURVE CONSTkurve):NOT(kurve.punkte.zeilenposition>maxpunktspeicher)END PROCplatz;PROCleseersten(KURVE VARkurve,REAL VARzeit,ZUSTAND VARz):kurve.punkte.zeilenposition:=1;lieszeit;lieskoordinaten.lieszeit:zeit:=kurve.punkte.tupel(kurve.punkte.zeilenposition).zeit.lieskoordinaten:z:=zustand(kurve.punkte.tupel(kurve.punkte.zeilenposition).vektor).END PROCleseersten;PROClesenaechsten(KURVE VARkurve,REAL VARzeit,ZUSTAND VARz):IF NOTendederloesung(kurve)THENkurve.punkte.zeilenpositionINCR1;lieszeit;lieskoordinaten;ELSEz:=neuerzustand(kurve.internedimension-1)FI.lieszeit:zeit:=kurve.punkte.tupel(kurve.punkte.zeilenposition).zeit.lieskoordinaten:z:=zustand(kurve.punkte.tupel(kurve.punkte.zeilenposition).vektor).END PROClesenaechsten;PROClesevorherigen(KURVE VARkurve,REAL VARzeit,ZUSTAND VARz):IF NOTanfangderloesung(kurve)THENkurve.punkte.zeilenpositionDECR1;lieszeit;lieskoordinaten;ELSEz:=neuerzustand(kurve.internedimension-1)FI.lieszeit:zeit:=kurve.punkte.tupel(kurve.punkte.zeilenposition).zeit.lieskoordinaten:z:=zustand(kurve.punkte.tupel(kurve.punkte.zeilenposition).vektor).END PROClesevorherigen;PROCvorherigezeit(KURVE VARkurve,REAL VARzeit):IF NOTanfangderloesung(kurve)THENlieszeit;FI.lieszeit:zeit:=kurve.punkte.tupel(kurve.punkte.zeilenposition-1).zeit.END PROCvorherigezeit;PROCnaechstezeit(KURVE VARkurve,REAL VARzeit):IF NOTendederloesung(kurve)THENlieszeit;FI.lieszeit:zeit:=kurve.punkte.tupel(kurve.punkte.zeilenposition+1).zeit.END PROCnaechstezeit;PROCleseerstenbeobachtungspunkt(KURVE VARkurve,REAL VARzeit,ZUSTAND VARz):kurve.bpunkte.zeilenposition:=1;lieszeit;lieskoordinaten;kurve.bpunkte.zeilenpositionINCR1.lieszeit:zeit:=kurve.bpunkte.tupel(kurve.bpunkte.zeilenposition).zeit.lieskoordinaten:z:=zustand(kurve.bpunkte.tupel(kurve.bpunkte.zeilenposition).vektor).END PROCleseerstenbeobachtungspunkt;PROClesenaechstenbeobachtungspunkt(KURVE VARkurve,REAL VARzeit,ZUSTAND VARz):IF NOTendedestabspeichers(kurve)THENzeitlesen;koordinatenlesen;kurve.bpunkte.zeilenpositionINCR1ELSEz:=neuerzustand(kurve.internedimension-1)FI.zeitlesen:zeit:=kurve.bpunkte.tupel(kurve.bpunkte.zeilenposition).zeit.koordinatenlesen:z:=zustand(kurve.bpunkte.tupel(kurve.bpunkte.zeilenposition).vektor).END PROClesenaechstenbeobachtungspunkt;BOOL PROCendederloesung(KURVE VARkurve):kurve.punkte.zeilenposition>=kurve.punkte.zeilenEND PROCendederloesung;BOOL PROCanfangderloesung(KURVE VARkurve):kurve.punkte.zeilenposition<=1END PROCanfangderloesung;BOOL PROCendedestabspeichers(KURVE CONSTkurve):kurve.bpunkte.zeilenposition>kurve.bpunkte.zeilenEND PROCendedestabspeichers;OP:=(KURVE VARa,KURVE CONSTb):CONCR(a):=old(b.dsname)END OP:=;PROCcopy(KURVE VARa,TEXT CONSTdsname,KURVE CONSTb):IFexists(dsname)THENforget(dsname, +quiet)FI;copy(b.dsname,dsname);CONCR(a):=old(dsname);a.dsname:=dsname;ENDPROCcopy;OP:=(ZUSTAND VARa,ZUSTAND CONSTb):a.dimension:=b.dimension;INT VARi;FORiFROM1UPTOb.dimensionREP IFdecimalexponent(b.koordinate(i))<-126THENa.koordinate(i):=0.0ELSEa.koordinate(i):=b.koordinate(i)FI PER END OP:=;OP:=(PARAMETER VARa,PARAMETER CONSTb):a.vektor:=b.vektorEND OP:=;OP CAT(KURVE VARa,b):ersterpunkt;ersterbpunkt;WHILEnochplatzda(a)CAND NOTendederloesung(b)REPfuegenaechstenpunktanPER;WHILEnochtabplatzda(a)CAND NOTendedestabspeichers(b)REPfuegenaechstenbeobachtungspunktanPER.ersterpunkt:REAL VARt;ZUSTAND VARz;leseersten(b,t,z);a.punkte.zeilenposition:=a.punkte.zeilen+1.ersterbpunkt:leseerstenbeobachtungspunkt(b,t,z);a.bpunkte.zeilenposition:=a.bpunkte.zeilen+1.fuegenaechstenpunktan:lesenaechsten(b,t,z);schreibe(a,t,z).fuegenaechstenbeobachtungspunktan:lesenaechstenbeobachtungspunkt(b,t,z);a.bpunkte.tupel(a.bpunkte.zeilenposition).vektor:=text(z);a.bpunkte.tupel(a.bpunkte.zeilenposition).zeit:=t;a.bpunkte.zeilenpositionINCR1;a.bpunkte.zeilenINCR1.END OP CAT;ZUSTAND PROCletzterwert(KURVE CONSTkurve):zustand(kurve.punkte.tupel(kurve.punkte.zeilen).vektor)END PROCletzterwert;REAL PROCletztezeit(KURVE CONSTkurve):IFkurve.punkte.zeilen=0THEN0.0ELSEkurve.punkte.tupel(kurve.punkte.zeilen).zeitFI END PROCletztezeit;REAL CONSTsechzehnneuntel:=16.0/9.0,vierundsechzigneuntel:=64.0/9.0,zweihundertsechsundfuenfzigneuntel:=256.0/9.0,neunviertel:=9.0/4.0;PROCdiffsys(REAL VARx,h0,zwischenzeit,ZUSTAND VARy,s,zwischenzustand,PARAMETER CONSTp,ZUSTAND PROC(REAL CONST,ZUSTAND CONST,PARAMETER CONST)funk):REAL VARa,b,b1,c,g,u,v,ta,fc;INT VARi,j,k,kk,jj,l,m,r,sr,n,kplus1,jplus1,jjplus1;ZUSTAND VARya,yl,ym,dy,dz;BOOL VARkonv,bo,bh;ROW7ZUSTAND VARdt;ROW7REAL VARd;ROW8ZUSTAND VARyg,yh;enablestop;initialisierungen;berechneschrittweitefallsnoetig;REPa:=h0+x;fc:=1.5;bo:=FALSE;m:=1;r:=2;sr:=3;jj:=-1;FORjFROM0UPTO9REPabbruchfallsgewuenscht;jplus1:=j+1;IFboTHENd(2):=sechzehnneuntel;d(4):=vierundsechzigneuntel;d(6):=zweihundertsechsundfuenfzigneuntelELSEd(2):=neunviertel;d(4):=9.0;d(6):=36.0FI;konv:=(j>2);IFj>6THENl:=6;d(7):=64.0;fc:=0.6*fcELSEl:=j;d(jplus1):=real(m*m)FI;m:=m+m;g:=h0/real(m);b:=g+g;IFbhCANDj<8THEN FORiFROM1UPTOnREPym.koordinate(i):=yh(jplus1).koordinate(i);yl.koordinate(i):=yg(jplus1).koordinate(i)PER ELSEkk:=(m-2)DIV2;m:=m-1;FORiFROM1UPTOnREPyl.koordinate(i):=ya.koordinate(i);ym.koordinate(i):=ya.koordinate(i)+(g*dz.koordinate(i));PER;FORkFROM1UPTOmREPdy:=funk(x+(real(k)*g),ym,p);FORiFROM1UPTOnREPu:=(yl.koordinate(i))+b*(dy.koordinate(i));yl.koordinate(i):=ym.koordinate(i);ym.koordinate(i):=u;u:=abs(u);IFu>s.koordinate(i)THENs.koordinate(i):=uFI PER;IFk=kkCANDk<>2THENjj:=1+jj;jjplus1:=jj+1;yh(jjplus1).koordinate:=ym.koordinate;zwischenzustand.koordinate:=ym.koordinate;yg(jjplus1).koordinate:=yl.koordinate;zwischenzeit:=x+(real(k+1)*g);FI PER FI;dy:=funk(a,ym,p);FORiFROM1UPTOnREPv:=dt(1).koordinate(i);dt(1).koordinate(i):=(ym.koordinate(i)+yl.koordinate(i)+g*dy.koordinate(i))/2.0;c:=dt(1).koordinate(i);ta:=c;FORkFROM1UPTOlREPkplus1:=k+1;b1:=d(kplus1)*v;b:=b1-c;u:=v;IFabs(b)>0.0THENb:=(c-v)/b;u:=c*b;c:=b1*b;FI;v:=dt(kplus1).koordinate(i);dt(kplus1).koordinate(i):=u;ta:=u+taPER;IFabs(y.koordinate(i)-ta)>eps*s.koordinate(i)THENkonv:=FALSE FI;y.koordinate(i):=taPER;IFkonvTHENendeFI;d(3):=4.0;d(5):=16.0;bo:=NOTbo;m:=r;r:=sr;sr:=m+mPER;bh:=NOTbh;IFdecimalexponent(h0)>-120THENh0:=(h0/2.0);IFkleinstmoeglicheschrittweite(x,h0)>h0THENh0:=h0+h0;endeFI;ELSEendeFI PER.abbruchfallsgewuenscht:IFincharety=stoptasteTHENerrorstop(abbruch,"");FI;.initialisierungen:n:=y.dimension;IFn=0THENzwischenzeit:=x+h0/2.0;x:=x+h0;LEAVEdiffsys;FI;ya.dimension:=n;yl.dimension:=n;ym.dimension:=n;dy.dimension:=n;dz.dimension:=n;FORiFROM1UPTOnREPya.koordinate(i):=0.0;yl.koordinate(i):=0.0;ym.koordinate(i):=0.0;dy.koordinate(i):=0.0;dz.koordinate(i):=0.0;PER;FORiFROM1UPTO7REP FORjFROM1UPTOnREPdt(i).koordinate(j):=0.0PER;d(i):=0.0;dt(i).dimension:=n;PER;FORiFROM1UPTO8REP FORjFROM1UPTOnREPyg(i). +koordinate(j):=0.0;yh(i).koordinate(j):=0.0PER;yg(i).dimension:=n;yh(i).dimension:=n;PER;dz:=funk(x,y,p);bh:=FALSE;ya.koordinate:=y.koordinate;.berechneschrittweitefallsnoetig:IFkomponentennahe0THENberechneschrittweite(y,dz,x,h0)FI.komponentennahe0:FORiFROM1UPTOnREP IFabs(ySUBi)<minhCORabs(dzSUBi)<minhTHEN LEAVEkomponentennahe0WITH TRUE FI;PER;FALSE.ende:h0:=fc*h0;x:=a;LEAVEdiffsys.ENDPROCdiffsys;PROCberechneschrittweite(ZUSTAND CONSTy,dz,REAL CONSTt,REAL VARh0):INT CONSTn:=y.dimension;INT VARi;REAL CONSTh:=h0;FORiFROM1UPTOnREP IFabs(dzSUBi)>0.0CANDabs(ySUBi)>0.0THENh0:=min(h0,abs((ySUBi)/(dzSUBi)));FI;PER;IFh0=0.0THENh0:=hFI;h0:=max(h0,kleinstmoeglicheschrittweite(t,h0));.END PROCberechneschrittweite;REAL PROCkleinstmoeglicheschrittweite(REAL CONSTt,h0):REAL VARzw:=5.0;INT CONSTexponentvont:=decimalexponent(t);IFt=0.0THENh0ELIF(exponentvont-decimalexponent(h0))>12THENsetexp(exponentvont-12,zw);zwELSEh0FI.END PROCkleinstmoeglicheschrittweite;KURVE PROCkurve1(ZUSTAND PROC(REAL CONST,ZUSTAND CONST,PARAMETER CONST)fkt,ZUSTAND PROC(REAL CONST,ZUSTAND CONST,PARAMETER CONST)cofkt,ZUSTAND CONSTanfangswert,ZUSTAND CONSTunteregrenze,oberegrenze,REAL CONSTanfangszeitpunkt,REAL CONSTbeobachtungsdauer,PARAMETER CONSTparameter,INT CONSTbeo,codimension,TEXT CONSTdsname,INT VARfehler):KURVE VARkurve:=neuekurve(codimension+anfangswert.dimension,dsname);bereiteanfangvor;bearbeiteerstenpunkt;bearbeiteallenaechstenpunkte;kurve.bereiteanfangvor:INT VARm,n:=anfangswert.dimension;REAL VARbeobachtungszeitpunkt,beobachtungsabstand:=0.0,t,h0,h,hmax,zwischenzeit;ZUSTAND VARx:=neuerzustand(n),zwischenzustand:=neuerzustand(n),s:=neuerzustand(n);beobachtungsabstand:=beobachtungsdauer/real(beo-1);beobachtungsabstand:=max(kleinstmoeglicheschrittweite(anfangszeitpunkt,beobachtungsabstand),beobachtungsabstand);h0:=beobachtungsabstand;hmax:=h0;x:=anfangswert;t:=anfangszeitpunkt;berechneschrittweitemittest;beobachtungszeitpunkt:=anfangszeitpunkt;fehler:=0.berechneschrittweitemittest:disablestop;berechneschrittweite(x,fkt(t,x,parameter),t,h0);IFerrorda(fehler)CORbeobachtungsdauer=0.0THENfehler:=kurveleer;LEAVEkurve1WITHkurveFI.bearbeiteerstenpunkt:schreibeundtestebeomitcof(PROCcofkt,kurve,anfangszeitpunkt,anfangswert,parameter,fehler);IFaufgetreten(fehler)CORbeobachtungsdauer=0.0THENfehler:=kurveleer;LEAVEkurve1WITHkurveFI.bearbeiteallenaechstenpunkte:INT VARcursx:=0,cursy:=0;getcursor(cursx,cursy);FORmFROM1UPTObeo-1REPcursor(cursx,cursy);out(text(m));beobachtungszeitpunkt:=beobachtungszeitpunkt+beobachtungsabstand;verarbeitenaechstepunkte;IFaufgetreten(fehler)THEN LEAVEbearbeiteallenaechstenpunkteFI;schreibeundtestepunktmitcof(PROCcofkt,kurve,zwischenzeit,zwischenzustand,parameter,fehler);IF NOTaufgetreten(fehler)THENschreibeundtestebeomitcof(PROCcofkt,kurve,t,x,parameter,fehler);FI;IFaufgetreten(fehler)THEN LEAVEkurve1WITHkurveFI;PER.verarbeitenaechstepunkte:REP IFh0>hmaxTHENh0:=hmaxFI;IFt+h0>beobachtungszeitpunktTHENh:=h0;h0:=beobachtungszeitpunkt-t;IFh0>=kleinstmoeglicheschrittweite(t,h0)THENerhaltenaechstenpunkt;ELSE LEAVEverarbeitenaechstepunkteFI;h0:=hELSEerhaltenaechstenpunktFI;IFabs(t-beobachtungszeitpunkt)<nullTHEN LEAVEverarbeitenaechstepunkteELIFt>beobachtungszeitpunktTHEN LEAVEverarbeitenaechstepunkteFI;schreibepunktinkurvePER.erhaltenaechstenpunkt:disablestop;diffsys(t,h0,zwischenzeit,x,s,zwischenzustand,parameter,PROCfkt);IF NOTerrorda(fehler)THENfehler:=imdefbereich(x,unteregrenze,oberegrenze);FI;IFaufgetreten(fehler)THEN LEAVEverarbeitenaechstepunkteFI;.schreibepunktinkurve:schreibeundtestepunktmitcof(PROCcofkt,kurve,zwischenzeit,zwischenzustand,parameter,fehler);IFaufgetreten(fehler)THEN LEAVEkurve1WITHkurveFI.END PROCkurve1;BOOL PROCaufgetreten(INT CONSTfehler):fehler<>0.END PROCaufgetreten;PROCschreibeundtestepunktmitcof(ZUSTAND PROC(REAL CONST,ZUSTAND CONST,PARAMETER CONST)cofkt,KURVE VARkurve,REAL CONSTzwischenzeit,ZUSTAND CONSTzwischenzustand,PARAMETER CONSTparamliste,INT VARfehlernr):ZUSTAND VARhilfsvar;disablestop;hilfsvar:=cofkt( +zwischenzeit,zwischenzustand,paramliste);IF NOTerrorda(fehlernr)THENschreibe(kurve,zwischenzeit,zwischenzustandPLUShilfsvar);FI;END PROCschreibeundtestepunktmitcof;PROCschreibeundtestebeomitcof(ZUSTAND PROC(REAL CONST,ZUSTAND CONST,PARAMETER CONST)cofkt,KURVE VARkurve,REAL CONSTzeitpunkt,ZUSTAND CONSTzwischenzustand,PARAMETER CONSTparamliste,INT VARfehlernr):ZUSTAND VARhilfsvar;disablestop;hilfsvar:=cofkt(zeitpunkt,zwischenzustand,paramliste);IF NOTerrorda(fehlernr)THENschreibebeobachtungspunkt(kurve,zeitpunkt,zwischenzustandPLUShilfsvar);FI;.END PROCschreibeundtestebeomitcof;BOOL PROCerrorda(INT VARerrornr):IFiserrorTHENsetzeerrornr;clearerror;enablestop;TRUE ELSEerrornr:=0;FALSE FI.setzeerrornr:IFerrorcode=abbruchTHENerrornr:=abbruchELSEerrornr:=1FI.END PROCerrorda;INT PROCimdefbereich(ZUSTAND CONSTz,zug,zog):INT CONSTn:=z.dimension;INT VARi,fehler:=0;FORiFROM1UPTOnREPpruefekomponentePER;fehler.pruefekomponente:IF(z.koordinate(i)-zug.koordinate(i)<minusdelta)COR(z.koordinate(i)-zog.koordinate(i)>delta)THENfehler:=2FI.END PROCimdefbereich;END PACKETzustaendeparameterkurve; + |