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
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
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"?
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
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
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
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
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 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.
Das ruft die Funktion abzinsung auf, die hier runter folgt:
Code:
function[interner_Zinssatz] = abzinsung(A,E,zeitindex)
%abzinsung ist eine Funktion, die 3Cell Arrays übergeben bekommt und für
%jede Zeile den internen Zinssatz ermittelt
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
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.