HP Forums
Solver (17BII, 27S, etc) equation with multiple outputs - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: General Forum (/forum-4.html)
+--- Thread: Solver (17BII, 27S, etc) equation with multiple outputs (/thread-19571.html)



Solver (17BII, 27S, etc) equation with multiple outputs - robjordan - 02-18-2023 09:49 AM

Hi

I've read and mostly understand the detailed explanation of the Solver in the Technical Application manual, but there's a form of equation I'm struggling to get right. The intention is a single equation that can calculate an output in two possible, equivalent forms.

An example. An amplifier has gain which can be expressed as a multiple of voltage:
Vgain = Vout / Vin

But can equivalently be expressed in dB, like this:
dBgain = 20 x log(Vgain)

My Solver equation is:
DBGAIN=20xLOG(L(VGAIN:VOUT/VIN))+0xVGAIN

I can input Vin and Vout, and calculate dBgain just fine. But if I press Vgain in the solver, it says "solution not found", even though it must have calculated Vgain as an intermediate result in the calculation.

What am I doing wrong?

Thanks
Rob


RE: Solver (17BII, 27S, etc) equation with multiple outputs - robjordan - 02-18-2023 09:58 AM

As often the case, asking the question prompted me to dig in again, and I have something working now, by including two "0x" terms, thus:

DBGAIN=20xLOG(VGAIN)+0xL(VGAIN:VOUT/VIN)+0xVGAIN


RE: Solver (17BII, 27S, etc) equation with multiple outputs - Dave Britten - 02-21-2023 02:08 PM

Generally speaking, I've seen two approaches to creating multi-output equations. It should be noted that this is multi-output - I haven't seen a good way to select from multiple possible sets of inputs in a single equation.

1. Use the L() function to set the value of an auxiliary variable which you can RCL after solving. Your initial formula is a good example:

DBGAIN=20xLOG(L(VGAIN:VOUT/VIN))+0xVGAIN

You can solve for DBGAIN, VOUT, or VIN, and after solving, you can press RCL VGAIN to see the voltage gain. Solving for VGAIN directly will not work, and VGAIN also can't be used as an input here.

2. Use the S() function to check which variable is being solved for and react accordingly. For instance, this equation lets you solve for either DBGAIN or VGAIN:

IF(S(DBGAIN):DBGAIN=20*LOG(VOUT/VIN):VGAIN=VOUT/VIN)

You can also solve for VOUT or VIN, but only by using VGAIN as one of the inputs.

The third alternative, which isn't really a multi-output equation at all, is to simply store multiple equations. Smile

VGAIN=VOUT/VIN
DBGAIN=20*LOG(VOUT/VIN)

Variables will be shared between equations as long as the names are consistent, so this is often a good solution. It's like the HP 48 multiple-equation solver, but you have to figure out which equations need to be solved to get all the variables you need. Wink


RE: Solver (17BII, 27S, etc) equation with multiple outputs - robjordan - 02-21-2023 03:34 PM

Dave,

Thanks very helpful! I forgot that you can retrieve intermediate values using RCL.

I like your second approach best though, using the S() expression. The equation as you wrote it didn't validate at first, but then I figured, from reading the Don Shepherd additional material in Martin Hepperle's version of the Solver documentation, that the expressions in the two branches of the S() should be treated as having an implicit =0. So instead of writing "DBGAIN=20*LOG(VOUT/VIN)", you have to write "20*LOG(VOUT/VIN)-DBGAIN". In full:

GAIN:IF(S(DBGAIN):20×LOG(VOUT/VIN)-DBGAIN:(VOUT/VIN)-VGAIN)

Thanks again
Rob


RE: Solver (17BII, 27S, etc) equation with multiple outputs - Dave Britten - 02-21-2023 04:30 PM

(02-21-2023 03:34 PM)robjordan Wrote:  Dave,

Thanks very helpful! I forgot that you can retrieve intermediate values using RCL.

I like your second approach best though, using the S() expression. The equation as you wrote it didn't validate at first, but then I figured, from reading the Don Shepherd additional material in Martin Hepperle's version of the Solver documentation, that the expressions in the two branches of the S() should be treated as having an implicit =0. So instead of writing "DBGAIN=20*LOG(VOUT/VIN)", you have to write "20*LOG(VOUT/VIN)-DBGAIN". In full:

GAIN:IF(S(DBGAIN):20×LOG(VOUT/VIN)-DBGAIN:(VOUT/VIN)-VGAIN)

Thanks again
Rob

Oops, my mistake. Forgot you couldn't put = inside the IF() function like that. Smile But yes, any equation without = in it is treated as solving for zero, so you can just subtract one side from the other like you've demonstrated.

I've also taken advantage of that behavior to make unit conversion formulas where you can input any one variable and solve for any other, e.g.:

.0254*(IF(S(IN):-1:1)*IN+IF(S(FT):-1:1)*FT*12+IF(S(YD):-1:1)*YD*36+IF(S(MI):-1:1)*MI*63360)+IF(S(MM):-1:1)*MM/1000+IF(S(CM):-1:1)*CM/100+IF(S(M):-1:1)*M+IF(S(KM):-1:1)*KM*1000

Essentially, use S() to multiply the variable you're solving for by -1 to isolate it from all the other variables. Make sure you do CLEAR DATA to zero out all the unused variables first, or it will convert the sum of all the entered variables to the one you're solving for. (Though maybe that's what you want at times!)