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 für Funktion bestimmen

 

slinshady
Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 23.01.2016, 16:55     Titel: Optimierung für Funktion bestimmen
  Antworten mit Zitat      
Hallo Leute,
erstmal ein schönes Wochenende und danke, dass ihr euch trotzdem mit den Problemen anderer beschäftigt. Ich habe ein Minimierungsproblem für eine bestimmte Funktion des Abstandes.
Zur Problemstellung:
Gegeben sind verschiedene Punkte eines Rundkurses und ich bilde zunächst aus immer 2 Punkten auf den beiden Rändern ein Trapez in wessen Mitte ich einen weitern Punkt bestimme, dessen Abstand zu beiden Rändern gleich sein soll und er soll eine Orthogonalität aufweisen. Diese habe ich alles durch meine Allgemeine Berechnung für den Abstand, der nur noch vom y Wert abhängt gegeben.
Durch das Trapez kenne ich eine obere und untere Grenze des Trapez' .
Was ich bisher nicht weiß ist, was ich mit A und b anfangen soll?

Im Anschluss mal mein Matlab kompletter Matlab Code:

Code:
A = rechterRand;
B = linkerRand;

A(size(A,1)+1,:)=A(1,:);                
%letzten und ersten Punkt des Rundkurses verbinden
B(size(B,1)+1,:)=B(1,:);                
%letzten und ersten Punkt des Rundkurses verbinden

dx=bsxfun(@minus,A(:,1),B(:,1)');
dy=bsxfun(@minus,A(:,2),B(:,2)');


abstand1=dx.^2.+dy.^2;

[~,indx]=min(abstand1,[],2);
for i = 1:size(A,1)-1
            % Trapez aus linearen Geraden durch die 4 Punkten erstellen
            a = A(i,1);
            b = A(i,2);
            c = A(i+1,1);
            d = A(i+1,2);
            e = B(indx(i),1);
            f = B(indx(i),2);
            g = B(indx(i)+1,1);
            h = B(indx(i)+1,2);
            x1=0.5*(e-a);                               %Aufspannvektor für die Mittlere Gerade
            x2=0.5*(e-a)+0.5*(0.5*(g-c)-0.5*(e-a));     %Schrittweite x
            lb = min([b,d,f,h]);                        %untere Schranke für y des aktuellen Trapez'
            ub = max([b,d,f,h]);                        %obere Schranke für y des aktuellen Trapez'
            %fun ist die Gleichung für den orthogonalen Abstand eines
            %Punktes im Trapez zu den beiden Rändern. y für minimalen
            %Abstand wird gesucht
            fun = (((((x-f)*(g-h)-(x2-e)*(h-f))/(((f-b)/2-x)*(h-f)-(x2+a-e)*(g-e)))-(((x-b)*(c-a)-(x2-a)*(d-b))/(((f-b)/2-x)*(d-b)-(x2+a-e)*(c-a)))).^2*((((f-b)/2-x).^2+(x2+a-e).^2))).^(1/2);
            y = fmincon(fun,(f-b)/2,A,b,[],[],lb,ub);   %A,b wie belegen?
            mitte(i,:) = [x(2),y];                      %alle Punkte der mittleren Gerade abspeichern
         dmax(i) = (fun(x==y)/2);                    %den orthogonalen Abstand der Punkte zum Rand speichern
end


Meine zwei fragen sind:

1.) habe ich die Minimierung so korrrekt angewendet für meine Formel die unten steht. Wie muss ich A und b bestimmen für dieses Problem?

2.) kann ich
Code:
dmax(i) = (fun(x==y)/2);  
so schreiben? also, dass ich das minimierte y in die funktion einsetze, wobei diese ja nach x minimiert, weshalb ich y in x von fun einsetzen möchte.

3.) das ist mir gerade nach dem ausführen aufgefallen. wie kann ich für fun x voerst als variable abspeichern? ich habe mal von symbolischen variablen gehört?
Idea Arrow scheint mit dem hinzufügen von syms x; davor zu funktionieren.
der erste Fehler lautet nun wie erwartet:

A must have 1 column(s).

Error in abstand (line 42)
y = fmincon(fun,(f-b)/2,A,b,[],[],lb,ub); %A,b wie belegen?


Zum Schluss noch meine Formel für den Abstand:
Die eckige Klammer ist ein Skalar, die Runde ein Vector, dessen Betrag ich nehme...
es handelt sich einfach nur um die Strecke zwischen zwei Schnittpunkten zu den Rändern des Trapez' .
d(y)=| \left[\frac{(g-e) (y-f)-(x-e) (h-f)}{(h-f) \left(\frac{f-b}{2}-y\right)-(g-e) (a-e+x)}-\frac{(c-a) (y-b)-(x-a) (d-b)}{(d-b) \left(\frac{f-b}{2}-y\right)-(c-a) (a-e+x)}\right]
<br />

<br />
\begin{pmatrix} (a-e+x)^2 \\ \frac{f-b}{2}-y \end{pmatrix}|

zu erwähnen wäre für die Gleichung gilt:
x=x2 aus dem matlab code und y ist der zu minimierende Parameter


Ideen meinerseits bisher:

der minimierer löst das Problem ja für A*x=b
könnte es funktionieren den b= 1/Skalar und A =Vektor und also funktion denn z.b. die bsxfun mit @hypot zu verwenden? diese @hypot ist nämlich genau die Betragsrechnung. Allerdings soll mein ergebniss keinen Vektor sondern nur das y ausgeben...
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 24.01.2016, 12:28     Titel:
  Antworten mit Zitat      
Viel zu viel Text und zuviele Fragen Very Happy Kannst du dein Problem klarer/einfacher formulieren?

Was A,b angeht, schau mal in die Doku http://de.mathworks.com/help/optim/ug/fmincon.html. Über A und b kannst du Nebenbedingungen der Form A*x<=b vorgeben, z.B. wenn x folgende Ungleichung erfüllen soll x(1)+x(2)<2.

Gruß
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: 24.01.2016, 13:57     Titel:
  Antworten mit Zitat      
Ixh habe ja keine nebenbedingungen. Eigentlich nur die Funktion d (y) dessen funktionswert ich für ein y im Bereich der Grenzen minimieren möchte. Dann interessiert mich der Funktionswert selbst und das entsprechende y dazu.
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 24.01.2016, 19:45     Titel:
  Antworten mit Zitat      
Wenn du keine Nebenbedingungen hast, übergibst du A=[] und b=[] , noch besser, du benutzt fminunc.

Gruß
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: 24.01.2016, 21:27     Titel:
  Antworten mit Zitat      
Dafür gibt es dann allerdings keine Grenzen oder?
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: 25.01.2016, 00:04     Titel:
  Antworten mit Zitat      
Habe fminunc nun ausprobiert.
Hier mein Code:
Code:
A = road_bounds_left;
B = road_bounds_right;

A(size(A,1)+1,:)=A(1,:);                %letzten und ersten Punkt des Rundkurses verbinden
B(size(B,1)+1,:)=B(1,:);                %letzten und ersten Punkt des Rundkurses verbinden

