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

fzero über mehrere, veränderliche Zeilenvektoren nutzen

 

Ray
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2012, 23:21     Titel: fzero über mehrere, veränderliche Zeilenvektoren nutzen
  Antworten mit Zitat      
Hallo zusammen!

Bin noch neu hier, deswegen bitte, wenn ich etwas falsch mache, ein Auge zudrücken. Ich versuche mal möglichst genau zu beschreiben, was los ist.

Ich habe für folgende Funktion

Code:

function [C0 int_Zins] = abzinsung( anfangsinvestition, ertragswerte, zeitindex)
% Berechnung der Kapitalwerte von in Vektoren übergebenen Werten

set(0,'RecursionLimit',1000);
 interner_Zins = 12.6823736350389;
% interner_Zins = 9.78313956819415;

[zeilen_e,spalten_e]=size(ertragswerte);


% Preallocation
ertragswerte_abgezinst(zeilen_e,length(zeitindex))=0;
sum_ertragswerte_abgezinst(zeilen_e,1)=0;
C0(zeilen_e,1)=0;
int_Zins(zeilen_e,1)=0;

for I=1:zeilen_e      % Zeilen
    for J=zeitindex   % Spalten
       
      % Zeilenweises Abzinsen der Spaltenelemente mit jeweiligem Abzinsungsfaktor      
            ertragswerte_abgezinst(I,J)= (ertragswerte(I,J).*power( (1+interner_Zins/100),-J));
           
            sum_ertragswerte_abgezinst(I,:)= sum(ertragswerte_abgezinst(I,:),2); % Summierung der Zeilenvektoren
           
            C0(I,:) = -anfangsinvestition(I)+sum_ertragswerte_abgezinst(I,:); % Berechnung des Barwertes C0 für jede Zeile
           
            int_Zins(I)=1;
       
    end
end

end
 


ein Testscript geschrieben:
Code:

clear
clc

anfangsinvestition=[90000; 90000];
zeitindex=1:5;

differenzE_A=[40000 30000 22000 17000 9000;...
              15000 30000 20000 30000 25000];

[barwert intZins] = abzinsung(anfangsinvestition,differenzE_A,zeitindex)
 


Die Funktion funktioniert auch so wie sie soll.
Ich möchte jedoch die Funktion erweitern. Dazu möchte ich den internen Zins nicht mehr vorgeben (über das auskommentieren der Variable, wie oben geschehen), sondern für jede Zeile berechnen. Ich habe dies für eine "anfangsinvestition" mit einem Wert und einer Zahlungsreihe mit einem Zeilenvektor (differenzE_A) über fzero gelöst. Jedoch versagt dies bei mir dann, wenn ich Matrizen übergebe.
Ich dachte, mit einem Aufruf von
Code:

fun=@(interner_Zins) % gleich unter for J=zeitindex
int_Zins(I)= fzero( C0(I,:) ,10)
 

könnte das Problem lösen. Tut es aber nicht, da sich C0 über mehrere Zwischenschritte, nämlich ertragswerte_abgezinst(I,J) und sum_ertragswerte_abgezinst(I,:) berechnet und sich nicht in "einer Zeile" als komplette zu übergebende Funktion darstellen lässt.

Zur Funktionsbeschreibung und zum Ziel:
Dabei ist C0 der Barwert. Durch Variation des interner_Zins soll C0 gleich(nahe) Null werden. Dabei soll zeilenweise vorgegangen werden. Die Rückgabewerte der Funktion sollen dann den Barwert (in diesem Fall eine Spalte mit 2 Zeilen, mit Werten um 1e-7) und den ermittelten int_Zins mit 12.68 usw. für den oberen Zeilenvektor aus differenzE_A und 9.78 für den unteren Zeilenvektor zurückgeben. Die Rückgabe des C0 dient hierbei der Kontrolle, denn wenn er, wie im aktuellen Script, -6713 zurückgibt, ist der interne Zins falsch.

Habt ihr Tipps oder einen Lösungsvorschlag für mich?

Bei Fragen stehe ich euch gerne zur Verfügung!
Danke schonmal im Vorraus.
Ray
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: 21.08.2012, 17:20     Titel: Re: fzero über mehrere, veränderliche Zeilenvektoren nutze
  Antworten mit Zitat      
Hallo Ray,

Herzlich willkommen im Forum!

Wozu setzt Du RecursionLimit? Das sieht hier ganz deplatziert aus.

Zitat:
Ich habe dies für eine "anfangsinvestition" mit einem Wert und einer Zahlungsreihe mit einem Zeilenvektor (differenzE_A) über fzero gelöst. ...
Code:
fun=@(interner_Zins) % gleich unter for J=zeitindex
int_Zins(I)= fzero( C0(I,:) ,10)

Das ist unklar. Was soll "fun=@(interner_Zins)" bewirken, wenn es nirgends mehr aufgerufen wird?

Zitat:
... da sich C0 über mehrere Zwischenschritte, nämlich ertragswerte_abgezinst(I,J) und sum_ertragswerte_abgezinst(I,:) berechnet und sich nicht in "einer Zeile" als komplette zu übergebende Funktion darstellen lässt.

Dies wird mir auch nicht klar.

Ich weiß auch nicht, was ein "Barwert" ist, das ist aber wahrscheinlich auch nebensächlich. Aber Ausdrücke wie "zeilenweise vorgehen" sollten wohl schon erklärt werden. Was ist hier die "Zeile"?

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2012, 18:18     Titel:
  Antworten mit Zitat      
Hallo Jan!

Danke für die Antwort!

