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

Nichtlineare Optimierung

 

Alexa
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2008, 10:21     Titel: Nichtlineare Optimierung
  Antworten mit Zitat      
Hallo zusammen

Ich habe folgendes Optimierungsproblem:
Gesucht wird der Winkel alpha, welcher von theta (gegeben) und p und q abhängt.
alpha = p*theta + q

Wie eine Optimierung in Matlab mit einem Parameter funktioniert, weiss ich. Doch nun habe ich ja zwei Parameter. Hier bin ich irgendwie überfordert. Ich benutze in Matlab lsqnonlin für die Optimierung und habe auch schon einige m-files geschrieben, doch irgendwo ist der Wurm drin. Kann sonst die m-files auch mal hier posten, falls das weiter helfen könnte.

Danke
Gruss Alexa
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 10.06.2008, 13:27     Titel:
  Antworten mit Zitat      
Hallo Alexa,

lsqnonlin kann genausogut Funktionen von mehreren Variablen (bei Dir: Parametern) verarbeiten. Zum Beispiel ist dann das zweite Input-Argument x0 ein Vektor. Du müsstest also p und q zu einem Vektor zusammenfassen.

Wenn Dir das noch nicht hilft, poste am besten wirklich den (lauffähigen) Code, den Du für eine Variable verwendet hast.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Alexa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2008, 14:20     Titel:
  Antworten mit Zitat      
Danke für die Antwort. Das Ganze ist leider nur ein Teil einer grösseren Optimierungsaufgabe. Ich habe mal alles zusammen geschrieben. Doch beim Ausführen tritt der folgende Fehler auf:

??? Error using ==> lsqncommon at 101
LSQNONLIN cannot continue because user supplied objective function failed with the following error:
Error using ==> mrdivide
Matrix dimensions must agree.

Error in ==> lsqnonlin at 182
[x,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...

Error in ==> optimise_myfun at 24
[x, resnorm] = lsqnonlin(@myfun,x0,xl,xu,options)

Woran kann das liegen? Welche Matrize stimmt nicht?
Ich poste hier mal meine Codes und die verwendeten Daten sind im Excel-Dokument.

Danke jetzt schon für die Hilfe
Gruss Alexa

Zeigefinger.xls
 Beschreibung:

Download
 Dateiname:  Zeigefinger.xls
 Dateigröße:  249.5 KB
 Heruntergeladen:  847 mal
optimise_myfun.m
 Beschreibung:

Download
 Dateiname:  optimise_myfun.m
 Dateigröße:  518 Bytes
 Heruntergeladen:  693 mal
myfun.m
 Beschreibung:

Download
 Dateiname:  myfun.m
 Dateigröße:  794 Bytes
 Heruntergeladen:  674 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 11.06.2008, 15:37     Titel:
  Antworten mit Zitat      
Hallo Alexa,

die kritische Stelle ist

Code:
(sind(alpha))*d1_zf)/l1_zf


wobei ich als alpha den Term

Code:
p1_zf*theta1_zf + q1_zf


definiert habe.

d1_zf ist eine Zahl, also hier unproblematisch. alpha hat die Größe 1045x1 und l1_zf die Größe 1x256. Deshalb gibt es Probleme beim /-Operator, der auch mrdivide heißt (siehe Fehlermeldung).

Wenn die Vektoren alpha und l1_zf gleich lang wären und Du eine elemntweise Division wolltest, ginge das so:

Code:
(sind(alpha))*d1_zf)./l1_zf


also mit einem Punkt vor /. Da die Vektoren aber gar nicht gleich lang sind, ist mir völlig unklar, was da genau geteilt werden soll.

Ich hab Dein myfun zum Testen übrigens folgendermaßen aufgedröselt. So kann man erstens sehen, was eigentlich gerechnet wird, und andererseits werden die häufig verwendeten Terme auch nur einmal berechnet, was etwas Zeit spart.

Code:
function F = myfun(x)

L1_zf = x(1);
p1_zf = x(2);
q1_zf = x(3);
d1_zf = x(4);

load 'measured_length_finger.mat'
load 'Winkel_theta.mat'

t = 1:size(zf,1);

alpha = p1_zf*theta1_zf + q1_zf;
alpha_term = cosd(asind(((sind(alpha))*d1_zf)./l1_zf) - alpha);
sum1 = sum(zf(t,2,1) - zf(t,1,1));
sum2 = sum(zf(t,2,2) - zf(t,1,2));
sum3 = sum(zf(t,2,3) - zf(t,1,3));
prod = l1_zf*d1_zf;

Term = (sum1 - alpha_term*prod/sum1).^2 + ...    
       (sum2 - alpha_term*prod/sum2).^2 + ...
       (sum3 - alpha_term*prod/sum3).^2;

F = L1_zf - sqrt(Term);


Sollen alpha und l1_zf eigentlich gleich lang sein? Oder was ist mit / gemeint?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Alexa
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 09.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2008, 09:37     Titel:
  Antworten mit Zitat      
Hallo Bijick

Danke für die Antwort. Ich habe später dann auch festgestellt, dass die Grössen der einzelnen Vektoren nicht übereinstimmen. Ich habe es jetzt geändert und es funktioniert. Und deine Aufteilung der einzelnen Terme ist gut. Werde ich noch so verwenden. Danke für die Hilfe

Gruss Alexa
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.