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

Variable aus impliziten Funktionen bestimmen

 

ITSE
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2011, 14:44     Titel: Variable aus impliziten Funktionen bestimmen
  Antworten mit Zitat      
HI

ich habe ein Problem mit der Berechnung einer Variablen aus impliziten Funktionen.
Meine zu berechnende Variable ist v, da sie in einigen Funktionen vorkommt habe ich sie zunächst mit syms = v definiert. Über v weiß ich das es zwischen (0,1] liegen muss.

Code:
init
R1 = [    9.1882   28.4887   23.2505    8.1342    1.5389;
   28.4887  123.5995  110.7081   39.7564    7.8915;
   23.2505  110.7081  177.5209   67.8702   16.7624;
    8.1342   39.7564   67.8702   28.9017    7.0587;
    1.5389    7.8915   16.7624    7.0587    2.2227]
x = [-0.0392;   0.0085 ;  -0.0358   ; 0.0167    ;0.2226]
syms v real
V = [v^5,v^4,v^3,v^2,v]
D = diag(V)

R=D\R1/D
xRx = x'*R*x

ks = D\adachstern-a0
hs = D\adachs-a0
hr = D\adachr-a

es = hs'/R*hs
er = hr'/R*hr

hsx = sqrt(sum((hs'*x).^2)) %da ich norm(hs'*x) nicht verwenden kann wegen syms


Die Funktionen aus denen v nun bestimmt werden soll sind:

|hs'*x| = 1 oder |hs'*x|-1=0 und
g = 0 = max(es,er)*xRx - 1

In der g = 0 Gleichung habe ich das Problem das max nicht für sym Varaiblen funktioniert, was ja auch logisch ist.
Nun scheint es mir aber rechnerisch nicht sinnvoll irgendwelche Schleifen laufen zu lassen bis beide Gleichungen erfüllt sind. Der solve Befehl funktioniert aufgrund von sym auch nicht.

Hat jemand eine Idee oder einen Tip?

Danke euch Thomas
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: 01.06.2011, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

was spricht dagegen, das ganze numerisch anzugehen und mit FSOLVE zu lösen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 11:03     Titel:
  Antworten mit Zitat      
HI,

danke dir für den Vorschlag, nur habe ich auch mit fsolve das Problem das er die max Operation nicht auf sym Variablen anwenden kann.

Habe es mal nur mit der einen Funktion versucht und da bekomme ich nen Fehler
Code:
x0 = 1;
x = fsolve(hsx-1,x0)


??? Error using ==> lsqfcnchk at 111
If FUN is a MATLAB object, it must have an feval method.


Gruß Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.06.2011, 11:45     Titel:
  Antworten mit Zitat      
Hallo ITSE,

Zitat:
Code:
x0 = 1;
x = fsolve(hsx-1,x0)

"hsx-1" ist keine (anonyme) Funktion und kann deshalb nicht mit FEVAL berechnet werden. Schaue Dir nochmal die Beispiele in "doc fsolve" an.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ITSE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 11:57     Titel:
  Antworten mit Zitat      
Hi

habe nun ein neues .m-File erstellt für die zwei Funktionen er berechnet mir nun auch ein Ergebnis das nahe Null aber nicht bei Null liegt.

Diese Funktion rufe ich zum Optiomieren auf:

Code:
function F = YY(v)
init
optimierungsergebnis
R1 = [    9.1882   28.4887   23.2505    8.1342    1.5389;
   28.4887  123.5995  110.7081   39.7564    7.8915;
   23.2505  110.7081  177.5209   67.8702   16.7624;
    8.1342   39.7564   67.8702   28.9017    7.0587;
    1.5389    7.8915   16.7624    7.0587    2.2227]
x = [-0.0392;   0.0085 ;  -0.0358   ; 0.0167    ;0.2226]

V = [v^5,v^4,v^3,v^2,v]
D = diag(V)

R=D\R1/D
xRx = x'*R*x

ks = D\adachstern-a0
hs = D\adachs-a0
hr = D\adachr-a

es = hs'/R*hs
er = hr'/R*hr

hsx = sqrt(sum((hs'*x).^2))
F = [hsx-1; max(es,er)*xRx-1];


Gruß Thomas
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: 06.06.2011, 12:30     Titel:
  Antworten mit Zitat      
Hallo,

wäre gut, wenn du auch noch den Aufruf mit reinstellst.
Ansonsten: du kannst die Genauigkeit über Optionen wie TolX oder TolFun einstellen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 12:45     Titel:
  Antworten mit Zitat      
HI

also mein Aufruf ist im Endeffekt folgender:

Code:
v0 = 1;
[v,fval] = fsolve(@YY,v0)


Gruß Thomas
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: 06.06.2011, 13:18     Titel:
  Antworten mit Zitat      
Hallo,

ohne deine Initialisierungsdateien werde ich das Programm nicht laufenlassen und damit die Problematik nicht nachvollziehen können.

Wie groß ist fval denn? Wenn es z.B. 1e-3 oder 1e-6 ist, dann hilft eine Anpassung der Optionen, siehe Beitrag von 12:30.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 13:25     Titel:
  Antworten mit Zitat      
Hi

Ach ja sorry die habe ich ja nie gepostet. Ich hänge die Dateien mal an.
Die Datei zum ausführen heißt Regelgesetz.

GRuß Thomas

EDIT: Habe gerade gesehen das die YY falsch war. Habe sie neu hoch geladen.
Mein Problem ist das v = 0 gesetzt wird. jedoch soll v größer als Null sein, aber maximal 1 werden.

YY.m
 Beschreibung:

Download
 Dateiname:  YY.m
 Dateigröße:  622 Bytes
 Heruntergeladen:  304 mal
Regelgesetz.m
 Beschreibung:

Download
 Dateiname:  Regelgesetz.m
 Dateigröße:  360 Bytes
 Heruntergeladen:  291 mal
Optimierungsergebnis.m
 Beschreibung:

Download
 Dateiname:  Optimierungsergebnis.m
 Dateigröße:  597 Bytes
 Heruntergeladen:  314 mal
init.m
 Beschreibung:

Download
 Dateiname:  init.m
 Dateigröße:  992 Bytes
 Heruntergeladen:  282 mal
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: 06.06.2011, 17:18     Titel:
  Antworten mit Zitat      
Hallo,

ich habe das eben mit MATLAB 2011a laufen lassen und bekomme bei Ausführung von Regelgesetz.m:
v =
0.8032
fval =
3.0763e-011

Falls du andere Ergebnisse bekommst: mit welcher MATLAB-Version arbeitest du?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 17:20     Titel:
  Antworten mit Zitat      
HI

ja ich bekomme andere ERgebnisse. Habe die 2009b Version zur Verfügung.

Gruß Thomas
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.06.2011, 09:18     Titel:
  Antworten mit Zitat      
Hallo,

ich habe es nun auch mal auf 2009b ausprobiert und reproduzieren können. Dir fällt sicher auch auf, dass da im Command Window sehr viele NaN angezeigt werden. Das legt die Vermutung nahe, dass irgendein Problem aufgetreten ist.
Zur Analyse des Problems kann oft das dritte Rückgabeargument (exitflag) hilfreich sein.
Im vorliegenden Fall ist das einfachste, mit einem anderen Startwert, z.B. 0.5 zu beginnen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2011, 09:30     Titel:
  Antworten mit Zitat      
HI

also als exitflag erhalte ich 0 (= Too many function evaluations or iterations.). Wenn ich mit 0.5 starte bekomme ich den exitflagwert 1 (=FSOLVE converged to a root).

Habe nun zwei Fragen:
a) Wie kommst du auf die 0.5? Ist das Erfahrungssache, oder nimmt man bei solchen Numerischen Verfahren immer idealerweise den Mittelwert als Startwert?

b)Wie kann ich sicherstellen das v die 0 nie erreicht? Weil dann bekomme ich ja wieder Probleme. (Davon ausgehend das sich x laufend ändert und nur zum Test als fixer Vektor angenommen wurde).

GRuß Thomas
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.06.2011, 10:29     Titel:
  Antworten mit Zitat      
Hallo,

a) ich habe einfach das erstbeste genommen, was mir eingefallen ist.
Wenn du weißt, dass die Lösung zwischen 0 und 1 liegen soll, ist das naheliegend.

b) Mit fsolve im Grunde gar nicht. Wenn es Nebenbedingungen gibt, kann man f(v) = y das umschreiben in min(abs(f(v) - y)) und es mit fminbnd oder fmincon angehen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2011, 10:32     Titel:
  Antworten mit Zitat      
Hi Harald,

dann bedanke ich mich recht herzlich bei dir. Hast mir sehr geholfen.
Werde mir einfach den v-Wert plotten lassen, dann sehe ich den Verlauf ja und kann ihn bei Bedarf mit den von dir vorgeschlagenen Ideen begrenzen.

Gruß Thomas
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.