Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
824to828
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
824to828
824to828
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Berechnungsproblem mit VBA

Berechnungsproblem mit VBA
04.12.2006 00:17:53
caoli
Hallo, zusammen!
Ich habe ein Problem mit VBA, kann jemand hier vielleicht mir helfen?
Um eindeutig zu sein, nehme ich hier ein Beispiel mit nur 10 Messdaten darin (tatsächlich gibt es 2000 Messdaten).
Meine Aufgabe ist Kxx zu berechnen, der der Durchschnitt von Summe von X(ti)X(ti+τ) ist.
Abtastzeit ti...........Messdaten X(ti)
t1.................................X(t1)
t2.................................X(t2)
t3.................................X(t3)
t4.................................X(t4)
t5.................................X(t5)
t6.................................X(t6)
t7.................................X(t7)
t8.................................X(t8)
t9.................................X(t9)
t10................................X(t10)
So läuft meine Rechnung:
1.τ = 0
Kxx = [X(t1)*X(t1) + X(t2)*X(t2) + X(t3)*X(t3) ... ... + X(t10)*X(t10)]
2.τ = 1
Kxx = [X(t1)*X(t2) + X(t2)*X(t3) + X(t3)*X(t4) + X(t4)*X(t5) + X(t5)*X(t6) + X(t6)*X(t7) + X(t7)*X(t8) + X(t8)*X(t9) + X(t9)*X(t10)]
3.τ = 2
Kxx = [X(t1)*X(t3) + X(t2)*X(t4) + X(t3)*X(t5) + X(t4)*X(t6) + X(t5)*X(t7) + X(t6)*X(t8) + X(t7)*X(t9) + X(t8)*X(t10)]
4.τ = 3
Kxx = [X(t1)*X(t4) + X(t2)*X(t5) + X(t3)*X(t6) + X(t4)*X(t7) + X(t5)*X(t8) + X(t6)*X(t9) + X(t7)*X(t10)]
5.τ = 4
Kxx = [X(t1)*X(t5) + X(t2)*X(t6) + X(t3)*X(t7) + X(t4)*X(t8) + X(t5)*X(t9) + X(t6)*X(t10) ]
Der max. Wert von τ ist halb von 10 gleich 5.
Da mein Kenntnis in VBA ganz wenig ist, kann ich dieses Problem nicht alleine schaffen, ich brauche eure Hilf, vielen Dank!

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Berechnungsproblem mit VBA
04.12.2006 01:25:56
Erich
Hallo caoli(?),
muss es denn VBA sein? Das geht auch per Formel.
Die Abtastzeit spielt wohl keine Rolle, nur die Reihenfolge der Messdaten.
Die Formeln in D2 bis H2 kannst du nach unten kopieren.
Kxx ist hier die Summe der Produkte, DKxx der Durchschnitt:
 ABCDEFGH
1tiXi rKxxDKxxKxxDKxx
2 1,1 02551,89141,77166672551,89141,7716667
3 2,2 12344,98137,942344,98137,94
4 3,3 22139,28133,7052139,28133,705
5 4,4 31936129,06666671936129,0666667
6 5,5 41736,35124,0251736,35124,025
7 6,6 51541,54118,581541,54118,58
8 7,7 61352,78112,73166671352,78112,7316667
9 8,8 71171,28106,481171,28106,48
10 9,9 8998,2599,825998,2599,825
11 11 9834,992,76666667834,992,76666667
12 12,1      
13 13,2      
14 14,3      
15 15,4      
16 16,5      
17 17,6      
18 18,7      
19 19,8      

