Resistor optimizer

I have created a small utility (for Windows, Win32) to find out optimal resistor values for two common purposes, finding out optimal values for voltage divider resistors and for finding optimal values for parallel/series resistors for given target resistance. This was my first real windows application that made sense written with C++ (using MFC), so excuse me if (read: when) you find any bugs.


Resistor Optimizer screenshot


The usage should be quite self-explanatory. Just experiment with the inputs and you'll see the effect. The target division factor is the ratio of the output voltage to the input voltage, so it must be greater than 0 and less than 1. The division factor can be given as decimal number (use "." as a decimal separator) or in form of division, something like "1.25/3". The division factor can be also calculated with two auxliary calculators, decibel attenuator or voltage regulator calculator.

Series resistance is like it says, sum of upper and lower resistors. Series resistance is also the input resistance of the divider. Likewise, parallel resistance is upper and lower resistors connected in parallel, i.e. output resistance of the divider. These constraints may be individually enabled using the checkboxes.

Source resistance is the resistance in series with the voltage source which feeds the divider, i.e. is in series with the upper resistor. Likewise, load resistance is the resistance what loads the divider, i.e. is connected in parallel to the lower resistor. Setting either or both to zero, ignores the values.

If there are more than 1 resistor selected in divider optimization, then the connection between them can be chosen, in parallel or in series. Upper or lower resistor connections can be chosen separately.

Although the program shows SI-prefixes in the outputs and in the resistor value list, they can't be currently used in the limit inputs. Maybe some time in the future.

Individual resistors can be excluded from the search space by just un-checking the desired checkboxes in the "Available resistor values"-box. Finally, the resistor values are loaded from *.ser files. This makes it possible to add more sets of resistors for specialized occasions.

Version history

2009-12-02 0.52
  • Fixed a bug with "max number of results", now count correctly reduces instead of showing the old results
2009-12-20 0.53
  • Resistor values are now easier to read due to addition of the SI-prefixes
  • Optimization elapsed time is now shown at the end
  • Lot of internal restructuring (for the better, I hope)
2011-01-11 0.54
  • Added option to specify load and source resistances when optimizing dividers.
  • Added option to optimize series of resistors. Old "Parallel optimizer" tab renamed to "Target resistance optimizer".
2013-08-11 0.55
  • Added multithreading, so it is now possible to abort a long optimization instead of killing the application with task manager etc.
  • Added a status bar to show the progress of the optimization process.
2014-01-25 0.56
  • Added possibility to select parallel or series combinations in divider optimization.
2014-02-22 0.56
  • Fixed E96 resistor series, base value of 9.42 is removed and missing value of 1.65 is added. Thanks to Stefano for pointing this out. Sorry for inconvenience caused.
  • Added E196 resistor series file.
2014-12-18 0.57
  • Corrected validation of user inputs. This caused user inputs to be accepted only partly and produced incorrect results. Thanks to Tom for pointing this out.
  • Increased maximum result count from 100 to 1000.
  • Enhanced error field. Now it shows errors less than 0.01% as part per millions and exactly zero errors as "Zero".
  • Added result list sorting function. Click on result list headers to sort the result list accordingly.


The optimizer and accompanying resistor series files can be downloaded here (43 KiB). Just extract the files anywhere you like. There is no installer. The application needs Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) installed.
© Janne Ahonen 2008-