.. _user_preface: Preface ======= *Analog computers* differ substantially from current digital computers in that they do not work by executing an algorithm in a step-by-step fashion. Instead they consist of a number of *computing elements*, each capable of performing a certain mathematical operation such as summation, multiplication or time-integration. A *program* for an analog computer describes how these computing elements are to be connected in order to create a *model* (an *analogue*) of the problem to be solved. A (very) simple problem like computing :math:`a(b+c)` could be implemented on a classic digital computer as shown in this exemplary assembler listing: :: LOAD A, R0 LOAD B, R1 LOAD C, R2 ADD R1, R2, R1 MULT R0, R1, R0 STORE R0, ... This straightforward algorithm requires six individual steps to compute the desired result. Contrast this with the analog computer program shown in figure :numref:`fig-preface-circuit`. This setup requires just two computing elements, one summer and one multiplier. The summer is fed with the values :math:`b` and :math:`c` while the multiplier is connected to the output of this summer and to the value :math:`a`. .. _fig-preface-circuit: .. figure:: preface-circuit.png :scale: 99 % :alt: TikZ drawn circuit Analog computer setup for solving :math:`x = a(b+c)` Typically, values are represented by voltages or currents in an analog computer so that only a single connection is necessary between computing elements. The advantages of this analog computing approach are manyfold. Most notable are the extremely high degree of parallelism (there are no central memory, no data dependencies, no synchronisation points, etc., so that the computing elements work in full parallelism), the resulting high speed of computation and the inherent very high energy efficiency of analog computing. While a digital computer can basically solve every problem given enough time and memory, an analog computer setup needs as many computing elements as there are operations in the governing equations of the problem to be solved. A little bit more mathematically, one can say that the size of a digital computer is constant while its time to solution typically grow much faster than just linearly with the size of the problem (making many problems basically intractable on classic digital computers). The size of the analog computer on the other hand grows linearly with the problem size but, and this cannot be overestimated, the time to solution remains constant. Classic analog computers were impressive systems, typically featuring a large patchpanel with thousands of jacks, all connected to a vast number of computing elements, such as integrators, summers, coefficient potentiometers, multipliers, etc. Programming these machines was as much of an art as a science and was quite time consuming due to the hundreds or even thousands of connections that had to be made manually. ([ulmannAP2]_ describes the history of analog computing in great detail.) Nowadays, the patchpanel is a museum piece and the actual connection of the computing elements is done electronically, under the control of an attached digital computer; this greatly simplifies the programming. Using appropriate libraries as shown below, the analog computer can be used as a mathematical machine without having to understand the underlying electronic implementation in detail. Since the basics of analog computer programming are outside the scope of this user guide, please refer to [ulmannAP2_] for detailed information on the subject or consult the section :numref:`resources`. .. [ulmannAP2] Bernd Ulmann: Analog and Hybrid Computer Programming, De Gruyter, ISBN 9783110662207, https://doi.org/10.1515/9783110662207 or `amazong book listing `_