Das RecursionLimit ist noch vom ausprobieren. Ich habe es mittlerweile auch als Kommentar markiert.
Die "anfangsinvestition" ist ein Vektor mit einer Spalte und zwei Zeilen. Die "differenzE_A" ist eine Matrix mit zwei Zeilen und fünf Spalten.
Dazu übergebe ich noch den Zeilenvektor "zeitindex".
Was ein "barwert" ist, da hast du Recht, ist eigentlich recht nebensächlich- nicht jedoch das Rechenverfahren dahinter.
Als erste müssen die Ertragswerte abgezinst werden. Dies geschieht mit
Code:

ertragswerte_abgezinst(I,J)= (ertragswerte(I,J).*power( (1+interner_Zins/100),-J));
 

Was passiert soll, ist jetzt folgendes: es wird zeilenweise (erst für Zeile 1, dann für Zeile 2) der Matrix "differenzE_A" Spalte für Spalte mit einem Faktor multipliziert. Zeile 1, Spalte 1 mit
Code:

power( (1+interner_Zins/100),-J)
 


wobei für Zeile 1, Spalte 1 J=1 ist. Für Zeile 1 Spalte 2 ist J=2 usw.
Das denke ich, macht die Schleife auch.
Danach wird für Zeile 1 die Zeilensumme über die kompletten Spalten 1 bis 5 gebildet. Dies passiert mit
Code:

 sum_ertragswerte_abgezinst(I,:)= sum(ertragswerte_abgezinst(I,:),2);
 


Jetzt steht in der Zeile 1 nur noch ein Wert, nämlich die Zeilensumme.
Als nächstes wird der Barwert berechnet. Dies geschieht, indem diese (Zeilen)Summe zum negativen ersten Element (zeile 1, Spalte 1) des Vektors "anfangsinvestition" hinzugerechnet wird. Das klappt ja auch soweit schon.

Danach erfolgt die selbe Rechnung analog für Zeile 2 der "differenzE_A" und "anfangsinvestition". Das meine ich mit einem zeilenweisen vorgehen.

Der "richtige" interne Zinssatz wird nun gefunden, indem
Code:

C0(I,:) = -anfangsinvestition(I)+sum_ertragswerte_abgezinst(I,:);
 


gleich Null gesetzt wird und der "interner_Zins" so lange verändert wird, bis C0 = 0 oder annähernd Null ist. Dies ergibt für die Zeilen 1 von "anfangsinvestition" / "differenzE_A" einen anderen Wert als für die Zeilen 2. Der Aufruf von
Code:

fun=@(interner_Zins) % gleich unter for J=zeitindex
int_Zins(I)= fzero( C0(I,:) ,10)
 


ist natürlich nicht richtig. Ich hatte versucht, fzero irgendwie zu sagen, dass es "interner_Zins" verändern soll, um C0 = 0 zu erreichen.

Mit "mehreren Zwischenschritten" für die Berechnung C0=0 meine ich die Veränderung des "interner_Zins" die sich auf
Code:

ertragswerte_abgezinst(I,J)= ........
 

auswirkt, dass wiederum in
Code:

sum_ertragswerte_abgezinst(I,:)= ........
 

eingeht, was schlussendlich zur Berechnung von C0 dient.
Der "interner_Zins" wirkt sich also nur indirekt auf C0 aus.

Ich hoffe, ich konnte etwas mehr Klarheit in die Sache bringen.

VG Ray
Private Nachricht senden Benutzer-Profile anzeigen
 
Ray
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2012, 18:35     Titel:
  Antworten mit Zitat      
Ich habe noch einen Nachbrenner:
Dies
Code:

anfangsinvestition2=90000;
differenzE_A2=[40000 30000 22000 17000 9000];
zeitindex=1:5;
   
C0 = @(interner_Zins) -anfangsinvestition2+sum((differenzE_A2.*power( (1+interner_Zins/100),-zeitindex)),2);
Zinssatz= fzero(C0,10)
 


ist meine Lösung für dieses Problem, wenn kein mehrzeilige Matrix/Vektor für "anfangsinvestition2" und "differenzE_A2"v erwendet werden und dies führt auch zum gewünschten Ergebnis von 12.68...

Dies beantwortet hoffentlich deine Frage:

Jan S hat Folgendes geschrieben:


Zitat:
... da sich C0 über mehrere Zwischenschritte, nämlich ertragswerte_abgezinst(I,J) und sum_ertragswerte_abgezinst(I,:) berechnet und sich nicht in "einer Zeile" als komplette zu übergebende Funktion darstellen lässt.

Dies wird mir auch nicht klar.

Private Nachricht senden Benutzer-Profile anzeigen
 
Ray
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2012, 21:39     Titel:
  Antworten mit Zitat      
Ich habe das Problem gelöst:

Hier das Script
Code:

clc
clear

anfangsinvestition=[90000; 90000];

differenzE_A=[40000 30000 22000 17000 9000;...
              15000 30000 20000 30000 25000];
zeit=1:5;

[zeilen_differenzE_A,spalten_differenzE_A]=size(differenzE_A);

zeitindex = repmat(zeit,zeilen_differenzE_A,1);

A = num2cell(anfangsinvestition,2);

B = num2cell(differenzE_A, 2);

C =num2cell(zeitindex,2);

interner_Zins=cellfun(@abzinsung,A,B,C)
 


Das ruft die Funktion abzinsung auf, die hier runter folgt:
Code:

function [interner_Zinssatz] = abzinsung(A,E,zeitindex)
%abzinsung ist eine Funktion, die 3 Cell Arrays übergeben bekommt und für
%jede Zeile den internen Zinssatz ermittelt
   
   
    C0 = @(interner_Zins) -A+sum((E.*power( (1+interner_Zins/100),-zeitindex)),2);
    interner_Zinssatz = fzero(C0,10);
   
   
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.