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