Bisection Plus Program
01-11-2014, 11:29 AM (This post was last modified: 01-14-2014 01:26 PM by Namir.)
Post: #1
 Namir Senior Member Posts: 601 Joined: Dec 2013
Bisection Plus Program
This program implements the new Bisection Plus algorithm for the HP-41C. The attachment contains a ZIP file. This file has a .raw file that you can load with HP-41C emulators that read .raw files. Click here to download a pdf file that discusses the new algorithm.

Algorithm

Code:
Given f(x)=0, the root-bracketing interval [A,B], and the tolerance for the root of f(x):

Calculate Fa = f(A) and Fb=f(B).
Exit if Fa*Fb > 0
X2 = A
Repeat
LastX2 = X2
X1=(A+B)/2
Fx1 = f(X1)
If Fx1*Fa > 0 then
Slope = (Fb – Fx1)/(B – X1)
Intercept = Fb – Slope * B
Else
Slope = (Fa – Fx1)/(A – X1)
Intercept = Fa – Slope * A
End If
X2=-Intercept / Slope
Fx2 = f(X2)
If Fx1*Fx2 < 0 then
A = X1
Fa = Fx1
B = X2
Fb = Fx2
Else
If Fx2*Fa > 0 then
A=X2
Fa=Fx2
Else
B=X2
Fb=Fx2
End If
End If
Until |A-B| < tolerance OR |X2 - LastX2| < tolerance
Return X2

Memory Map

R00 = Tolerance
R01 = A
R02 = B
R03 = X1
R04 = X2
R05 = F(A)
R06 = F(B)
R07 = F(X1)
R08 = F(X2)
R09 = Slope
R10 = LastX2
R11 = Iterations

Listing

Code:
1 LBL "BISPLS"
2 LBL A
3 "A^B?"
4 PROMPT        # Promot for [A, B]
5 STO 02
6 X<>Y
7 STO 01
8 "TOLER"
9 CF 22
10 PROMPT        # Prompt for tolerance value
11 FC? 22
12 1E-8        # default tolerance is 1E-08
13 STO 00
14 RCL 01
15 XEQ E        # Calculate f(A)
16 STO 05
17 RCL 02
18 XEQ E        # Calculate f(B)
19 STO 06
20 RCL 05
21 *
22 X>0?        # Do the values of f(A) and f(B) have the same sign?
23 GTO 07        # jump to error message
24 RCL 01
25 STO 04        # X2=A
26 0
27 STO 11        # Iteration counter = 0
28 LBL 00        # ---------------- start iterations loop
29 1
30 STO+ 11        # Increment iteration counter
31 RCL 04
32 STO 10        # LastX2 = X2
33 RCL 01
34 RCL 02
35 +
36 2
37 /        # X1 = (A+B)/2
38 STO 03
39 XEQ E        # Calculate f(X1)
40 STO 07
41 RCL 05
42 *
43 X>0?        # Do FX1 and FA have the same sign?
44 GTO 01
45 RCL 05
46 RCL 07
47 -
48 RCL 01
49 RCL 03
50 -
51 /        # Calculate slope = (FA - FX)/(A - X)
52 STO 09
53 RCL 01
54 *
55 RCL 05
56 -        # Calculate the negative value of the intercept
57 GTO 02        # Finish calculations of X2 and f(X2) in lbl 02
58 LBL 01
59 RCL 06
60 RCL 07
61 -
62 RCL 02
63 RCL 03
64 -
65 /        # Calculate slope  = (FB - FX)/(B - X)
66 STO 09
67 RCL 02
68 *
69 RCL 06
70 -        # Calculate the negative value of the intercept
71 LBL 02
72 RCL 09
73 /        # Calculate X2
74 STO  04
75 PSE        # Pause to display X2
76 XEQ E        # Calculate f(X2)
77 STO 08
78 RCL 07
79 RCL 08
80 *
81 X>0?        # DO f(X1) and f(X2) have the same sing?
82 GTO 03        # Replace A or B with X2
83 RCL 03
84 STO 01        # A = X1
85 RCL 04
86 STO 02        # B = X2
87 RCL 07
88 STO 05        # F(A) = F(X1)
89 RCL 08
90 STO 06        # F(B) = F(X2)
91 GTO 05        # jump to section that test for convergence
92 LBL 03
93 RCL 08
94 RCL 05
95 *
96 X>0?        # Do f(X2) annd f(A) have the same signs?
97 GTO 04
98 LBL 04
99 RCL 04
100 STO 02        # B = X2
101 RCL 08
102 STO 06        # f(B) = f(X2)
103 GTO 05        # jump to section that test for convergence
104 LBL 04
105 RCL 04
106 STO 01        # A = X2
107 RCL 08
108 STO 05        # f(A) = f(X2)
109 LBL 05        # start testing for convergence
110 RCL 04
111 RCL 10
112 -
113 ABS
114 RCL 00
115 X>Y?        # |X2 - LastX2| < tolerance?
116 GTO 06        # exit loop and show the value for the root
117 RCL 01
118 RCL 02
119 -
120 ABS
121 X<>Y
122 X>Y?        # |A - B| < tolerance?
123 GTO 06        # exit loop and show the value for the root
124 GTO 00        # ---------------- end of iterations loop
125 LBL 06
126 "RT="
127 RCL 04
128 ARCL X
129 PROMPT        # Display the refined root value
130 "ITRS="
131 ARCL 11
132 PROMPT
133 RTN
134 LBL 07
135 "FA*FB>0"
136 PROMPT
137 RTN
138 LBL E        # f(x) = 0. ou can edit the code after LBL E and until RTN
139 EXP
140 LASTX
141 X^2
142 3
143 *
144 -
145 RTN

Usage

1. Press [A}. The program prompts you to enter the root-bracketing interval [A, B].
2. Key in the value of A, press [ENTER}, key in the value of B, and then press [R/S].
3. The program prompts you to enter the tolerance value.
4. Enter the tolerance value and then press [R/S]. To accept the default value of 1E-8, just press the [R/S].
5. The program displays intermediate refinment for the guess. When it converges the program displays "RT=" followed by the root value. Th eprogram also displays the number of iterations.
8. (Optional) to evaluate f(X) at any value of X, enter that value and then press [E].

Example

Find the root for f(x)=exp(x)-3*X^2 in teh range [3,4].

1. Set the display mode to FIX 5.
2. Press [A]. The program displays the prompt "A^B?".
3 Key in 3, press {ENTER], key in 4, and then press [R/S].
4. The program prompts you to enter the tolerance value. Accept the defualt value of 1E-8 by simply pressing the [R/S] key.
5. The program pauses to display intermediate refinement for the root. When done, the program displays "RT=3.73308".
6. Press [R/S] to view the number of iterations. The program displays "ITRS=7.00000".

Customization

Label E contains the commands that implement f(X). Edit the code after label E to insert the code for your f(X). Registers 12 and up are available to store the values of X and any other intermediate values used in calculating f(X).

Attached File(s)