home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
07_08
/
tricks
/
bestwert.mod
< prev
next >
Wrap
Text File
|
1991-03-20
|
9KB
|
244 lines
(* ------------------------------------------------------ *)
(* BESTWERT.MOD *)
(* Programm zur Ermittlung von Ausgleichskurven nach dem *)
(* Gaußschen Prinzip *)
(* Compiler: Fitted Modula-2 Version 2.0a *)
(* (c) 1991 Jens Rohloff & TOOLBOX *)
(* ------------------------------------------------------ *)
MODULE Bestwertkurve;
IMPORT RealInOut;
FROM RealConversions IMPORT LongRealToString;
FROM InOut IMPORT WriteLine, WriteString,
WriteCard, WriteLn, Read,
ReadCard, Done;
FROM Windows IMPORT Window, OpenWindow, CloseWindow,
SelectWindow;
FROM Menu IMPORT PopMenu;
FROM Display IMPORT SetCursorPosition, line0, col0,
lineN, colN, ClrEOS;
FROM Info IMPORT Information;
CONST
max = 15; (* Konstante für maximale Datenfeldgröße *)
TYPE
Daten = ARRAY [1..max] OF LONGREAL; (* Datenfeldtyp *)
VAR
Xdaten, Ydaten : Daten; (* Felder für die Daten *)
Titel, In, Aus : Window; (* siehe Module Windows *)
Ende, Unsin : BOOLEAN; (* für Programmabbruch *)
n, cmd : CARDINAL; (* zu cmd -> Module Menu*)
mwert, nwert : LONGREAL; (* Arbeitswerte *)
PROCEDURE Einlesen(VAR Xdaten, Ydaten : Daten;
VAR n : CARDINAL);
(* Einlesen liest die X- und Y-Meßwerte sowie deren *)
(* Anzahl ein. *)
(* Xdaten: Datenfeld für die X-Werte der Meßreihe *)
(* Ydaten: Datenfeld für die Y-Werte der Meßreihe *)
(* n : Anzahl der eingegebenen Wertepaare *)
VAR
I : CARDINAL;
BEGIN
REPEAT
SetCursorPosition(line0, col0); (* Oben links *)
ClrEOS;
WriteString(' Wie viele X-Y Werte ? (max.');
WriteCard(max, 2);
WriteString(' ) ');
ReadCard(n);
UNTIL(n <= max) AND Done;
SetCursorPosition(line0, col0); (* Oben links *)
ClrEOS;
I := 1;
FOR I := 1 TO n DO
REPEAT
SetCursorPosition(line0+I-1, 2);
WriteCard(I, 2);
WriteString('.X-Wert eingeben : ');
RealInOut.ReadLongReal(Xdaten[I]);
UNTIL RealInOut.Done;
WriteString(' ');
REPEAT
SetCursorPosition(line0+I-1, 42);
WriteCard(I, 2);
WriteString('. Y-Wert eingeben : ');
RealInOut.ReadLongReal(Ydaten[I]);
UNTIL RealInOut.Done;
END;
END Einlesen;
PROCEDURE Amwert(VAR Xdaten, Ydaten : Daten;
n : CARDINAL;
VAR Unsin : BOOLEAN) : LONGREAL;
(* Amwert berechnet Formfaktor für 1.Fkt. Wenn die *)
(* Anzahl der Datenpaare kleiner als zwei ist, bricht *)
(* die Prozedur die Bearbeitung ab. *)
(* Xdaten: X-Werte der Meßreihe *)
(* Ydaten: Y-Werte der Meßreihe *)
(* n : Anzahl der Wertepaare *)
(* Unsin : gibt TRUE zurück, wenn die Anzahl der Werte- *)
(* paare nicht ausreicht *)
(* Amwert: Formfaktor für die Funktion f(x)= amwert * x *)
VAR
a : CHAR;
I : CARDINAL;
werta, wertb, m : LONGREAL;
BEGIN
werta := 0.0; wertb := 0.0; m := 0.0;
Unsin := (n < 2); (* Berechnung *)
IF NOT Unsin THEN
FOR I := 1 TO n DO
werta := werta + (Xdaten[I] * Ydaten[I]);
wertb := wertb + (Xdaten[I] * Xdaten[I]);
END;
m := (werta / wertb);
END;
RETURN(m);
END Amwert;
PROCEDURE Pwert(VAR Xdaten, Ydaten : Daten;
n : CARDINAL;
VAR Unsin : BOOLEAN) : LONGREAL;
(* Pwert berechnet Formfaktor für 3.Fkt. Wenn die *)
(* Anzahl der Datenpaare kleiner als drei ist, bricht *)
(* die Prozedur die Bearbeitung ab. *)
(* Xdaten: X-Werte der Meßreihe *)
(* Ydaten: Y-Werte der Meßreihe *)
(* n : Anzahl der Wertepaare *)
(* Unsin : gibt TRUE zurück, wenn die Anzahl der Werte- *)
(* paare nicht ausreicht *)
(* Pwert : Formfaktor für die Funktion f(x)= Pwert * x² *)
VAR
I : CARDINAL;
a : CHAR;
werta, wertb, P : LONGREAL;
BEGIN
werta := 0.0; wertb := 0.0; P := 0.0;
Unsin := (n < 3);
IF NOT Unsin THEN
FOR I := 1 TO n DO
werta := werta + (Ydaten[I]*Xdaten[I]*Xdaten[I]);
wertb := wertb + (Xdaten[I]*Xdaten[I]*
Xdaten[I]*Xdaten[I]);
END;
P := (werta / wertb);
END;
RETURN(P);
END Pwert;
PROCEDURE mn(VAR Xdaten, Ydaten : Daten;
n : CARDINAL;
VAR AParameter, BParameter : LONGREAL;
VAR Unsin : BOOLEAN);
(* mn berechnet Formfaktore für 2.Fkt. Wenn die Anzahl *)
(* der Datenpaare kleiner als zwei ist, bricht die *)
(* Prozedur die Bearbeitung ab. *)
(* Xdaten: X-Werte der Meßreihe *)
(* Ydaten: Y-Werte der Meßreihe *)
(* n : Anzahl der Wertepaare *)
(* Unsin : gibt TRUE zurück, wenn die Anzahl der Werte- *)
(* paare nicht ausreicht *)
(* Aparameter: Werte für die Funktion in der Darstellung*)
(* Bparameter: f(x)=Aparameter * x + Bparameter *)
VAR
I : CARDINAL;
werta, wertb, wertc, wertd, werte : LONGREAL;
BEGIN
werta := 0.0; wertb := 0.0; wertc := 0.0;
wertd := 0.0; werte := 0.0;
AParameter := 0.0; BParameter := 0.0;
Unsin := (n < 3);
IF NOT Unsin THEN
FOR I := 1 TO n DO
werta := werta + (Xdaten[I] * Xdaten[I]);
wertb := wertb + (Xdaten[I]);
wertc := wertc + (Ydaten[I] * Xdaten[I]);
wertd := wertd + (1.0);
werte := werte + (Ydaten[I]);
END;
AParameter := ((wertc*wertd)-(wertb*werte)) /
((werta*wertd)-(wertb*wertb));
BParameter := ((werta*werte)-(wertb*wertc)) /
((werta*wertd)-(wertb*wertb));
END;
END mn;
PROCEDURE Ausgabe(awert, bwert : LONGREAL;
Schalter : CARDINAL);
(* Schalter = 1 => Ausgabefunktion f(x) = a1 * x *)
(* Schalter = 2 => Ausgabefunktion f(x) = a1 * x + a0 *)
(* Schalter = 3 => Ausgabefunktion f(x) = a2 * x² *)
VAR
antwort : CHAR;
string : ARRAY [0..13] OF CHAR;
ok : BOOLEAN;
BEGIN
SetCursorPosition(line0, 10);
WriteString(' Ermittelte Funktion : y = ');
LongRealToString(awert, 4, 13, string, ok);
IF ok THEN WriteString(string); END;
IF NOT (Schalter = 3) THEN
(* Auswahl der richtigen Fkt-darstellung *)
WriteString(' * x ');
IF Schalter = 2 THEN
WriteString('+ ');
LongRealToString(bwert,4,13,string,ok);
IF ok THEN WriteString(string); END;
END;
ELSE
WriteString(' * x² ');
END;
Read(antwort); (* Warten auf Aktion des Anwenders *)
SetCursorPosition(lineN, colN);
END Ausgabe;
BEGIN
SetCursorPosition(line0, col0);
OpenWindow(Titel, 0, 0, 3, 79, TRUE,
('[ Bestwertkurvengenerator ]'));
Ende := FALSE;
REPEAT
PopMenu(4, 0, "[ Auswahl ]|Form : y=m*x|Form : " +
"y=m*x+n|Form : y=p*x²|Information |Ende",
20, TRUE, cmd);
IF NOT ((cmd = 4) OR (cmd = 5)) THEN
OpenWindow(In, 4, 0, 20, 79, TRUE, ('[ Eingabe ]'));
OpenWindow(Aus, 21, 0, 24, 79, TRUE, ('[ Ausgabe ]'));
SelectWindow(In, FALSE);
Einlesen(Xdaten, Ydaten, n);
SelectWindow(Aus, FALSE);
CASE cmd OF
1: mwert := Amwert(Xdaten, Ydaten, n, Unsin);
IF NOT Unsin THEN Ausgabe(mwert, 0.0, 1) END
|
2: mn(Xdaten, Ydaten, n, mwert, nwert, Unsin);
IF NOT Unsin THEN Ausgabe(mwert, nwert, 2) END
|
3: mwert := Pwert(Xdaten, Ydaten, n, Unsin);
IF NOT Unsin THEN Ausgabe(mwert, 0.0, 3) END;
END;
CloseWindow(Aus);
CloseWindow(In);
ELSE
CASE cmd OF
4: Information('Bestwert.doc');
(* Datei mit Hilfetext *)
ELSE
Ende := TRUE
END;
END;
UNTIL Ende;
CloseWindow(Titel);
END Bestwertkurve.
(* ------------------------------------------------------ *)
(* Ende von BESTWERT.MOD *)