Formeln der Tabelle
ZelleFormel
D2=WENN(ZEILE()-2>ANZAHL(B:B)/2;"";ZEILE()-2)
E2=WENN(D2="";"";SUMMENPRODUKT(BEREICH.VERSCHIEBEN($B$2;;;ANZAHL2(B:B)-D2) *BEREICH.VERSCHIEBEN($B$2;D2;;ANZAHL2(B:B)-D2)))
F2=WENN(D2="";"";SUMMENPRODUKT(BEREICH.VERSCHIEBEN($B$2;;;ANZAHL2(B:B)-D2) *BEREICH.VERSCHIEBEN($B$2;D2;;ANZAHL2(B:B)-D2))/(ANZAHL(B:B)-D2))
G2=WENN(D2="";"";SUMMENPRODUKT(INDIREKT("B2:B"&ANZAHL2(B:B)-D2) *INDIREKT("B"&2+D2&":B"&ANZAHL2(B:B))))
H2=WENN(D2="";"";SUMMENPRODUKT(INDIREKT("B2:B"&ANZAHL2(B:B)-D2) *INDIREKT("B"&2+D2&":B"&ANZAHL2(B:B)))/(ANZAHL(B:B)-D2))

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Berechnungsproblem mit VBA
07.12.2006 15:35:37
caoli
Vielen Dank! Erich G.
deine Methode habe ich auch probiert, hat gut funktioniert, vielen Dank! =)
AW: Berechnungsproblem mit VBA
04.12.2006 01:34:05
ingUR
Hallo, @caoli,
es ist hier die Berechnung der Autokorrelationsfunktion (Acf)gefragt.
Voraussetzungen:
- Der Wert für maxI ist bekannt
- Das Datenfeld x(maxI) ist dimensioniert
- Die Daten sind in das Feld eingelesen
- Das Ergebnis wird in die aktive Tabelle in den Spalten 4 und 5 eingetragen
For k = 0 To maxI / 2 - 1
Kxx=0
For i = k + 1 To maxI
Kxx = Kxx + x(i) * x(i - k)
Next i
Cells(k + 2, 4) = k
Cells(k + 2, 5) = Kxx
Next k
Ich hoffe die Skizze hilft zum Weiterkommen auch ohne Beispieldatei, die ich gerne erstelle, wenn es Fragen zur Umsetzung gibt.
Gruß,
Uwe
Anzeige
AW: Berechnungsproblem mit VBA
04.12.2006 08:39:35
ingUR
Hallo, @caoli,
es war wohl etwas zu spät bei mir gewesen, als ichj meinen Beitrag verfasste, denn der die Ergebnisse des Summenproduktansatzes liefern nur unter bestimmten Vorberechnungen der Daten (gemittelte Werte der Diferenzen zum Mittelwert der Daten) die Autokorrelationsfunktion, mein entsprechnder Hinweis hatte also in der Antwort nichts zu suchen.
Auch die Indexvariblen im Ansatz lassen sich "überscihtlicher" ensprechnden Deiner Benutzung einsetzen, obwohl die vorgestellte Indexberechnung gleichwertig ist.
Beispieldatei zur Berechnung von Kxx
Option Explicit
Const WSDATEN = "Tabelle1"   'Tabellenblattname der Datenreihe UND Ausgabe
Const DATACOLUMN = 2         'Spaltennummer der Datenreihe
Const DATAHEADERROWS = 1     'Anzahl der Kopfzeilen vor Datenbeginn
Const RESULTCOLUMN = 4       'Spaltennummer der Ausgabespalten (drei aufeinanderfolgende Spalten)
Sub CalcKxx()
Dim ws As Worksheet
Dim x() As Double, acf() As Double, maxI As Long, i As Long, k As Long
Set ws = Worksheets(WSDATEN)
'Ermitteln der Datenanzahl der Datenreihe
maxI = ws.Cells(ws.Rows.Count, DATACOLUMN).End(xlUp).Row - DATAHEADERROWS
ReDim x(maxI)
ReDim Kxx(maxI / 2 + 1) 'Es werden die Ergebnisse in einem Datenfeld gespeichert
With ws
'Einlesen der Daten
For i = 1 To maxI
x(i) = .Cells(DATAHEADERROWS + i, DATACOLUMN)
Next i
'Inhalte der Ausgabe-/Ergebnisspalten löschen
.Columns(RESULTCOLUMN).Clear
.Columns(RESULTCOLUMN + 1).Clear
.Columns(RESULTCOLUMN + 2).Clear
'Überschrift über Ausgabe-/Ergebnisspalten
.Cells(DATAHEADERROWS, RESULTCOLUMN) = "lag k"
.Cells(DATAHEADERROWS, RESULTCOLUMN + 1) = "Kxx(i)"
.Cells(DATAHEADERROWS, RESULTCOLUMN + 2) = "Kxx(i)/Kxx(0)"
For k = 0 To maxI / 2 - 1
For i = 1 To maxI - k
Kxx(k) = Kxx(k) + x(i) * x(i + k)
Next i
.Cells(k + 1 + DATAHEADERROWS, RESULTCOLUMN) = k
.Cells(k + 1 + DATAHEADERROWS, RESULTCOLUMN + 1) = Kxx(k)
.Cells(k + 1 + DATAHEADERROWS, RESULTCOLUMN + 2) = Kxx(k) / Kxx(0) 'Programmzeile muß verändert werden, wenn Kxx nicht in einem Datenfeld gespeichrt wird
Next k
End With
Set ws = Nothing
End Sub
Auf die Abspeicherung der Ergebnisse für Kxx in den einzelnen Scheifendurchgängen der Laufvariablien k, kann versichtet werden, wenn sie für die weitere Auswertung nicht benötigt werden. Damit könnte dann das Datenfeöd Kxx() entfallen
Gruß,
Uwe
Anzeige
AW: Berechnungsproblem mit VBA
04.12.2006 15:30:52
caoli
Hallo, Uwe
vielen Dank fuer Ihre Antwort =)
ich habe eins nicht verstanden, wieso schreiben Sie "Kxx(k) = Kxx(k) + x(i) * x(i + k)"?
Eigentlich soll es so sein: Kxx(k) = 1/n*[x(i)*x(i+k)]
Gruss,
Caoli
AW: Berechnungsproblem mit VBA
04.12.2006 16:44:27
ingUR
Hallo, Caoli,
bitte gestatte, das ich in der Anredeform beim im Forum üblichen "Du" bleibe, kann aber auch gerne bei meinem nächsten Beitrag auf das "Sie" umstellen. .
Es soll die korrigierte Aufgabenstellung einmal nicht angesprochen werden, die den Fakto (1/n) einführt, wobei (1/n) die Anzahgl der an der Summenproduktbildung betriligten Summanden bedeutet. Dazu im Anschluß.
Aus der Fragestellung entnehme ich, dass die Unklarheit darin besteht, dass sowohl auf der linken Seite und der rechten Seite der Zuwisung, der Variablenname Kxx erscheint.
Wenn dieses also die Frage ist, so icht es nicht gut, dass ich mit einem Feld Kxx gearbeitet habe, es sei denn, die Idee dahinter ist klar (merken aller Summenproduktergebenisse für Lag k=0 bis Imax/2-1. Ich bitte die Indizierung nicht weiter im Rahmend er Fragebeantwortung zu beachten, den es kann geschrieiben werden:
For k = 0 To maxI / 2 - 1
' Setze Speicherstelle der Variablen dKxx auf Null,
' zur Berechnung mit dem Verschub k
dKxx = 0
For i = 1 To maxI - k
'rechte Seite der Zuweisung von rechts nach links betrachtet:
' - Bilde Teilprodukt x(i)*x(i+k) und
' - addiere das Ergebnis zu der bisher
'   in dieser Schleife (i=1 To maxI-k) ermittelten Summe
'   (Inhalt der Speicherstelle dKxx)
'linke Seite der Zuweisung:
' - Schreibe das neue Ergebnis an die Speicherstelle dKxx
dKxx = dKxx + x(i) * x(i + k)
'wenn (i<= maxI-k), führe dei Anweisung
'der FOR-Schleife für das nächste i aus
Next i
' Hier wird nun einmal die Division zur Mittelwertbildung
' für die Verschiebung k ausgeführt
dKxx = dKxx / (maxI-k) ' hier wird zentral der Faktor (1/n) berücksichtigt
'Hier wird das Ergebnis geschrieben
.Cells(k + 1 + DATAHEADERROWS, RESULTCOLUMN) = k
.Cells(k + 1 + DATAHEADERROWS, RESULTCOLUMN + 1) = dKxx
'Optinal kann aber auch das Ergebnis in einem Feld zwischen gespeichert werden
Kxx(k)=dKxx
Next k
Vielleicht wird das Wesen einer FOR-Schleife und damit die Berechung klarer, ansonsten bitte nochmals nachfragen!
Gruß,
Uwe
Anzeige
AW: Berechnungsproblem mit VBA
05.12.2006 15:06:32
caoli
Hallo Uwe,
vielen Dank fuer deine Hilfe =) Es klappt jetzt!
mit freundlichen Gruesse,
Caoli
AW: Berechnungsproblem mit VBA
04.12.2006 15:37:57
caoli
Entschuldigung, Uwe
ich habe meine Berechnung falsch geschrieben, es soll so sein:
Abtastzeit ti...........Messdaten X(ti)
t1.................................X(t1)
t2.................................X(t2)
t3.................................X(t3)
t4.................................X(t4)
t5.................................X(t5)
t6.................................X(t6)
t7.................................X(t7)
t8.................................X(t8)
t9.................................X(t9)
t10................................X(t10)
So läuft meine Rechnung: Kxx(k) = 1/n*[x(i)*x(i+k)]
1.τ = 0
Kxx = 1/10*[X(t1)*X(t1) + X(t2)*X(t2) + X(t3)*X(t3) ... ... + X(t10)*X(t10)]
2.τ = 1
Kxx = 1/9*[X(t1)*X(t2) + X(t2)*X(t3) + X(t3)*X(t4) + X(t4)*X(t5) + X(t5)*X(t6) + X(t6)*X(t7) + X(t7)*X(t8) + X(t8)*X(t9) + X(t9)*X(t10)]
3.τ = 2
Kxx = 1/8*[X(t1)*X(t3) + X(t2)*X(t4) + X(t3)*X(t5) + X(t4)*X(t6) + X(t5)*X(t7) + X(t6)*X(t8) + X(t7)*X(t9) + X(t8)*X(t10)]
4.τ = 3
Kxx = 1/7*[X(t1)*X(t4) + X(t2)*X(t5) + X(t3)*X(t6) + X(t4)*X(t7) + X(t5)*X(t8) + X(t6)*X(t9) + X(t7)*X(t10)]
5.τ = 4
Kxx = 1/6*[X(t1)*X(t5) + X(t2)*X(t6) + X(t3)*X(t7) + X(t4)*X(t8) + X(t5)*X(t9) + X(t6)*X(t10) ]
1/n, n ist die Anzahl von den Summanden. Und Kxx ist der Durchschnitt von X(ti)X(ti+τ).
Das ist mein Fehler, schuldigung!
Gruss,
caoli
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige