Zunächst werden verschiedene Vektoren (Raf,Iaf,Rbf,Rf...) aus anderen Funktionen, die unwichtig sind, importiert. In einer for Schleife berechne ich dann die y-Achsenabschnitte der Geraden, die sich aus den importierten Vektoren ergeben, und gebe diese im Vektor b aus. Anschließend erfolgt die Ausgabe der Steigungen im Vektor m, die die jeweiligen Geraden besitzen. In figure(1) werden die einzelnen Geraden dann dargestellt.
In der letzten for schleife sollen dann sämtliche Schnittpunkte zwischen den einzelnen Geraden ausgegeben werden. An dieser Stelle hänge ich z.Z. fest... Es handelt sich insgesamt um 5 Geraden (inkl. der x-Achse). In der beigefügten Abbildung sind die Geraden zu erkennen.
Ich hoffe mal, dass ihr mir evtl weiterhelfen könnt.
Verfasst am: 20.12.2012, 17:10
Titel: Re: Schnittpunkte von mehreren Geraden ausgeben lassen
Hallo Eddy2k,
Bitte erkläre nochmal genau, wo Du genau festhängst und warum.
Welche Daten hast Du an dieser Stelle und welche möchtest Du bekommen? Es ist kaum möglich dies korrekt zu erraten, wenn man als Erklärung nur den Code hat, der ja nicht läuft.
Danke für die Antwort und entschuldige die dürftigen Infos...
Also wie bereits gesagt ermittle ich mit dieser Funktion zunächst geradengleichungen, die in der beigefügten Skizze zu sehen sind. Der Vektor b enthält die y-Achsenabschnitte, der Vektor m die entsprechenden Steigungen. Nun möchte ich mithilfe der letzten for schleife die x-koordinaten aller möglichen schnittpunkte im Vektor x und die y-koordinaten aller möglichen schnittpunkte im Vektor y speichern. Bisher erhalte ich nur 4 schnittpunkte und am Ende der vektoren ein NaN. Ich hoffe du verstehst die Problematik nun besser.
wird Probleme machen, da so mehrfach 0 durch 0 geteilt wird (wenn b1=b2 und m1=m2 ist). So wären zumindest die auftauchenden NaN zu erklären. Eine konkrete Lösung reiche ich evtl. noch nach, aber vielleicht hilft dir das ja schon mal weiter.
Nachtrag: Und hier noch eine mögliche Lösung für obiges Problem, mit der man auch tatsächlich alle Schnittpunkte erhält und nicht nur höchstens die Anzahl length(m).
Code:
for i=1:length(m) for j=1:i-1
x(i,j)=((b(j)-b(i))/(m(i)-m(j)));
y(i,j)=m(j)*x(i,j)+b(j);
end end
würdest du die x und y Koordinanten anschließend auch noch in Vektorform erhalten.
P. S. Falls es bei der Anwendung auf Geschwindigkeit ankommt (z. B. weil deutlich mehr als 5 Geraden betrachtet werden sollen), sollte man die Matrizen x und y vorher als Nullmatrizen entsprechender Größe anlegen. Die Schleifen kann man vermutlich auch vermeiden.
vielen Dank schonmal für deine Mühe! Deine Lösung funktioniert soweit super, allerdings habe ich noch das Problem, dass bei dem y-Vektor die Nullen nicht mit enthalten sind:
Durch diesen Befehl setzte ich dann 4 Nullen vor den Y-Vektor. In meinem Beispiel passen die Koordinaten dann soweit, jedoch weiß ich nicht, ob das immer zulässig ist. Dann müssten ja immer alle vorkommenden Nullen zu Beginn des Vektors Y stehen? Und ob das immer der Fall ist, weiß ich nicht.
dass die Koordinaten der Schnittpunkte natürlich auch 0 sein können, habe ich tatsächlich nicht bedacht als ich die letzte Anpassung mit der Löschung der Nullen vorschlug, um eine Vektorform zu erhalten... wobei das jedoch auch nur optional war. Die Matrizen x und y enthielten vorher ja schon die gesuchten Schnittpunkte (auch die mit 0-Koordinaten), nur eben auch zusätzlich noch sinnlose Nullen oberhalb und auf der Diagonale, die ich einfach nur eliminieren wollte.
Alternativ würde ich folgendes vorschlagen, um x und y direkt in Vektorform zu erhalten:
Code:
x=[];
y=[];
for i=1:length(m) for j=1:i-1
x=[x;((b(j)-b(i))/(m(i)-m(j)))];
y=[y;m(j)*x(end)+b(j)];
end end
Das sollte jetzt eigentlich in allen Fällen funktionieren, sofern die Geraden tatsächlich berechenbare Schnittpunkte besitzen (d. h. wenn sich die Steigungen zweier Geraden nicht zu sehr ähneln.)
Einstellungen und Berechtigungen
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.