Autor Zpráva
Jan Valenta
Profil *
Nevíte, jak naprogramovat kalkulačku, která mi spočítá RPSN ? Vzorec je moc složitý a snažím se, ale pořád mi to nejde. Vstupní data jsou: Výše úvěru, výše splátky a počet splátek a výstupní je RPSN. Máte prosím někdo hotový script, přiblížení nebo dobrou radu ?
Petr ZZZ
Profil
Co to je, to RPSN? Roční procentní sazba nákladů?
Jan Valenta
Profil *
Přesně tak http://cs.wikipedia.org/wiki/RPSN
ninja
Profil
Uvedená data nejsou dostatečná. Je potřeba znát ještě dobu splácení, respektive periodicitu splátek.
Alphard
Profil
[#4] ninja
Za předpokladu měsíčních splátek se bez těchto údajů obejdeme. A aspoň to bude geometrická řada :-)

Jan Valenta:
V rychlosti jsem naťukal tohle. Je to upravené z wikipedie pro jednodušší případ. Beru finanční měsíc jako 30 dní. Zdůrazňuji, že nemám vzdělání ve finančnictví, jen jsem upravil ten vzorec z wikipedie.

<?php

class RPSN
{
    public $A, $B, $n;

    public function setLoan($A)
    {
        $this->A = $A;
    }

    public function setRepayment($B)
    {
        $this->B = $B;
    }

    public function setNumRepayment($n)
    {
        $this->n = $n;
    }

    public function getValue($in)
    {
        $A = $this->A;
        $B = $this->B;
        $n = $this->n;

        return $A - ($B/pow(1+$in, 1/12)*((pow(1+$in, -1*$n/12)-1)/(pow(1+$in, -1/12)-1)));
    }
    
    public function calculate()
    {
        $l = 0.000001;
        $r = 2;
        $cOld = -1;
        for ($i = 0; $i <= 50; $i++)
        {
            $c = ($l + $r)/2;
            $lv = $this->getValue($l);
            $rv = $this->getValue($r);
            $cv = $this->getValue($c);

            if ($lv < 0 && $cv < 0 && $rv > 0)
            {
                $l = $c;
            }
            elseif ($lv < 0 && $cv > 0 && $rv > 0)
            {
                $r = $c;
            }
            else
            {
               throw new Exception("Invalid interval");
            }

            if (round($c, 7) == round($cOld, 7))
            {
                return round($c, 7);
            }
            else
            {
                $cOld = $c;
            }
        }
        throw new Exception("Can't solve");
    }
}

$bs = new RPSN;
$bs->setLoan(50000); // půjčka
$bs->setRepayment(949); // měsíční splátka
$bs->setNumRepayment(84); // počet měsíčních splátek
echo $bs->calculate()*100, " %";
Jan Valenta
Profil *
Mockrát Vám děkuji !
Joker
Profil
Alphard:
Za předpokladu měsíčních splátek se bez těchto údajů obejdeme.
Za předpokladu měsíčních splátek známe periodicitu splácení :-D

Jan Valenta:
Připomínám, že do RPSN se nepočítají jen splátky úvěru, ale i všechny další náklady na úvěr (třeba poplatek za uzavření smlouvy).
Alphard
Profil
Joker:
Za předpokladu měsíčních splátek známe periodicitu splácení :-D
No dobře, mohl jsem tam napsat předpokládejme měsíční splátky. Také jsem mohl přesně spočítat počet iterací a první pravá mez je zřejmě zbytečně vysoká, jestli jsou ještě nějaké připomínky :-). Je to jen rychlý nástřel řešení.
Jan Valenta
Profil *
Já bych tohle neudělal ani za měsíc a objekty se teprve začínám učit, ale je to dobrá věc :) .. Časem zahrnu i další poplatky, zatím mi to postačí obecně.
Jan Valenta
Profil *
Mohu se ještě prosím zeptat, kde mohu štelovat s intervaly ? Počítá mi to jen do 200 % RPNS, poté chyba.
Jan Valenta
Profil *
Už to mám :)
Petr ZZZ
Profil
Jan Valenta:
Už to mám :)
Co? Jak? Čtenáře zajímá řešení!
Alphard
Profil
Petr ZZZ:
Čtenáře zajímá řešení!
Ani jsem to nekomentoval :-) Snad každého programátora po přečtení kódu napadne, že defaultní pravá mez intervalu je nastavena na 34. řádku.
mikexc
Profil *
Dobrý den,
Vím, že je toto téma již delší dobu neaktivní, avšak nechci zakládat zbytečně nové téma. Koukám se na výše uvedený kód na výpočet RPSN, avšak stále nemohu přijít na to, jak do tohoto vzorce zakomponovat také poplatek za zřízení půjčky. Mohl by prosím někdo poradit, případně mě nasměrovat? Děkuji
Alphard
Profil
mikexc:
Je to stále aktuální? Jestli se k tomu dostanu, tak tu třídu upravím.
Palo42
Profil *
Dobrý den, bylo by možné třídu upravit pro týdenní splátky. Díky

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: