Fortran95 Felder

Neue Frage »

Auf diesen Beitrag antworten »
Lau und ra Fortran95 Felder

Meine Frage:
Hey ich habe große Probleme mit Fortran95. Ich hatte nie Info in der Schule und in der Uni erschlägt's mich jetzt..

Zur Aufgabe:
Ich soll alle Berechnungen mit Teilfeldern/parallelisierbaren
Feldanweisungen durchführen. Ergänzen soll ich jetzt mein Programm aus den um die folgende Funktionalitäten.

a) "Clippen" Sie diese Werte (ersetzen Sie Werte außerhalb der 3-sigma-Schranke durch den Mittelwert plus 3 sigma, bzw. gleiches Vorgehen für Ausreißer nach unten.

b) Glätten Sie das Feld, indem Sie zu einem Datenpunkt noch jeweils die Hälfte des linken und die Hälfte des rechten Datenpunkts hinzuaddieren und das Ergebnis durch die Summe der Gewichte (2) teilen. Verwenden Sie hier für keine Schleifen sondern nur Teilfelder! Speichern Sie das Ergebnis in einer neuen Datei ab, deren Namen Sie vom Benutzer erfragen.

c) Prüfen Sie, ob es in der geglätteten Zeitreihe nun tatsächlich keine Ausreißer mehr gibt! (Gefragt ist lediglich nach deren Existenz, nicht nach der Zahl). (Achtung: Sie müssen Mittelwert und Standardabweichung neu berechnen).

Meine Ideen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
PROGRAM avg

IMPLICIT NONE

INTEGER :: i, anzahl = 0, zahl_kleiner, zahl_groesser, zahl_aus, IO_ERROR
REAL :: minimum_wert, maximum_wert, mittelwert, standardabweichung
REAL ::	ausreisser_u, ausreisser_o
INTEGER, DIMENSION(1) ::  minimum_ort, maximum_ort
CHARACTER (LEN = 50)	:: infile
REAL					:: x
REAL, ALLOCATABLE, DIMENSION(:) 	:: wert 

write(*,*) 'Welche Datei soll geoeffnet werden?'
READ (*,*) infile

OPEN (UNIT = 30, FILE = infile, STATUS = 'OLD', ACTION = 'READ', IOSTAT = IO_ERROR)

IF (IO_ERROR /= 0) THEN
	WRITE (*,*) 'Konnte ', TRIM(infile), 'nicht oeffnen.'
	STOP
END IF

DO 
READ (Unit = 30, FMT = *, IOSTAT = IO_ERROR) x

IF (IO_ERROR /= 0) EXIT

anzahl = anzahl + 1

END DO

write (*,*) 'Zahl der Werte in der Datei:', anzahl

ALLOCATE (wert(anzahl), STAT= IO_ERROR)

IF (IO_ERROR /= 0) THEN
	WRITE(*,*) 'Konnte Wert(:) nicht alloziieren'
	STOP
END IF

REWIND (UNIT = 30)

DO i = 1, anzahl

READ(UNIT = 30, FMT = *) x

wert(i) = x

END DO

minimum_wert = MINVAL(wert)
minimum_ort = MINLOC(wert)
maximum_wert = MAXVAL(wert)
maximum_ort = MAXLOC(wert)
mittelwert = SUM(wert)/anzahl
standardabweichung = sqrt(1.0/(anzahl-1.0)*SUM((wert-mittelwert)**2))
zahl_kleiner = COUNT(wert < mittelwert)
zahl_groesser = COUNT(wert > mittelwert)
ausreisser_u = mittelwert - 3.0* standardabweichung
ausreisser_o = mittelwert + 3.0* standardabweichung
zahl_aus = COUNT(wert < ausreisser_u) + COUNT(wert > ausreisser_o)

WRITE(*,*) 'Das Minimum ist:', minimum_wert
WRITE(*,*) 'Das Ort des Minimums ist:',	minimum_ort
WRITE(*,*) 'Das Maximum ist:', maximum_wert
WRITE(*,*) 'Der Ort des Maximums ist:', maximum_ort
WRITE(*,*) 'Der Mittelwert ist:', mittelwert
WRITE(*,*) 'Die Standardabweichung ist:', standardabweichung
WRITE(*,*) 'Anzahl der Werte kleiner als der Mittelwert:', zahl_kleiner
WRITE(*,*) 'Anzahl der Werte groesser als der Mittelwert:', zahl_groesser
WRITE(*,*) 'Anzahl der Ausreisser:', zahl_aus

CLOSE(UNIT=30)
DEALLOCATE(wert)
STOP
END PROGRAM avg


Liebe Grüße Laura
 
Auf diesen Beitrag antworten »
eulerscheZahl

Ich kann kein Fortran, aber nach deinem Programm geht die a) vermutlich so:
code:
1:
2:
3:
4:
5:
6:
7:
8:
DO i = 1, anzahl
    IF (wert(i) < ausreisser_u)
        wert(i) = ausreisser_u
    END IF
    IF (wert(i) > ausreisser_o)
        wert(i) = ausreisser_o
    END IF
END DO

Bei der b) kann ich dir auch nicht helfen, wenn ich keine Schleife verwenden darf.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »