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

Funktion in while-Schleife defnieren

 

Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2010, 16:39     Titel: Funktion in while-Schleife defnieren
  Antworten mit Zitat      
Hallo,

ich möchte in Matlab in einer while schleife wieder eine Funktion definieren. Die Funktion hängt von den Werten in der while schleife ab und deswegen soll sich die Funktion mit jedem Durchlauf ändern.
Allerdings zeigt mir Matlab immer den Fehler:

Function definition is misplaced or improperly nested.

an. Was wohl daran liegt, dass man keine Funktion in einer while Schleife definieren kann, oder? Weiß jemand wie ich es sonst machen könnte?

Hier mein Code:
Code:

function v = av(S,T,B,r)

%Schritt 2:
mean_equity = mean(S);
sigma_equity = 1/length(S)*sum((S-mean_equity).^2);
sigma_neu = sigma_equity
sigma = sigma_equity + 10

%Iteration
while abs(sigma_neu-sigma)>0.1
sigma = sigma_neu

%Schritt 3:  
function F = Fun(x)
    for i=1:length(S)
    F(i) = S(i) - x(i)*normcdf((log(x(i)/100)+(r+0.5*(sigma)^2))/(sigma*sqrt(T(i))))+ B*exp(-r*T(i))*normcdf((log(x(i)/100)+(r-0.5*(sigma)^2))/(sigma*sqrt(T(i))));
    end
end

options = optimset('TolFun',1e-8);
x = fsolve(@(x) Fun(x), S, options)

Schritt 4:
    for j=2:length(S)
    r(j)=log(x(j)/x(j-1));
    end

mean_r= mean(r)

%Schritt 5:
sigma_neu=1/(length(S)-1)*sum((r-mean_r).^2)

end

v=sigma_neu

end
 


heph0013
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.03.08
Wohnort: ---
Version: 7.2.0.232 (R2006a)
     Beitrag Verfasst am: 08.06.2010, 17:05     Titel:
  Antworten mit Zitat      
Keine Ahnung ob ich wirklich verstanden hab was du willst, aber ich meine es müsste so funktionieren:
Code:

function v = av(S,T,B,r)

%Schritt 2:
mean_equity = mean(S);
sigma_equity = 1/length(S)*sum((S-mean_equity).^2);
sigma_neu = sigma_equity
sigma = sigma_equity + 10

%Iteration
while abs(sigma_neu-sigma)>0.1
    sigma = sigma_neu

    %Schritt 3:
    F = Fun(x,S,sigma,T)

    options = optimset('TolFun',1e-8);
    x = fsolve(@(x) Fun(x), S, options)

    Schritt 4:
    for j=2:length(S)
        r(j)=log(x(j)/x(j-1));
    end

    mean_r= mean(r)

    %Schritt 5:
    sigma_neu=1/(length(S)-1)*sum((r-mean_r).^2)

end

v=sigma_neu

end



function F = Fun(x,S,sigma,T)
for i=1:length(S)
    F(i) = S(i) - x(i)*normcdf((log(x(i)/100)+(r+0.5*(sigma)^2))/(sigma*sqrt(T(i))))+ B*exp(-r*T(i))*normcdf((log(x(i)/100)+(r-0.5*(sigma)^2))/(sigma*sqrt(T(i))));
end
end
 


Also die Funktion außerhalb (am Ende) definieren und in der Schleife aufrufen.

Gruß heph0013
Private Nachricht senden Benutzer-Profile anzeigen
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2010, 17:17     Titel:
  Antworten mit Zitat      
Danke, aber dann kommt bei mir bei Matlab der Fehler:

Code:

??? Undefined function or variable "x".

Error in ==> test2 at 14
    F = Fun(x,S,sigma,T)
 


Ich möchte eben verschiedene Funktionen definieren die von x, sigma, T, und S abhängen sollen, wobei ich immer sigma, T und S in die Funktion einfüge und ich dann eine Funktion möchte die von x abhängt. Mit dem Befehl fsolve löse ich dann f(x) nach x auf und berechne mir damit neues sigma und mache das wieder in die funktion f rein, dadurch verändert sie sich und ich löse wieder mit fsolve. Allerdings klappt das bei mir nicht Smile Vielleicht hast du ja noch eine andere Idee?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 08.06.2010, 17:38     Titel:
  Antworten mit Zitat      
Hallo Christina,
ja in der Schleife ist wirklich nicht erlaubt Funktion zu definieren:

Code:

function v = av(S,T,B,r)

% Schritt 2:
mean_equity = mean(S);
sigma_equity = 1/length(S)*sum((S-mean_equity).^2);
sigma_neu = sigma_equity
sigma = sigma_equity + 10

% Iteration
while abs(sigma_neu-sigma)>0.1
   sigma = sigma_neu
   
   % Schritt 3:
   options = optimset('TolFun',1e-8);
   x = fsolve(@(x) Fun(x), S, options)
   
   % Schritt 4:
   for j=2:length(S)
      r(j)=log(x(j)/x(j-1));
   end
   
   mean_r = mean(r)
   
   % Schritt 5:
   sigma_neu=1/(length(S)-1)*sum((r-mean_r).^2)
   
end

v=sigma_neu


   function F = Fun(x)
      for i=1:length(S)
         F(i) = S(i) - x(i)*normcdf((log(x(i)/100)+(r+0.5*(sigma)^2))/(sigma*sqrt(T(i))))+ B*exp(-r*T(i))*normcdf((log(x(i)/100)+(r-0.5*(sigma)^2))/(sigma*sqrt(T(i))));
      end
   end
end

 




oder nach heph0013 Vorschlag


Code:

function v = av(S,T,B,r)

% Schritt 2:
mean_equity = mean(S);
sigma_equity = 1/length(S)*sum((S-mean_equity).^2);
sigma_neu = sigma_equity
sigma = sigma_equity + 10

% Iteration
while abs(sigma_neu-sigma)>0.1
   sigma = sigma_neu
   
   % Schritt 3:
   options = optimset('TolFun',1e-8);
   x = fsolve(@(x)Fun(x,S,sigma,T,B,r), S, options)
   
   % Schritt 4:
   for j=2:length(S)
      r(j)=log(x(j)/x(j-1));
   end
   
   mean_r = mean(r)
   
   %Schritt 5:
   sigma_neu=1/(length(S)-1)*sum((r-mean_r).^2)
   
end

v=sigma_neu


function F = Fun(x,S,sigma,T,B,r)
for i=1:length(S)
   F(i) = S(i) - x(i)*normcdf((log(x(i)/100)+(r+0.5*(sigma)^2))/(sigma*sqrt(T(i))))+ B*exp(-r*T(i))*normcdf((log(x(i)/100)+(r-0.5*(sigma)^2))/(sigma*sqrt(T(i))));
end
 


Zuletzt bearbeitet von denny am 08.06.2010, 18:07, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Christina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2010, 17:51     Titel:
  Antworten mit Zitat      
Hallo,

aber das Problem daran ist, dass sich dann der Wert von "sigma" in der Funktion nicht ändert, wenn ich Sie außerhalb der while schleife hinschreibe, oder? Die Funktion soll sich aber mit änderndem sigma auch ändern und das geht ja nur wenn sie in der while schleife steht bzw. ich weiß nicht wie ich das sonst machen kann, dass sich das sigma dort auch ändert?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 08.06.2010, 18:12     Titel:
  Antworten mit Zitat      
also Funktion muss nur einmal definiert werden, in der Schleife kann man nur durch Aufrufe steuern, dass sigma anderes Wert annimmt

Deswegen war Vorschlag heph0013 gut, du sollst über Funktionskopf die sigma übergeben so in etwa
Code:


function v = av(S,T,B,r)

% Schritt 2:
mean_equity = mean(S);
sigma_equity = 1/length(S)*sum((S-mean_equity).^2);
sigma_neu = sigma_equity
sigma = sigma_equity + 10

% Iteration
while abs(sigma_neu-sigma)>0.1
   sigma = sigma_neu
   
   % Schritt 3:
   options = optimset('TolFun',1e-8);
   x = fsolve(@(x)Fun(x,S,sigma,T,B,r), S, options)
   
   % Schritt 4:
   for j=2:length(S)
      r(j)=log(x(j)/x(j-1));
   end
   
   mean_r = mean(r)
   
   % Schritt 5:
   sigma_neu=1/(length(S)-1)*sum((r-mean_r).^2)
   
end

v=sigma_neu


function F = Fun(x,S,sigma,T,B,r)
for i=1:length(S)
   F(i) = S(i) - x(i)*normcdf((log(x(i)/100)+(r+0.5*(sigma)^2))/(sigma*sqrt(T(i))))+ B*exp(-r*T(i))*normcdf((log(x(i)/100)+(r-0.5*(sigma)^2))/(sigma*sqrt(T(i))));
end
 
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.