Danke für die Allgemeinen Sachen,
habe die Sachen so umgesetzt, manche Sachen habe ich nicht verstanden:
Zitat:- lokale Variablen durch Drähte ersetzen
Erledigt!
Zitat:- wenn du schon eine globale Variable verwendest, dann würde ich im subVI direkt abfragen
Meinst du damit ich soll ein SubVi erstellen, indem die Funktion abgearbeitet wird?
Das Problem das ich habe ist, dass dort Zufallsvariablen erzeugt werden, die bei jedem neu Ausführen geändert werden.
Ich könnte das machen, müsste das VI allerdings nur einmal ausführen lassen und dann mit allen Stellen verdrahten, was
ziemlich unordentlich aussehen würde.
Zitat:- du hast ein subVI mit 6 Inputs an der linken Kante des Icons erstellt: sieht sehr unübersichtlich aus. Besser wäre hier der Einsatz eines Clusters, der die 5 unteren 1D-Arrays in nur einem Draht zusammenfasst. Diese 5 Arrays scheinen sich ja nicht zu ändern mittendrin…
Hab vorhin versucht das zu machen, das Problem ist das ganze war gerade nur für die X-Koordinate des Mikrofons. Es wird dort die kleinste Summe der Fehlerquadrate berechnet. Es folgt das gleiche noch für Y und Z und später auch noch für Schallquelle X, Y und Z. Müsste also die 1-D Arrays bündeln und jedes mal Aufschlüseln.
Zitat:- zum aufräumen: Schieberegister sehen noch "hübscher" aus, wenn die Drähte möglichst gerade von links nach rechts verlaufen (das gilt auch sonst)
Erledigt!
Zitat:- am subVI zum Berechnen der Abweichung sieht man CoercionDots: müssen die sein und haben sie Einfluss auf das Rechenergebnis?
Mein Fehler hab vergessen das zu ändern. Erledigt!
Zitat:- Deine While-Loops stoppen nur unter einer Bedingung: was passiert, falls diese Bedingung nie eintritt?
Naja es wird ja nach dem kleinsten Fehlerquadrat gesucht, es muss also irgendwann größer werden als das zuvor berechnete Fehlerquadrat?!
Zitat:- Wozu überhaupt While-Loops? Dein Mikrofonarray dürfte nur in einem begrenzten Raum bewegt werden, also gibt es Grenzen für XYZ. Zusammen mit deiner Schrittweite kann man deshalb doch für jede Richtung ein 1D-Array von Stützstellen definieren, die eine FOR-Loop autoindizierend abarbeitet… (Auch FOR-Loops haben eine Stop-Condition!)
Warum sollte ich While-Loops vermeiden?
Jetzt nochmal zum Algorithmus - um den geht es mir eigentlich, ich kann noch so schön alles hergerichtet haben, wenn ich Quatsch berechne
Im Anhang nochmal ein paar Bilder.
Ich versuche mal zu erklären was ich umgesetzt habe:
In eine While Schleife werden 6 1D Arrays übergeben. Die 1D Arrays enthalten
Koordinaten (von oben nach unten) der Mikrofone X,Y,Z und der Schallquelle X,Y,Z.
Das 1D Array mit der X-Koodinate des Mikrofons ist dabei ein Schieberegister.
Der Inhalt des 1D Arrays an der Stelle i wird dabei um die Schrittweite s zunächst erhöht.
Aus dem sich veränderten 1D Array und den übrigen 1D Array wird nun der neue Abstand delta s
aus Quelle und Mikrofon berechnet. Aus den realen Abstand und dem neuen berechneten Abstand wird dann
dann die Summe der Fehlerquadrate bestimmt. Es wird verglichen, ob die Summe der Fehlerquadrate
die berechnet wurden größer als die alten übergebenen Werte sind.
Falls nicht werden die Werte durchgeschleift (Case Fall: False) und das Spiel geht wieder von vorne los
(um Schrittweite s erhöhen, neuer Abstand berechnen, Summe der Fehlerquadrate, erneuter Vergleich).
Irgwann ist die Summe der berechneten Fehlerquadrate größer als der Wert davor.
Wir befinden uns jetzt im Case Fall:True dabei ist die zweite Bedingung auch True, da
die Schleife nicht im 0. Durchlauf ist. Da der While Schleife immer die neu berechnete Summe der Fehlerquadrate
übergeben wird, wird hier nochmal die Summe der Fehlerquadrate berechnet die davor aktuell war. Die Schleife ist durch,
da die Abbruchbedingung zutrifft: Summe der berechneten Fehlerquadrate ist größer als die davor berechnete Summe
der Fehlerquadrate.
Falls schon beim ersten Durchlauf die Summe der Fehlerquadrate größer ist als die übergebene Summe der Fehlerquadrate
muss wie im Algorithmus beschrieben in die andere Richtung geschaut werden.
Bedingung 1: Summe 1 ist größer als Summe 2 und wir befinden uns im Durchlauf 0.
Nun befinden wir uns in dem Case Fall True, False.
Hier muss ebenfalls ein Schieberegister definiert werden der in die andere Richtung schaut.
Abbruchbedingung ist ebenfalls der Vergleich der Summe der Fehlerquadrate. Eigentlich ist das
analog aufgebaut nur er schaut in die negative Richtung.
Fällt einem ein Gedankenfehler auf, in dem ich vom Algorithmus abweiche?
Gruß David