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

Optimierung einer Gleichung mit 2 Variablen

 

slinshady
Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 07.02.2016, 13:59     Titel: Optimierung einer Gleichung mit 2 Variablen
  Antworten mit Zitat      
Hallo,

Mein Problem ist, dass ich eine Gerade habe, die eine Kurve schneidet, die durch zwei Splines beschrieben wird. Ich habe folgende Gleichungen.

x_i-\lambda\dot{y}_i = a_x+ b_x\cdot(t-s_i)+ c_x\cdot(t-s_i)^2+ d_x\cdot(t-s_i)^3

y_i-\lambda\dot{x}_i = a_y+ b_y\cdot(t-s_i)+ c_y\cdot(t-s_i)^2+ d_y\cdot(t-s_i)^3

es gilt: t \in[s_i,s_{i+1}]

für mein lambda kann ich sagen, dass es ungefähr die länge von \lambda\approx|\begin{pmatrix} x_i \\ y_i  \end{pmatrix} - \begin{pmatrix} a_x \\ a_y  \end{pmatrix} |

mein erster Ansatz war, dass ich die eine Gleichung nach lambda aufgelöst habe, in die andere eingesetzt und damit die Nullstellen bestimmt habe. Dann habe ich mir die Nullstelle gesucht, die auf dem Intervall liegen muss und mit dieser wieder mein lambda bestimmt. Dabei kommen allerdings keine brauchbaren Ergebnisse heraus, da mein Lambda zwischen 2 und 12 liegen sollte allerdings zum einen teils negativ ist und zum anderen viel zu groß. Allerdings stimmen auch meine Nullstellen schon nicht.

Deshalb hatte ich nun die Überlegung es mit Hilfe eines Optimierers zu lösen und somit vielleicht bessere Ergebnisse zu erhalten als mit roots .

Da es sich jetzt eigentlich nur um die Umsetzung des Problems handelt habe ich nicht noch viel Code beigefügt.
Meine Unbekannten sind \lambda und  t. Die anderen Werte kenne ich alle.

Danke schonmal und schönes Wochenende an euch Wink
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.02.2016, 15:34     Titel:
  Antworten mit Zitat      
Hallo,

fsolve oder lsqnonlin könnten helfen.
Weißt du denn, in welchem Abschnitt der Spline der Schnittpunkt liegt?

Falls nicht, könnte man das so bestimmen: einen Schnittpunkt gibt es, wenn der Anfangspunkt eines Abschnittes über der Gerade liegt und der Endpunkt darunter, oder umgekehrt.

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

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 07.02.2016, 15:50     Titel:
  Antworten mit Zitat      
das Intervall des Splines kenne ich. Ich habe mir etwas geschrieben, um die entsprechenden Intervalle des Splines zu finden. Dadurch kenne ich auch die Breaks, also die s0.


um es mal zu zeigen. Ich habe diese 3 Linien und meine Schnittpunkte die ich berechnen möchte sind die Schnittpunkte des Normalenvektors der mittleren Linie mit den zwei äußeren. Ich kenne, dadurch, dass ich alle drei Splines kenne, also alle breaks, die Ableitungen in x und y des mittleren Splines um den Normalenvektor zu bilden.
Die schwarzen Linien sind einfach verbundene Punkte der einzelnen Normalenvektoren zu einzelnen Punkten auf der mittleren Linie




Mein Ziel ist es anhand der Schnittpunkte den Abstand der zwei Linien in jedem Punkt von der mittleren aus zu finden und den Punkt in der Mitte neu zu setzen, sodass er für sich orthogonal in beide Richtungen den gleichen Abstand hat. Die mittlere Linie wollte ich iterativ in dem ich die Punkte immer weiter korrigiere verbessern

Hier nochmal das Bild in größer, das andere ist ja nur eine Vorschau ^^
http://www.bilder-upload.eu/show.php?file=7620a7-1454854492.jpg
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.02.2016, 16:32     Titel:
  Antworten mit Zitat      
Hallo,

hast du's nun mit einer der genannten Funktionen versucht?

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

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 07.02.2016, 17:35     Titel:
  Antworten mit Zitat      
Ich versuche sie erstmal über die Doku zu verstehen, wie ich sie verwenden muss.
War eben essen und muss gleich weg. Hoffe ich komme bis morgen dazu es zu implementieren.

Grüße Nils
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 08.02.2016, 12:27     Titel:
  Antworten mit Zitat      
zur lsgnonlin habe ich die Frage:

macht sie nicht das Gleiche, was ich zuvor schon mit den Gleichungen gemacht hatte?

ich hatte die erste nach \lambda umgestellt in die zweite eingesetzt die nullstellen überprüft und die wahrscheinlichste in die Gleichung für lambda eingesetzt um die Breite zu erhalten.
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: 08.02.2016, 12:35     Titel:
  Antworten mit Zitat      
Hallo,

theoretisch ja. Praktisch sagst du aber ja, dass du fehlerhafte Resultate bekommst. Die Vermutung wäre also, dass beim händischen Umstellen etwas schiefgegangen ist.

Bei den Gleichungen bist du dir sicher?

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

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 08.02.2016, 12:54     Titel:
  Antworten mit Zitat      
Jap die erste Stellt links alle x Werte der Geraden und rechts des Splines dar,

die zweite die y-werte.

