Zadání je napsat programy, kterým se budou předávat prametry a ony budou vracet výledky, ne provést ad hoc nějaké výpočty. je potřeba začít programem (procedurou), která vrací počet dní mezi dvěma daty gregoriánského kalendáře. Buď takovou proceduru v matlabu najdete, nebo ji musíte napsat. Pokuýd ji budete psát, můžete se držet mého algioritmu v maple: Gregoriansky kalendar > Prestupny := proc (Rok) #procedura zjisti, zda je rok prestupny Vystup true: je prestupny if Rok mod 4 <> 0 or Rok mod 100 = 0 and Rok/100 mod 4 <> 0 then false else true fi end ; > PocetDniVMesici := proc (Mesic,Rok) #procedura urci pocet dni v mesici. Vstup je cislo mesice a cislo roku if member( Mesic mod 12,{1,3,5,7,8,10,12,0}) then 31 else if Mesic = 2 then #print(Rok,Prestupny(Rok)); if Prestupny(Rok) then 29 else 28 fi else 30; fi fi; end: > DelkaRoku:=proc(Rok) if Prestupny(Rok) then 366 else 365 fi end; > CisloDne:=proc(Den,Mesic,Rokk)#zbytek po deleni sedmi udava den v tydnu local i; i:='i'; # korekce pro neexistujici rok 0: if Rokk<=0 then Rok:=Rokk+1 else Rok:=Rokk fi; `if`( Rok>=2000, add(DelkaRoku(i),i=2000..Rok-1)+add(PocetDniVMesici(i,Rok),i=1..Mesic-1)+Den-2, add(-DelkaRoku(i),i=Rok..2000-1)+ add(PocetDniVMesici(i,Rok),i=1..Mesic-1)+Den-2 ); end; Warning, `Rok` is implicitly declared local > > Vzdalenost:=(DenA,MesicA,RokA,DenB,MesicB,RokB)-> CisloDne(DenB,MesicB,RokB)-CisloDne(DenA,MesicA,RokA); > Datum:=proc(den) local Den, Mesic, Rok; Den:=den+2; if Den>0 then i:=0; while Den > DelkaRoku(2000+i) do Den := Den- DelkaRoku(2000+i); i:=i+1; od; Rok:=2000+i; i:=1; while Den > PocetDniVMesici(i,Rok) do Den := Den - PocetDniVMesici(i,Rok); i:=i+1; od; Mesic:=i; else #Den:=Den-1; #print(Den); i:=0; while Den <= 0 do i:=i-1; Den := Den+ DelkaRoku(2000+i); od; Rok:=2000+i; i:=1; while Den > PocetDniVMesici(i,Rok) do Den := Den - PocetDniVMesici(i,Rok); i:=i+1; od; Mesic:=i; fi; # korekce pro neexistujici rok 0: if Rok<=0 then Rok:=Rok-1 fi; Den,Mesic,Rok; end; Warning, `i` is implicitly declared local > > Příklad 1. Vstup: splákový klendář (asi ve formě souboru, múže být třeba tak, že každý řádek je den. měsíc. rok, částka ... to si rozhodněte sami) a buď velikost dluhu, nebo úroková míra. Výstup: úroková míra, nebo velikost dluhu (to co není známo). Při počítání úrokové míry bude potřeba použít nějakou proceduru pro numerická řešení, numerické hledání kořenů, . . . Úroková míra budiž p. a. Poznámka: jsou - li splátky v čase a dluh o velikosti Z vznikl v čase a úroková míra je platí pro okamžik v němž je dluh splacen, vztah: > Z=sum(z[i]*(1+xi)^((t[0]-t[i])/DelkaAktualnihoRoku),i=1..T); (Pokud se t počítjí ve dnech). Příklad 2. Vstup: splákový klendář (asi ve formě souboru, múže být třeba tak, že každý řádek je den. měsíc. rok, částka ... to si rozhodněte sami), velikost dluhu, úroková míra, čas. Výstup: zůstatek dluhu v daném čase. Poznámka: jsou - li splátky v čase a dluh o velikosti Z vznikl v čase a úroková míra je platí v okamžiku je zůstatek dluhu: > Z*(1+xi)^(T/DelkaAktualnihoRoku)-sum(z[i]*(1+xi)^((T-t[i])/DelkaAktualnihoRoku),i=1..T); > Pokud je jednotkou času den. > Příklad 3.: Předpokládáme anuitní měsíční splátky. Vstup: tři z těchto čtyř veličin: Velikost dluhu, velikost měsíčních splátek, počet let splácení (dvanáctina počtu splátek), nebo počet měsíců plácení, úroková míra. Výstup: chybějící čtvrtá veličina & lineární část přírůstku současné hodnoty splátek (velikosti toho, co si můžeme půjčít) při měně úrokové sazby. > r[1]:=Z=simplify(sum(z*(1+xi)^(-t/12),t=1..12*T)); r[2]:=Z=simplify(sum(z*(1+xi)^(-t/12),t=1..N)); > A:=subs(xi=xi+delta,rhs(r[1])); # Castka , kterou si muzeme pujcit, kdyz se urokova mira zvetsio delta B:=rhs(r[1]); # castka, kterou si muzeme pujcit pri puvodni urokove mire Prirustek:=simplify((A-B)/A); # relativni prirustk casty, kterou sio budeme moci pujcit, kyz se urokova mira zvetsi (je-li zvetseni kladne, musi byt aporny) LinCPrirustku:=simplify(coeftayl(Prirustek,delta=0,1)); # jeho linearni cats je koeficient u delta na prvou v taylorove polynomu > >