 The Museum of HP Calculators

# Equation Solver for the HP-41C/CV/CX

This program is Copyright © 1999 by Stefan Vorkoetter and is used here by permission.

This program is supplied without representation or warranty of any kind. Stefan Vorkoetter and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.

## Overview

My HP-42S recently broke down, and I obtained a used HP-19C and HP-41CX from a colleague. After repairing the 19C, the first thing I missed (besides about 8k of memory) was the equation solving capability.

The HP-42S has a solver where you can provide a program for an equation of n variables, fix any n-1 of these variables, and solve for the remaining one. So, I immediately set out to write such a solver for my "new" 19C. After I repaired the 41CX, I ported the solver to that machine and enhanced it a bit to make it easier to use (alpha prompting and named equations).

The solver uses the secant method, in which the two most recent guesses are used to define a line. The point where the line intercepts the x-axis is used as the next guess. When two consecutive guesses are the same, the solution has been found. I'm sure this solver is not as good as the one in the HP-42S, but it works sufficiently well for my purposes. It can get into an infinite loop on periodic functions, line sin(x).

## Usage

Using the solver is simple. First, rearrange your equation so all the terms are on one side. In other words, rewrite it in the form f(a1,...,an) = 0.

Next, enter the equation as a subroutine with an alphanumeric global label. The parameters are represented by the like-numbered registers (i.e. a1 is in register 01, and so on).

To solve for any one parameter,

1. store values for all the other parameters in the appropriate registers,
2. execute the SOLVE program,
3. specify the equation to solve (by name),
4. specify the register number you wish to solve for, and
5. give two initial guesses for the parameter you wish to solve for.

After finding a solution, you can change parameters, and find further solutions for the same equation by pressing R/S and continuing with step 4 above.

See the sample problem for more details.

## The Program

```LINE     CODE           COMMENTS

01      LBL'SOLVE      -main entry point
02      'FUNCTION?     -prompt for equation to solve
03      AON
04      PROMPT
05      ASTO 13
06      AOFF
07      LBL 02         -prompt for register to solve for
08      RCL 00         -default is same as last time
09      'REGISTER?
10      PROMPT
11      STO 00
12      RCL 11         -prompt for first guess
13      'GUESS1?       -default is answer from last solution
14      PROMPT
15      STO 11
16      STO IND 00
17      2              -prompt for second guess
18      *              -default is twice the first guess
19      'GUESS2?
20      PROMPT
21      STO 12
22      XEQ IND 13     -compute f1 = f(R01,..,guess1,..,Rnn)
23      STO 10
24      RCL 12         -compute f2 = f(R01,..,guess2,..,Rnn)
25      STO IND 00
26      LBL 01
27      XEQ IND 13
28      STO 12         -compute guess2 <- (guess1 f2 - guess2 f1) / (f2 - f1)
29      RCL 11
30      *
31      RCL IND 00
32      STO 11         -move old guess2 to guess1 while we're here
33      RCL 10
34      *
35      -
36      RCL 12
37      ENTER^
38      X<> 10         -move old f2 to f1 while we're here
39      -
40      /
41      STO IND 00     -save new value for guess2
42      RCL 11         -compare to previous guess
43      X!=Y?          -keep going until they're the same
44      GTO 01
45      RTN
46      GTO 02         -if user press R/S, go back to solve same eqn again
47      END
```

## Registers

 R00 Index i of variable to solve for R01..R09 Variables to solve for (up to 9) R10 Previous value for f(R1,..,Rn) R11 Previous value of Ri R12 Second guess during initialization. Current value for f(R1,..,Rn) during main loop R13 Alpha name of function to solve for.

## Sample Problem

The net resistance, r3, of two parallel resistors of resistance r1 and r2 is given by:

 r3 = r1 r2 ------------- r1 + r2

This can be rewritten in the form f(r1,r2,r3) = 0 as follows:

 r1 r2 - r3 = 0 ------------- r1 + r2

The following subroutine implements this equation:

```LINE     CODE

01      LBL'RES
02      RCL 01
03      RCL 02
04      *
05      RCL 01
06      RCL 02
07      +
08      /
09      RCL 03
10      -
11      RTN
12      END
```

What is the resistance of a 5k Ohm and 10k Ohm resistor in parallel?:

 KEYSTROKES DISPLAY COMMENTS 5 STO 01 5.0000 Store 5 in R01 10 STO 02 10.0000 Store 10 in R02 XEQ "SOLVE" FUNCTION? Run the solver "RES" R/S REGISTER? Solve equation "RES" (calculator will already be in ALPHA mode) 3 R/S GUESS1? Solve for R03 3 R/S GUESS2? First guess is 3 4 R/S 3.3333 Second guess is 4. Answer is 3.3333

What resistance is needed in parallel with a 10k Ohm resistor to give a 2k Ohm parallel resistance?:

 KEYSTROKES DISPLAY COMMENTS 2 STO 03 2.0000 Store 2 in R03 (R02 is still 10 from the previous problem) R/S REGISTER? Solve the same equation again 1 R/S GUESS1? Solve for R01 R/S GUESS2? First guess is 3.3333 (answer from last time) R/S 2.5000 Second guess is 6.6667 (twice first guess). Answer is 2.5

If the program cannot find a solution, it will eventually end up dividing by zero, which will display DATA ERROR. For example, what resistance is needed in parallel with a 10k Ohm resistor to give a 12k Ohm parallel resistance?:

 KEYSTROKES DISPLAY COMMENTS 12 STO 03 12.0000 Store 2 in R03 (R02 is still 10 from the previous problem) R/S REGISTER? Solve the same equation again 1 R/S GUESS1? Solve for R01 R/S GUESS2? First guess is 2.5 (answer from last time) R/S DATA ERROR Second guess is 5 (twice first guess). Can't find solution.

It's not possible to put something in parallel with a 10k Ohm resistor and end up with a higher resistance.

## Notes

This program started life on my HP-19C. The listing of the HP-19C version gives notes on portability. As shown here, the program will work on any of the HP-41 models (C, CV, and CX). It will probably also work on the HP-42S, but that would be redundant since the 42S has a solver built in.

If you want to use the solver as a subroutine from within another program, you'll need to modify the front end a bit to get rid of the prompting. You'll probably want something more along the lines of the HP-19C version, which takes the register number to solve for, and the two initial guesses, on the stack. You can enhance this to take the name of the equation in the alpha register.

The solver as written is 99 bytes long, and will fit on one track of a magnetic card if you happen to have a card reader.