Verfasst am: 06.05.2016, 18:29
Titel: Verlauf einer Flugkurve
Hallo zusammen,
Ich beschäftige mich erst seit kurzer Zeit mit MatLab und stehe momentan vor folgendem Problem. Das Programm, welches ich schreibe, simuliert einen Basketballwurf (freier Wurf) inklusive Luftwiderstand im 2D "Raum". Das entstehende Differentialgleichungssystem habe ich bereits erfolgreich mit der ode45-Funktion gelöst. Jetzt möchte ich aber noch überprüfen ob die ermittelte Flugbahn des Balls durch einen Korb verläuft. An dieser Stelle bin ich bisher allerdings immer wieder gescheitert.
Die Flugkurve des Balls liegt mir als Vektor vor [x vx y vy]
Die Position des Korbes ist ebenfalls vollständig bekannt.
Der Wurf soll als Treffer behandelt werden, wenn der Ball den Korbring ohne Korbrand Berührung zur Hälfte durchquert hat.
Ich habe bereits versucht mittels einer if-Bedingung und </> Beziehungen die x- und y-Positionen meiner Flugbahn mit denen des Korbes zu vergleichen. Allerdings ist es mir nicht gelungen die if-Bedingung so zu schreiben, dass die Bedingungen für die Positionen in beide Raumrichtungen zum gleichen Zeitpunkt erfüllt sein müssen.
Des weiteren habe ich versucht das Problem den Funktionen ismember und intersect zu lösen aber ebenfalls erfolglos.
Es wäre super wenn sich hier jemand findet, der mir bei der Lösung meines Problems behilflich sein könnte.
x und y sind die Mittelpunktskoordinaten des Balls?
[x vx y vy]
Und du kennst den Ballradius?
Der Korb sollte doch in der Ansicht von der Seite eine kurze Strecke mit bekannter bzw. bestimmbarer Funktion sein?
Somit kannst du den Punkt bzw. die Punkteschar (Array mit x,y) bestimmen, welche mindestens getroffen werden muss, um die Bedingung (Ball mind. zu Hälfte drinn) zu erfüllen.
Dann abfrage auf Punkte-Array element von Flugkurve.
Für mehr müsstest du mal ein Minimalbeispiel posten.
_________________
LG
Martina
"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Ja, x und y sind die Mittelpunktskoordinaten des Balls. Und der Korb ist nur eine kurze horizontale Strecke.
Die beiden Arrays auf Schnittpunkt(e) zu überprüfen ist mir ja bisher leider nicht gelungen. Mit einer if-Bedingung habe ich es immer nur geschafft die einzelnen x-Werte und die einzelnen y-Werte miteinander zu vergleichen, nicht aber die zusammenhängenden x und y Paare.
Hier mal ein kleiner Auszug aus meinem Code:
Code:
function[dq] = differentialgleichung (t, q) global k g
dq = zeros(4,1); % Spaltenvektor generieren
dq(1) = q(2); % Strecke in x-Richtung
dq(2) = -k*q(2).*sqrt(q(2).^2+q(4).^2); % Geschwindigkeit in x-Richtung
dq(3) = q(4); % Strecke in y-Richtung
dq(4) = -g -k*q(4).*sqrt(q(2).^2+q(4).^2); % Geschwindigkeit in y-Richtung
IC = [x0 vx0 y0 vy0]; % Vektor mit Anfangsbedingungen [t, oput] = ode45(@differentialgleichung, timespan, IC);
x = oput(:,1);
vx = oput(:,2);
y = oput(:,3);
vy = oput(:,4);
korb = [x_k1, y_k, x_k2, y_k]; % Das ist die Strecke, welche die Bahnkurve schneiden muss
Wobei der Bereich, den der Mittelpunkt des Balles treffen kann, ja um 2*Ballradius kleiner ist als der Korb - dann der Ball kann ja nicht durch den Korbrand gehen.
_________________
LG
Martina
"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Bei den Abmessungen des Korbes ist der Ballradius auf beiden Seiten schon abgezogen. Aber trotzdem Danke für den Hinweis
Dein Code sieht im Grunde so aus wie meine if-Bedingung, nur dass ich den find-Operator nicht verwendet habe.
Habe deinen Code gerade mal ausprobiert aber leider erzeugt die &&-Verknüpfung einen Fehler. Eine einfache &-Verknüpfung erzeugt ebenfalls einen Fehler.
viele Dank für deine Antwort. Deine Codezeile erzeugt keine Fehlermeldung mehr.
Allerdings verstehe ich nicht ganz welche Information in der Variablen indexA abgespeichert werden. Eine Ausgabe mit displ(indexA) hat nicht funktioniert.
Meine Vermutung ist, dass indexA sämtliche Punkte speichert in denen die drei Bedingungen erfüllt sind. Von daher hab ich folgendes versucht:
Code:
if indexA == 0
treffer = false;
else
treffer = true;
end
visualisierung (x, y, treffer, h, l);
Dies hat auch immer eine grüne Bahnkurve produziert. Meine Vermutung war, dass jede Bedingung lediglich einmal erfüllt werden muss um treffer = true zu setzten. Was ich ja aber eigentlich möchte ist, dass alle drei Bedingungen zu einem Zeitpunkt erfüllt sein müssen um treffer = true zu setzen.
Ich hoffe ich konnte euch verständlich machen, was mein Problem ist.
Das Programm funktioniert jetzt so weit, mit der kleinen Einschränkung, dass Würfe die unterhalb des Korbes verlaufen auch als Treffer angezeigt werden.
Die Bedingungen sind ja für diesen Fall ebenfalls erfüllt (Ball unterhalb des Korbrings)
Daher dachte ich, dass ich die erste Bedingung wie folgt ändern kann:
Heißt, der Ballmittelpunkt befindet sich genau auf Höhe des Korbringes in einem zulässigen Bereich in x-Richtung. Von hier aus kann der Ball aufgrund der definierten Bewegungsgleichung ja nur noch nach unten.
Das hat allerdings dazu geführt, dass jeder Wurf als Fehlwurf erkannt wurde. Ich vermute, dass die Schrittweite mit welcher die ode45() Funktion das DGL-System integriert keinen exakten Wert y = y_k liefert und daher die Bedingung nicht erfüllt sein kann.
Liege ich mit dieser Vermutung richtig?
Und meine neue Frage lautet: Gibt es eine Möglichkeit zu überprüfen ob die Flugkurve die Strecke des Korbringes schneidet?
Ich hatte ganz zu Beginn schon einmal versucht dieses Problem mit der intersect() Funktion zu lösen, war aber leider erfolglos.
Das hat allerdings dazu geführt, dass jeder Wurf als Fehlwurf erkannt wurde. Ich vermute, dass die Schrittweite mit welcher die ode45() Funktion das DGL-System integriert keinen exakten Wert y = y_k liefert und daher die Bedingung nicht erfüllt sein kann.
Liege ich mit dieser Vermutung richtig?
Ja, vermutlich sind die berechneten Werte zu "genau", also nur nicht natürliche Werte.
Ich würde den Wert suchen, der erstmals unter dem Korb ist und dann den Wert einen SChritt davor darauf untersuchen, ob er noch oberhalb des Korbes ist.
_________________
LG
Martina
"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Vielen Dank noch einmal an alle dir mir geholfen haben.
Wie vermutet lag das Problem an den vom ode45() Solver errechneten Lösungspunkten. Diese lagen vor und hinter dem Bereich den ich überprüft habe, weshalb die Überprüfung gescheitert ist.
Daher habe ich einfach die Schrittweite des ode45() Solvers feiner eingestellt. Auf dem angehangenem Bild ist dies gut zu erkennen.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.