Länk till formel som jag försöker lösa: I princip kan ekvationen lösaas genom att du skriver: använd Newton raphson för att lösa ekvationen. Det är ju alltid roligast om man kan fixa en lösning själv men du kan kanske ha någon nytta med vad som finns här http://www.soft-album.com/free/irr/ Newton-Raphson fungerar visserligen, och har väl en konvergens som går som h^2 tror jag, men jag tror nog att det finns bra mycket enklare varianter för det här isf; en enkel iterativ, eller en binärsökning.Krånglig matte i C#
http://odellion.com/assets/financialmodels/internal_rate_return_irr_equation.gif
Jag sitter här och sliter mitt hår. Är det någon som kan tipsa mig hur jag ska gå tillväga för att få till en funktion i C# som lyckas med att få fram IRR ur ovanstående ekvation?
Tanken jag har är att jag först sätter IRR till 1.99 och sedan räkna ut summan. Så länge Summan är större än 100 och mindre än 0 så stegas IRR ner och summan provas igen.
Problemet är dock att jag villat bort mig i alla mina loopar. Går det att göra så som jag har tänkt mig på något vis?
private void button1_Click(object sender, System.EventArgs e)
{
double Summa, temp1=0, temp2=0;
int investering = -2000000,kassaflode = 1300000,loptid =5;
for (double IRR = 1.99; IRR >= 1.09; IRR -=0.05)
{
do
{
for ( int i=1; i <= loptid; i++)
{
temp1 = (kassaflode /(Math.Pow(IRR,i)));
temp2 = temp2+temp1;
}
Summa = investering + temp2;
}
while (Summa > 100 && Summa > 0);
}
Sv: Krånglig matte i C#
x = summa (c_i /(y^i)), där y=1+IRR
Sen multiplicerar du båda sidor med y^n, och får då en n:e-gradsekvation att lösa.
Om "kassaflöde" är konstant vid varje tillfälle bör det vara hyfsat enkelt att hitta en allmän lösning.
Din iterativa variant skall väl fungera, men det verkar som att du inte riktigt har tänkt igenom koden före.Sv: Krånglig matte i C#
du har alltså f(irr) = sum_i=1^n [ (cf_i*(1+irr)^-i) ], derivera: df(irr)/dirr = sum_i=1^n [-i * cf_i*(i+irr)^(-i-1)]
Nu tar du ett irr_0 = (gissa något rimligt, kankse 1.5), iterera nu följande:
irr_k+1 = irr_{k} - f(irr_k)/( df(irr_k)/dirr )
när/om irr_k konvergerar ie. |irr_k+1 - irr_k| < epsilon ~ 0.001 (eller den precision du vill ha) så är du klar! Glöm inte att sätta ett maximalt antal steg.
för programmeringen gör du två funktioner:
1) evaluerar funktionen f(irr)
2) och en som evaluerar df(irr)/dirr
obs1 Funktionen har som tidigare inlägg egentligen n st lösningar, men att det finns fler än en intressant lösning är osannolikt,
obs2 om du börjar med ett giltigt irr_0 så bör iterationen konvergera.
Mvh
Jens BerlipsSv: Krånglig matte i C#
Sv:Krånglig matte i C#