WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Verlauf einer Flugkurve

 

X-T_C
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2016, 18:29     Titel: Verlauf einer Flugkurve
  Antworten mit Zitat      
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.

Vielen Dank im Voraus,
X
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 06.05.2016, 20:46     Titel:
  Antworten mit Zitat      
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))
Private Nachricht senden Benutzer-Profile anzeigen
 
X-T_C
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2016, 21:39     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort Smile

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



Vielen Dank,
X
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 06.05.2016, 21:47     Titel:
  Antworten mit Zitat      
korb = [x_k1, y_k, x_k2, y_k];

Grob sowas in der Art:
Code:

A = [x vx y vy] ;
indexA = (find( A(:,3) <= y_k) && find( A(:,1) >= x_k1)  && find( A(:,1) <= x_k2))




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))
Private Nachricht senden Benutzer-Profile anzeigen
 
X-T_C
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2016, 22:37     Titel:
  Antworten mit Zitat      
Bei den Abmessungen des Korbes ist der Ballradius auf beiden Seiten schon abgezogen. Aber trotzdem Danke für den Hinweis Wink

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.

Gruß,
X
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.05.2016, 22:40     Titel:
  Antworten mit Zitat      
Hallo X-T_C,

Dann poste doch mal die Fehlermeldung.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
X-T_C
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2016, 22:54     Titel:
  Antworten mit Zitat      
Hallo Jan,

Das ist der Fehler für den &&-Operator:
Operands to the || and && operators must be convertible to logical scalar values.

Und das ist der Fehler für den &-Operator:
Error using &
Matrix dimensions must agree.


Gruß,
X
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.05.2016, 10:53     Titel:
  Antworten mit Zitat      
Hallo,

vermutlich ist folgendes gemeint:
Code:
indexA = find( A(:,3) <= y_k &  A(:,1) >= x_k1& A(:,1) <= x_k2)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
X-T_C
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2016, 12:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

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);


Je nach dem ob die Bedingung erfüllt ist, soll die Bahnkurve jetzt in einer anderen Farbe geplottet werden. (grün bei Treffer, rot bei Fehlwurf)
Code:
if treffer == true
    plot(min (x, l+1000), max (y, 0),'g');
    disp ('Ihr Wurf hat getroffen')
else
    plot(min (x, l+1000), max (y, 0),'r');
    disp ('Ihr Wurf ging leider daneben')
end


Allerdings wird die Bahnkurve immer grün geplottet, unabhängig von deren Verlauf.

Mein erster Versuch war folgender:
Code:
if (A(:,3) <= y_k & A(:,1) >= x_k1 & A(:,1) <= x_k2);
       treffer = true;
else
       treffer = false;
end


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.

Gruß,
X
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 08.05.2016, 13:55     Titel:
  Antworten mit Zitat      
X-T_C hat Folgendes geschrieben:

Meine Vermutung ist, dass indexA sämtliche Punkte speichert in denen die drei Bedingungen erfüllt sind.


Korrekt.
IndexA sollte ein Vektor mit der Länge der Bahnpunkte sein.
Diese Vektor ist dann 1, wenn die Bedinungen erfüllt wurden, sonst 0.

D.h. um rauszufinden, ob es ein Treffer war, oder nicht, reicht es, zuschauen, ob z.B. die Summe des Vektors größer Null ist.
Code:
if sum(IndexA) > 0
    disp('Treffer');
else
    disp('kein Treffer');
end



Zitat:
Code:
if indexA == 0
    treffer = false;
else
    treffer = true;
end
visualisierung (x, y, treffer, h, l);

Die Bedingung indexA == 0 wird nur dann wahr, wenn alle Elemente im Vektor gleich Null sind.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
X-T_C
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2016, 16:09     Titel:
  Antworten mit Zitat      
Hallo Martina,

auch dir vielen Dank für deine Hilfe Smile

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:
Code:
indexA = find(A(:,3) == h_K & A(:,1) .....


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.

Gruß,
X
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 08.05.2016, 20:36     Titel:
  Antworten mit Zitat      
X-T_C hat Folgendes geschrieben:

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))
Private Nachricht senden Benutzer-Profile anzeigen
 
X-T_C
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.05.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2016, 10:00     Titel:
  Antworten mit Zitat      
Hallo zusammen,

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.

Gruß,
X

image003.png
 Beschreibung:

Download
 Dateiname:  image003.png
 Dateigröße:  63.36 KB
 Heruntergeladen:  299 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.