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

Schnittpunktberechnung

 

justinao
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2020, 11:14     Titel: Schnittpunktberechnung
  Antworten mit Zitat      
Moin Leute,

ich möchte den Schnittpunkt von einer Gerade und einer Ebene in Matlab berechnen. Bisher gelingt mir dies nur über sym-Variablen, jedoch würde ich dies gerne ohne diese berechnen (numerisch). Hat einer eine Idee, wie dies möglichst simpel zu implementieren ist? Mein aktueller code lautet:
Code:
p = [xp,yp,zp];
%Hilfspunkt für senkrechte Gerade
hilfp = [xp, yp, zp+1];

%Definieren von Gerade
syms t
line = p + t*(hilfp-p);


normal = n(1,:);
syms x y z
Psym = [x,y,z];
%Ebene aufstellen
planefunction = dot(Psym-v(1,:),normal);
   
%Schnittpunkt Ebene und Gerade berechnen
newpfunction = subs(planefunction, Psym, line);
t0 = solve(newpfunction,t);
punkt = subs(line, t, t0);

Dabei ist n ein Array mit Normalenvektoren und v ein Array mit Punkten in der jeweiligen Ebene.

Liebe Grüße
justinao
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2020, 11:38     Titel:
  Antworten mit Zitat      
Hallo,

mit fsolve (oder fminsearch, wenn keine Optimization Toolbox nicht verfügbar ist) sollte das durchaus machbar sein. newpfunction wird ein Function Handle sein, das von t abhängt.
Versuch das mal so und melde dich gerne, wenn es Probleme dabei gibt. Am besten dann auch mit einem konkreten Zahlenbeispiel um das zu testen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
justinao
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2020, 12:54     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für die schnelle Antwort. Also ich habe es mittlerweile geschafft das Programm ein wenig zu kürzen und mir die sym variablen x,y,z zu sparen. Dies spart mir schon einiges an Rechenzeit.
Code:

p = [xp,yp,zp];
%Hilfspunkt für senkrechte Gerade
hilfp = [xp, yp, zp+1];

%Definieren von Gerade
syms t
line = p + t*(hilfp-p);

%Ebene aufstellen und Gerade direkt einsetzen
normal = n(1,:);
planefunction = dot(line-v(1,:),normal);
   
%Schnittpunkt Ebene und Gerade berechnen
t0 = solve(planefunction,t);
punkt = subs(line, t, t0);

Nun möchte ich noch das t als sym variable umgehen um zusätzliche Rechenzeit zu sparen. Ich habe noch nicht ganz verstanden was fminsearch tut und habe in ersten Versuchen Fehlermeldungen bekommen, wenn ich t0=fminsearch(planefunction,0) statt t0=solve(planefunction,t) benutze.

Vielen Dank und Liebe Grüße
justinao
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2020, 13:31     Titel:
  Antworten mit Zitat      
Hallo,

du musst etwas mehr ändern:
Zitat:
newpfunction wird ein Function Handle sein, das von t abhängt.


Sofern verfügbar, würde ich fsolve verwenden.
Falls du fminsearch verwenden willst, musst du noch eine Anpassung vornehmen:
Suche nach x mit f(x) = 0 entspricht minimiere f(x).^2

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
justinao
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2020, 16:21     Titel:
  Antworten mit Zitat      
Danke. Ich habe jetzt die optimization toolbox installiert und somit steht jetzt fsolve zur Verfügung. Ich steh jedoch immer noch total aufm Schlauch und ich weiß nicht wie ich das genau implementieren muss. Mir erschließt sich noch nicht, wie ich dadurch das t als symbolische Variable einsparen kann.

Grüße
justinao
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.05.2020, 22:11     Titel:
  Antworten mit Zitat      
Hallo,

ich würde es so versuchen:

Code:
p = [xp,yp,zp];
%Hilfspunkt für senkrechte Gerade
hilfp = [xp, yp, zp+1];

%Definieren von Gerade
%syms t
line = @(t) p + t*(hilfp-p);

%Ebene aufstellen und Gerade direkt einsetzen
normal = n(1,:);
planefunction = @(t) dot(line(t)-v(1,:),normal);
   
%Schnittpunkt Ebene und Gerade berechnen
t_start = ... % Startpunkt für die Suche.
t0 = fsolve(planefunction,t_start);
punkt = line(t0)


Das ist jetzt eben so hingeschrieben. Um es testen zu können, wäre ein Zahlenbeispiel hilfreich.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
justinao
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2020, 11:17     Titel:
  Antworten mit Zitat      
Moin Harald,

deine Antworten waren sehr hilfreich und das Programm funktioniert, soweit ich das beurteilen kann. Vielen Dank dafür! Eine letzte kleine Frage habe ich noch, da ich bei google nichts direkt dazu gefunden hab. Und zwar sagt Matlab mir bei manchen Punkten:

No solution found.

fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
value of the function tolerance.

<stopping criteria details>
Warning: Matrix is singular to working precision.

Ich kann mir grob die Bedeutung erschließen, aber weiß nicht warum genau dies erscheint und wie "störend" das ist. Sorry für die ganzen Fragen, bin noch nicht so lange dabei, aber so langsam läuft alles immer besser.

Liebe Grüße
justinao
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.05.2020, 11:22     Titel:
  Antworten mit Zitat      
Hallo,

das ist ein Problem, da MATLAB keine Lösung findet. Um dir da weiterhelfen zu können, bräuchte ich wirklich ein nachvollziehbares Beispiel, d.h. inkl. Daten.

Davon abgesehen finde ich mit Google recht viele Treffer dazu:
https://www.google.com/search?q=fsolve+no+solution+found

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
justinao
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2020, 11:43     Titel:
  Antworten mit Zitat      
Habe meinen (Denk-)Fehler gefunden. Mein Programm überprüft mehrere Ebenen auf Schnittpunkte mit der besagten Gerade und wenn diese parallel sind kann logischerweise kein Schnittpunkt gefunden werden und dies war bei wenigen Ebenen der Fall. Konnte das Problem mit der if-Verzweigung lösen, indem ich normalenvektor und richtungsvektor vorher auf orthogonalität überprüfe.

Vielen Dank und einen schönen Tag
justinao
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 - 2024 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.