Das umstellen habe ich schon mehrfach kontrolliert. Ich werde es allerdings mal testen.
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: 08.02.2016, 13:43     Titel:
  Antworten mit Zitat      
Hallo,

mich wundert in den Gleichungen ja das Minus vor lambda.

Du hast ja eingangs gesagt, dass du keine brauchbaren Ergebnisse bekommst.
Das kann eigentlich nur daran liegen, dass entweder die Gleichungen falsch sind oder der Weg der Auflösung.
Ich kann mir beispielsweise nicht vorstellen, dass es (korrekte Übergabe der Koeffizienten vorausgesetzt) an roots liegt. Das lässt sich aber ja leicht überprüfen, indem man die Wurzeln wieder in das Polynom einsetzt.

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

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 08.02.2016, 13:48     Titel:
  Antworten mit Zitat      
Jap das habe ich Probiert. Deshalb weiß, ich dass die Wurzeln schon falsch sind.

Das Minus kommt von der Umformung des Richtungsvektors. Die Ableitung des Splines in einem Punkt ergibt mir den Tangentialvektor in diesem Punkt. Vertausche ich dabei den x und den y Wert und negiere einen der beiden erhalte ich den Normalenvektor.

diesen habe ich noch normiert und dann in die Gleichung eingesetzt. Somit sollte das Lambda, das ich erhalte der Abstand zum entsprechenden Rand sein
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: 08.02.2016, 14:18     Titel:
  Antworten mit Zitat      
Hallo,

was genau hast du probiert?

Zitat:
Vertausche ich dabei den x und den y Wert und negiere einen der beiden erhalte ich den Normalenvektor.

Hier hast du aber beide Male Minus.

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

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 08.02.2016, 14:30     Titel:
  Antworten mit Zitat      
Oh das ist nur ein Fehler beim übertragen hier. Habe die obere Formel kopiert und dann gedacht ich hätte alle Werte korrekt geänd4
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 08.02.2016, 15:04     Titel:
  Antworten mit Zitat      
eine Frage. ich habe mir ja überlegt, wie ich die korrekten Intervalle also breaks erhalte. Diese habe ich mir auch plotten lassen und es sind die richtigen.
Wie kann ich nun allerdings den Spline zwischen z.b. der Aktuellen und nächsten Stützstelle plotten lassen? also nur ein Teilintervall

Code:
   for k=1:iki(end)
        if (iki(i)+1>=size(iki))
            x=px_innen.breaks(iki(i)):0.5:px_innen.breaks(iki(1));
        else
            x=px_innen.breaks(iki(i)):0.5:px_innen.breaks(iki(i)+1);
        end
        hold on
        xx=Pix(4)+Pix(3).*(x-px_innen.breaks(iki(i)))+Pix(2).*(x-px_innen.breaks(iki(i))).^2+Pix(1).*(x-px_innen.breaks(iki(i))).^3;
        yy=Piy(4)+Piy(3).*(x-py_innen.breaks(iki(i)))+Piy(2).*(x-py_innen.breaks(iki(i))).^2+Piy(1).*(x-py_innen.breaks(iki(i))).^3;
        plot(xx,yy,'.k')
       
    end


ich habe mir es überlegt es so plotten zu lassen.

iki ist der Index des aktuellen breaks px_innen der spline der x-werte für den inneren rand und py_innen für die y-Werte
ich dachte mir dann, dass xx und yy ein paar Punkte auf dem aktuellen Intervalls sind. Allerdings ist das so nicht Korrekt. Die berechneten Werte sind ähnlich meiner Schnittpunkte mit dem inneren Rand und liegen alle auf einer Geraden?


Ich habe in der Doku einige hilfreiche Funktionen gefunden
fnplt(pp,[a,b])
Plots on given interval

allerdings habe ich ja leider zwei Splines Sad
oder wäre

Code:
xx=fnplt(px_innen,[iki(i),iki(i)+1])
yy=fnplt(py_innen,[iki(i),iki(i)+1])
plot(xx,yy)


Vielleicht eine Lösung?

habe es gelöst Smile
also das Plotproblem
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 08.02.2016, 19:23     Titel:
  Antworten mit Zitat      
Also das Plotproblem ist doch noch nicht gelöst, da er mir 5 Abschnitte des Randes nicht plottet Rolling Eyes

eine andere Frage die Funktion fsolve mit root2d kann ich so nicht benutzen, da ich der funktion ja Parameter übergeben muss. Funktioniert das?

lsqnonlin funktioniert nicht für eine Funktion mit zwei variablen Sad

Zuletzt bearbeitet von slinshady am 08.02.2016, 20:41, insgesamt einmal bearbeitet
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: 08.02.2016, 20:12     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Also das Plotproblem ist doch noch nicht gelöst, da er mir 5 Abschnitte des Randes nicht plottet Rolling Eyes

Es ist wenigstens mir nicht möglich, mit diesen Informationen das Problem zu erkennen oder eine Hilfestellung zu geben.

Zitat:
eine andere Frage die Funktion fsolve mit root2d kann ich so nicht benutzen, da ich der funktion ja Parameter übergeben muss.

Es ist schwierig zu erahnen, was du meinst. Falls es um das Übergeben fester Parameter an fsolve geht, siehe hier:
http://de.mathworks.com/help/optim/.....ing-extra-parameters.html
(mein bevorzugter Weg: anonymous functions)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.