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

Schnittpunkte von mehreren Geraden ausgeben lassen

 

Eddy2k
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 15.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2012, 16:13     Titel: Schnittpunkte von mehreren Geraden ausgeben lassen
  Antworten mit Zitat      
Hallo Leute,

ich programmiere z.Z. eine Funktion, die mir sämtliche Schnittpunkte zwischen vorhandenen Geraden ausgibt.

Ich poste einfach mal den Code und erläutere diesen dann:

Code:
% function [m,b,x,y]=Lines(A,B,Q)

l=length(B);

if (l == length(A)) && (l == length(Q))

% Importieren von Raf,Iaf,Rbf,Ibf,Rqf,Iqf aus der Funktion Turn
[Raf,Iaf,Rbf,~,~,~]=Turn(A,B,Q);

% Importieren der singulären Frequenzen aus der Funktion crb
[RF,~,~,~]=crb(A,B,Q);
r=length(RF);

% Ermittlung des Vektors b,der die y-Achsenabschnitte beinhaltet
b=zeros(r,1);

for n=1:1:r
    b(n)=-(polyval(Rbf,RF(n))-polyval(Iaf,RF(n))*RF(n)*(Q(length(Q)-1)))/(polyval(Raf,RF(n)));
end

% Ermittlung des Vektors m, der die Steigungen beinhaltet
m=zeros(r,1);

for n=1:1:r
    m(n)=RF(n)^2;
end

% Grafische Darstellung der Geradengleichungen
figure(1)
hold on

for i=1:length(m)
   
    KD=-80:10;
    KI=KD;
   
    for j=1:length(KD)
       
        KI(j)=m(i)*KD(j)+b(i);
       
    end
   
    plot(KD,KI);
   
end

xlim([-80 10]);
ylim([-2 8]);

% Bestimmung der Schnittpunkte der einzelnen Geraden
for i=1:length(m)
   
    m1=m(i);
    b1=b(i);
   
    for j=1:length(m)
       
        m2=m(j);
        b2=b(j);
             
        x(i)=((b2-b1)/(m1-m2));
        y(i)=(m2*x(i)-b1);
       
    end
     
end

plot(x,y,'*');
hold on;

else errordlg('Die Zeilenvektoren A, B und Q weisen nicht die gleiche Länge auf!')

end

 


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.

MfG

12.jpg
 Beschreibung:
Geraden

Download
 Dateiname:  12.jpg
 Dateigröße:  17.95 KB
 Heruntergeladen:  525 mal
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: 20.12.2012, 17:10     Titel: Re: Schnittpunkte von mehreren Geraden ausgeben lassen
  Antworten mit Zitat      
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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 15.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2012, 18:10     Titel:
  Antworten mit Zitat      
Hallo jan,

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.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
HerrErnie
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 21.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2012, 19:21     Titel:
  Antworten mit Zitat      
Hallo,

mal einen Schuss ins Blaue meinerseits, wo das Problem liegen könnte. Du lässt hier
Code:
for i=1:length(m)  
    m1=m(i);
    b1=b(i);  
    for j=1:length(m)      
        m2=m(j);
        b2=b(j);            
        x(i)=((b2-b1)/(m1-m2));
        y(i)=(m2*x(i)-b1);      
    end    
end
 

beide Schleifen, von 1 bis length(m) laufen, d. h. der Ausdruck
Code:
x(i)=((b2-b1)/(m1-m2));

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
 


[x(i,j),y(i,j)] ist damit der Schnitpunkt von Gerade i mit Gerade j (für j<i).

Mit
Code:

x=x(x~=0)
y=y(y~=0)
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Eddy2k
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 15.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2012, 12:34     Titel:
  Antworten mit Zitat      
Hallo Herr Ernie,

vielen Dank schonmal für deine Mühe! Smile Deine Lösung funktioniert soweit super, allerdings habe ich noch das Problem, dass bei dem y-Vektor die Nullen nicht mit enthalten sind:

Code:


X =

    3.9252
  -26.4010
  -32.1134
  -71.0684
    4.9024
    4.9746
    4.3662
   28.8853
  -16.1098
  -21.9695

Y =

   16.6748
   17.9060
    7.5244
   29.4501
    5.4819
    4.8975

 


Ich habe das Problem bisher folgendermaßen gelöst:

Code:


X=x(x~=0);
y=y(y~=0);

Y=[zeros(length(X)-length(y),1);y];

 


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.

Ich hoffe mal du verstehst meine Frage Wink

gruß Eddy
Private Nachricht senden Benutzer-Profile anzeigen
 
HerrErnie
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 21.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2012, 17:36     Titel:
  Antworten mit Zitat      
Hallo,

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