(71B) calculate interest rate
|
12-20-2019, 04:14 PM
Post: #1
|
|||
|
|||
(71B) calculate interest rate
Calculate interest rate, given N, FV, PV, PMT
For term (1+i)n - 1, it use the more accurate expm1(n * log1p(i)) = FNE(n*FNL(i)) Code: 10 INPUT "n, fv, pv, pmt ? ";N,F,P,M Example, from https://www.hpmuseum.org/forum/thread-6725.html >RUN n, fv, pv, pmt ? 168, 10925.76, 0, -45 4.79863130882E-3 -655.6829061 5.33181256535E-3 -1255.8749515 4.21615468581E-3 -41.4514876 4.17684617474E-3 -1.4838737 4.17538677149E-3 -.0035171 4.17538330417E-3 -.0000003 4.17538330387E-3 0 4.17538330387E-3 Note both guesses (I1,I2) over-estimated interest rate on purpose. If they bracketed the true rate, secant's method tends to over-shoot all over. >60 I2=.5*I1 >RUN n, fv, pv, pmt ? 168, 10925.76, 0, -45 2.66590628268E-3 1404.76181571 5.33181256535E-3 -1255.8749515 3.99885942402E-3 177.2179603 4.16369398215E-3 11.8480798 4.17461116346E-3 .7831243 4.7532118644E-3 -606.2697042 4.1753575833E-3 .0260875 4.46428472385E-3 -298.0104305 4.17538287345E-3 .0004364 4.31983379865E-3 -147.7508024 4.1753833001E-3 .0000038 4.24760854938E-3 -73.5647316 4.17538330383E-3 0 4.17538330383E-3 |
|||
12-20-2019, 08:36 PM
Post: #2
|
|||
|
|||
RE: (71B) calculate interest rate
(12-20-2019 04:14 PM)Albert Chan Wrote: For term (1+i)n - 1, it use the more accurate expm1(n * log1p(i)) = FNE(n*FNL(i)) Wouldn't using the HP-71's built-in EXPM1 and LOGP1 functions be even more accurate? <0|ɸ|0> -Joe- |
|||
12-20-2019, 10:10 PM
Post: #3
|
|||
|
|||
RE: (71B) calculate interest rate
(12-20-2019 08:36 PM)Joe Horn Wrote: Wouldn't using the HP-71's built-in EXPM1 and LOGP1 functions be even more accurate? Thanks! I don't know HP71B had both expm1 and logp1 built-in. The revised code is much shorter. Code: 10 INPUT "n, fv, pv, pmt ? ";N,F,P,M >RUN n, fv, pv, pmt ? 168, 10925.76, 0, -45 4.79863130882E-3 -655.6829061 5.33181256535E-3 -1255.8749515 4.21615468581E-3 -41.4514876 4.17684617474E-3 -1.4838737 4.17538677149E-3 -.0035171 4.17538330417E-3 -.0000003 4.17538330387E-3 0 4.17538330387E-3 FYI, 1st column is interest rate, 2nd column is error in FV (thus function named FNF) Example, I=0.479863%, calculated FV=11581.44, under-estimated true FV by -$655.68 Playing emulator interactively, this is unexpected ... >FNROOT(I1, .5*I1, FNF(FVAR)) MATH ERR:Kybd FN in FNROOT/INTEGRAL |
|||
12-21-2019, 03:44 PM
Post: #4
|
|||
|
|||
RE: (71B) calculate interest rate
(12-20-2019 10:10 PM)Albert Chan Wrote: Playing emulator interactively, this is unexpected ... Doesn't come from the emulator, actually. As the error message implies, it is not allowed to use a User-Defined function in FNROOT/INTEGRAL from the keyboard. J-F |
|||
12-22-2019, 03:07 PM
(This post was last modified: 12-27-2019 12:23 PM by Albert Chan.)
Post: #5
|
|||
|
|||
RE: (71B) calculate interest rate
(12-21-2019 03:44 PM)J-F Garnier Wrote:(12-20-2019 10:10 PM)Albert Chan Wrote: Playing emulator interactively, this is unexpected ... Thanks J-F Garnier. A trick to get around this limitation is to wrap FNROOT inside an user function. >PURGE >10 INPUT "N, FV, PV, PMT ? ";N,F,P,M >20 DEF FNF(I) @ Y=F+P+(M/I+P)*EXPM1(N*LOGP1(I)) @ DISP I,Y @ FNF=Y @ END DEF >30 I1=-(M*N+P+F)/(N*((N-1)/2*M+P)) >40 I2=.9*I1 >50 DEF FNS(A,B)=FNROOT(A,B,FNF(FVAR)) > >RUN N, FV, PV, PMT ? 168, 10925.76, 0, -45 >I=FNS(I1,.5*I1) 2.66590628268E-3 1404.76181566 5.33181256535E-3 -1255.8749515 3.99885942402E-3 177.2179603 4.16369398215E-3 11.8480797 4.17461116337E-3 .7831244 4.75321186436E-3 -606.2697042 4.1753575833E-3 .0260875 4.46428472383E-3 -298.0104306 4.17538287345E-3 .0004365 4.31983379864E-3 -147.7508024 4.1753833002E-3 .0000036 4.24760854942E-3 -73.5647316 4.17538330374E-3 .0000001 4.21149592658E-3 -36.7050556 4.17538330384E-3 0 Update: this may improve rate guesses closer to true rate. y = (1+I)^N-1 ≈ NI / (1 - ½ (N-1)I), Pade[1,1] approximation Using this rough estimate of y for equation F + P + y(P + M/I) = 0 Solve for I, we have I = (F+P+M*N) / ((N-1)/2*(F-P) - P) Above should be better than I1 estimate, which assumed no compounding. Note: I1 is solution of F + P(1+NI) + m Σ(1+kI, k=0 to N-1) = 0 To make I2 still over-estimated true rate, take the arithmetic mean. For the same reasoning, I1 can be reduced the same way. >I1=(F+P+M*N) / (N*((1-N)/2*M - P)) → 5.33181256535E-3 >I2=(F+P+M*N) / ((N-1)/2*(F-P) - P) → 3.68930884387E-3 >I3=(I1+I2)/2 → 4.51056070461E-3 >I4=(I1+I3)/2 → 4.92118663498E-3 >I=FNS(I3,I4) 4.51056070461E-3 -346.6853844 4.92118663498E-3 -790.3342398 4.18968078622E-3 -14.5135902 4.17566057222E-3 -.2812298 4.17538353441E-3 -.0002338 4.1753833039E-3 0 |
|||
12-29-2019, 02:46 PM
Post: #6
|
|||
|
|||
RE: (71B) calculate interest rate
This version use 3-points fit to interpolate for the root, instead of secant line.
Note: this assumed x = f(y), where f is a parabola, and interpolate for x as f(0) Note: initial 2 rate guesses are arithmetic mean and harmonic mean of I1, I2. 10 INPUT "N, FV, PV, PMT ? ";N,F,P,M 20 DEF FNI(X1,Y1,X2,Y2)=X1-Y1*(X2-X1)/(Y2-Y1) 30 DEF FNF(I)=F+P+(P+M/I)*EXPM1(N*LOGP1(I)) 40 I1=(F+P+M*N)/(N*((1-N)/2*M-P)) 50 I2=(F+P+M*N)/((N-1)/2*(F-P)-P) 60 X1=(I1+I2)/2 @ Y1=FNF(X1) @ DISP X1,Y1 70 X2=I1*I2/X1 @ Y2=FNF(X2) @ DISP X2,Y2 80 X3=FNI(X1,Y1,X2,Y2) 90 Y3=FNF(X3) @ DISP X3,Y3 100 IF Y3=0 THEN END 110 E3=-Y3*FNI((X3-X2)/(Y3-Y2),Y2,(X3-X1)/(Y3-Y1),Y1) 120 X1=X2 @ Y1=Y2 @ X2=X3 @ Y2=Y3 @ X3=X3+E3 130 IF .00001*E3+X3-X3 THEN 90 140 DISP X3 >RUN N, FV, PV, PMT ? 168, 10925.76, 0, -45 4.51056070461E-3 -346.6853844 4.36103281596E-3 -190.3488201 4.17897395274E-3 -3.6426516 4.17538425315E-3 -.0009629 4.1753833038E-3 0 >RUN N, FV, PV, PMT ? 600, 1E6, 0, -250 1.08792431831E-2 -14144337.7743 4.93576250272E-3 78873.414844 4.96872148862E-3 65799.655312 5.13383450348E-3 -2862.19318 5.12721962668E-3 -6.6198 5.12720426664E-3 .00052 5.12720426785E-3 |
|||
01-02-2020, 05:43 PM
(This post was last modified: 01-05-2020 09:42 PM by Albert Chan.)
Post: #7
|
|||
|
|||
RE: (71B) calculate interest rate
This version extrapolate for rate, using Steffensen's method
I used HP71B quirky RES behavior on line-50, see HP71B RES bug? Code: 10 INPUT "N, FV, PV, PMT ? ";N,F,P,M To keep code short, it run until extrapolation hit by divide-by-0 (or other) error. >DEFAULT OFF ! error if overflow/underflow, divide-by-0 ... >RUN N, FV, PV, PMT ? 168, 10925.76, 0, -45 4.36103281596E-3 4.17891608926E-3 4.17538469191E-3 4.17538330384E-3 ERR L20:0/0 >RUN N, FV, PV, PMT ? 600, 1e6, 0, -250 4.93576250272E-3 5.12771388025E-3 5.12720427126E-3 5.12720426785E-3 ERR L20:0/0 Note: above code require very good guess for rate. Going for FV errors (see previous posts) is much better. Example: tried this with default guess failed. >RUN N, FV, PV, PMT ? 40, 0, 25000, -1000 4.09556313993E-2 ERR L30:LOG(neg) We need better guess (for this case, 2.1% ≤ guess ≤ 3.1%) >.025 @ RUN 50 .025 .025252440621 .025243859111 2.52438486204E-2 ERR L20:0/0 |
|||
01-06-2020, 09:16 PM
(This post was last modified: 01-09-2020 01:43 PM by Albert Chan.)
Post: #8
|
|||
|
|||
RE: (71B) calculate interest rate
Some improvements over my 3-points fit rate finder (post #6)
Quote:10 INPUT "n, fv, pv, pmt ? ";N,F,P,M >RUN n, fv, pv, pmt ? 168, 10925.76, 0, -45 4.36103281596E-3 -190.348820115 4.24431571126E-3 -70.197349875 4.17612485668E-3 -.75216795 4.17538334438E-3 -.000041145 4.17538330381E-3 >RUN n, fv, pv, pmt ? 600, 1e6, 0, -250 4.93576250272E-3 78873.4148425 5.18818567872E-3 -26668.4502875 5.12440307537E-3 1206.531985 5.12720670893E-3 -1.0521275 5.12720426781E-3 .0000175 5.12720426785E-3 >RUN n, fv, pv, pmt ? 30,50000,1000,-1000 3.76850605653E-2 -930.964898075 3.68851990742E-2 -289.785021642 3.65236969622E-2 -3.12429013971 3.65197437154E-2 -1.49842044802E-4 3.65197435258E-2 |
|||
02-13-2020, 03:41 PM
Post: #9
|
|||
|
|||
RE: (71B) calculate interest rate
Again, basing the code on my 3-points fit rate finder (post #6), but with different guess.
\( \large {1\over I} ≈ {\binom{N}{3}M + \binom{N}{2}P \over \binom{N}{2}M + \binom{N}{1}P} - {\binom{N}{2}M + \binom{N}{1}P \over F + P + M N}\) 10 INPUT "N, FV, PV, PMT ? ";N,F,P,M 20 DEF FNS(X1,Y1,X2,Y2)=X1-Y1*(X2-X1)/(Y2-Y1) 30 DEF FNF(I) 40 A=N @ IF I THEN A=EXPM1(N*LOGP1(I))/I 50 FNF=F+P+A*(P*I+M) 60 END DEF 70 C2=N*(N-1)/2 @ C3=C2*(N-2)/3 80 C3=C3*M+C2*P @ C2=C2*M+N*P @ C1=F+P+M*N @ C3=C3/C2 100 X1=1/(C3-C2/C1) 110 Y1=FNF(X1) @ DISP X1,Y1 @ IF Y1=0 THEN END 120 X2=1/(C3-C2/(C1+Y1)) 130 Y2=FNF(X2) @ DISP X2,Y2 @ IF Y2=0 THEN END 140 X3=FNS(X1,Y1,X2,Y2) 150 Y3=FNF(X3) @ DISP X3,Y3 @ IF Y3=0 THEN END 160 E3=-Y3*FNS((X3-X2)/(Y3-Y2),Y2,(X3-X1)/(Y3-Y1),Y1) 170 X1=X2 @ Y1=Y2 @ X2=X3 @ Y2=Y3 @ X3=X3+E3 180 IF .00001*E3+X3-X3 THEN 150 190 DISP X3 >RUN N, FV, PV, PMT ? 168, 10925.76, 0, -45 4.1171440611E-3 58.8707146 4.17253086536E-3 2.8926652 4.17539297797E-3 -.0098122 4.17538330384E-3 0 >RUN N, FV, PV, PMT ? 600, 1e6, 0, -250 3.9653228628E-3 385578.34249 4.24281053755E-3 311571.332995 5.41104048363E-3 -130995.27126 5.15294183714E-3 -11161.26946 5.1267015499E-3 216.64945 5.12720400635E-3 .112712 5.12720426786E-3 >RUN N, FV, PV, PMT ? 30,50000,1000,-1000 3.54153653967E-2 863.8049367 3.63975416852E-2 96.4591994 .03652100616 -.997799 3.65197435458E-2 -.0000155 3.65197435262E-2 |
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 1 Guest(s)