%B transponieren um in dx für jeden Punkt aus A zu jedem Punkt aus B den
%Abstand in einem Array abzuspeichern.
dx=bsxfun(@minus,A(:,1),B(:,1)');
dy=bsxfun(@minus,A(:,2),B(:,2)');


abstand1=dx.^2.+dy.^2;

[~,indx]=min(abstand1,[],2);
for i = 1:size(A,1)-1
            % Trapez aus linearen Geraden durch die 4 Punkten erstellen
            a = A(i,1);
            b = A(i,2);
            c = A(i+1,1);
            d = A(i+1,2);
            e = B(indx(i),1);
            f = B(indx(i),2);
            g = B(indx(i)+1,1);
            h = B(indx(i)+1,2);
            x1=0.5*(e-a);                               %Aufspannvektor für die Mittlere Gerade
            x2=0.5*(e-a)+0.5*(0.5*(g-c)-0.5*(e-a));     %Schrittweite x
            lb = min([b,d,f,h]);                        %untere Schranke für y des aktuellen Trapez'
            ub = max([b,d,f,h]);                        %obere Schranke für y des aktuellen Trapez'
            %fun ist die Gleichung für den orthogonalen Abstand eines
            %Punktes im Trapez zu den beiden Rändern. y für minimalen
            %Abstand wird gesucht
            syms x;
            dy = (((((x-f)*(g-h)-(x2-e)*(h-f))/(((f-b)/2-x)*(h-f)-(x2+a-e)*(g-e)))-(((x-b)*(c-a)-(x2-a)*(d-b))/(((f-b)/2-x)*(d-b)-(x2+a-e)*(c-a)))).^2*((((f-b)/2-x).^2+(x2+a-e).^2))).^(1/2);
            y = fminunc(dy,((h-d)-(f-b)/2));
            mitte(i,:) = [x(2),y];                      %alle Punkte der mittleren Gerade abspeichern
         dmax(i) = (dy(x==y)/2);                    %den orthogonalen Abstand der Punkte zum Rand speichern
end


führt zu folgender Fehlermeldung:
Error using optimfcnchk (line 288)
If FUN is a MATLAB object, it must have an feval method.

Error in fminunc (line 240)
funfcn = optimfcnchk(FUN,'fminunc',length(varargin),funValCheck,gradflag,hessflag);

Error in abstand (line 43)
y = fminunc(dy,((h-d)-(f-b)/2));


liegt mein Fehler im dy oder was ist mein Fehler? Sad
das mit den Grenzen zuletzt habe ich nun glaube ich verstanden. das x0 ist eine Art Startwert von welchem aus er anfängt nach dem Minimum zu suchen oder?
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: 25.01.2016, 00:33     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion muss als Function Handle übergeben werden, z.B.
Code:

Siehe auch die Doku für Beispiele.

Vor allem aber minimiert fminunc numerisch, also nicht mit syms vermischen!

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: 25.01.2016, 01:01     Titel:
  Antworten mit Zitat      
Also einfach @(x) davor und syms weg? Ja eine numerische Lösung ist von Nöten, da die analytische über die Ableitung und Nullstellen berechnen mit mathematica nicht funktioniert. Ich probiere es morgen mal aus.
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: 25.01.2016, 13:09     Titel:
  Antworten mit Zitat      
Hallo soweit funktioniert es jetzt Smile
allerdings möchte ich zu guter letzt die Punkte durch einen Spline interpolieren, was leider gar nicht funktioniert Sad

Code:
A = road_bounds_in(1:pylonenabstandInnen:length(road_bounds_in),:);
B = road_bounds_out(1:pylonenabstandInnen:length(road_bounds_out),:);

A(size(A,1)+1,:)=A(1,:);                %letzten und ersten Punkt des Rundkurses verbinden
B(size(B,1)+1,:)=B(1,:);                %letzten und ersten Punkt des Rundkurses verbinden

%B transponieren um in dx für jeden Punkt aus A zu jedem Punkt aus B den
%Abstand in einem Array abzuspeichern.
dx=bsxfun(@minus,A(:,1),B(:,1)');
dy=bsxfun(@minus,A(:,2),B(:,2)');


abstand1=dx.^2.+dy.^2;

[~,indx]=min(abstand1,[],2);
for i = 1:size(A,1)-1
            % Trapez aus linearen Geraden durch die 4 Punkten erstellen
            a = A(i,1);
            b = A(i,2);
            c = A(i+1,1);
            d = A(i+1,2);
            e = B(indx(i),1);
            f = B(indx(i),2);
            g = B(indx(i)+1,1);
            h = B(indx(i)+1,2);
            xa=0.5*(e+a);                               %Aufspannvektor für die Mittlere Gerade
            x2=0.5*(e+a)+0.5*(0.5*(g+c)-0.5*(e+a));     %Schrittweite x
            x1=(x2+xa)/2;
            lb = min([b,d,f,h]);                        %untere Schranke für y des aktuellen Trapez'
            ub = max([b,d,f,h]);                        %obere Schranke für y des aktuellen Trapez'
            %fun ist die Gleichung für den orthogonalen Abstand eines
            %Punktes im Trapez zu den beiden Rändern. y für minimalen
            %Abstand wird gesucht
            dy = @(x)(((((x-f)*(g-h)-(x1-e)*(h-f))/(((f-b)/2-x)*(h-f)-(x1+a-e)*(g-e)))-(((x-b)*(c-a)-(x1-a)*(d-b))/(((f-b)/2-x)*(d-b)-(x1+a-e)*(c-a)))).^2*((((f-b)/2-x).^2+(x1+a-e).^2))).^(1/2);
            y1=((h+d)-(f+b)/2);
            y = fminunc(dy,lb);
            mitte(i,:) = [x1,y];                          %alle Punkte der mittleren Gerade abspeichern
         abstand2 = (((((y-f)*(g-h)-(x1-e)*(h-f))/(((f-b)/2-y)*(h-f)-(x1+a-e)*(g-e)))-(((y-b)*(c-a)-(x1-a)*(d-b))/(((f-b)/2-y)*(d-b)-(x1+a-e)*(c-a)))).^2*((((f-b)/2-y).^2+(x1+a-e).^2))).^(1/2);
            dmax(i) = (abstand2/2);                     %den orthogonalen Abstand der Punkte zum Rand speichern
end
hold on
xx= min(mitte(:,1):max(mitte(:,1);
yy= spline(mitte(:,1),mitte(:,2),xx);
plot(xx,yy,'r')


Die Werte für yy liegen alle bei 10^4-11 also da kann etwas nicht stimmen ^^
Mir fällt jetzt leider kein Fehler ein Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 25.01.2016, 13:29     Titel:
  Antworten mit Zitat      
Es bringt absolut nichts, dass komplette/komplexe Skript hier nochmal hochzuladen. Wir können es sowieso nicht starten, da Variablen fehlen und keiner wird sich hier die Zeit nehmen um sich in deinen Code einzuarbeiten.

Mach dir einfach mal die Mühe dein Problem möglichst einfach und simpel herunterzubrechen. So wie ich das sehe, hast du den Spline Befehl richitg benutzt, aber
Code:
xx= min(mitte(:,1):max(mitte(:,1);


sieht komisch aus.
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: 25.01.2016, 13:45     Titel:
  Antworten mit Zitat      
ich habe den Fehler gefunden. Es hängt damit zusammen, dass es sich um Koordinaten eines Rundkurses handelt, wobei Punkte die auf der anderen Seite der Strecke liegen nah bei einander liegende x-Werte besitzen. Dadurch springt der Spline zwischen diesen hin und her. Das Problem muss ich anders lösen.

Ich denke ich kann das Thema damit schließen

Herzlichen Dank für die Hilfe!!!
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.