Interaktive Berechnungs-Formulare mit Org-Mode und Python


Themen


Benchmark Papier und Stift

Kann man mit einem Computeralgebra-System (CAS) so übersichtlich rechnen wie mit Papier und Stift?

Ich arbeite gerne mit Jupyter Lab – das ist nahe dran, hat aber andere Stärken. Näher an der Papier-Rechnung sind

  • Mathcad (proprietär und für offene Betriebssysteme nicht verfügbar)
  • SMath Studio (frei aber nicht quelloffen)
  • CompPad (LibreOffice Plugin, zur Zeit keine aktive Entwicklung)

Ich arbeite mit einer anderen Lösung.

Interaktiv rechnen mit Org-mode, SymPy und LaTeX

Am meisten begeistert mich Linux, weil viele verschiedene Programme perfekt zusammen arbeiten. Man kann die Open-Source Klassiker GNU Emacs, Org-mode, Sympy und LaTeX so miteinander kombinieren, als hätte man eine monolithische Anwendung vor sich.

2025_02_08_org_sympy.png

Abbildung 1: Links die interaktive Rechnung in Emacs, rechts die LaTeX Darstellung, die auf Tastndruck aktualisiert wird.

Beispiel

Als »Hallo Welt« Beispiel berechnen wir Umfang und Fläche eines Kreises bei gegebenem Durchmesser.

Darstellung mit LaTeX


Gegeben:

\[d_{circ} = 1.250 \cdot \text{m}\]

Gleichungen:

\[C = \pi \cdot d_{circ}\]

\[A = \frac{\pi \cdot d_{circ}^{2}}{4}\]

Ergebnisse:

\[C = 3.927 \cdot \text{m}\]

\[A = 1.227 \cdot \text{m}^{2}\]


Rechnung in der Org-mode Textdatei


Gegeben:

#+BEGIN_SRC python :session :results output latex :exports results
    from sympy import pi
    from sympy.physics.units import meter
    d = symbols('d_{circ}')
    given = { d : 1.25 * meter, }
    prt( given )
#+END_SRC

Gleichungen:

#+BEGIN_SRC python :session :results output latex :exports results
    C, A = symbols('C A')
    expr = {}
    expr[C] = d * pi
    expr[A] = d**2 * pi / 4
    prt(expr)
#+END_SRC

Ergebnisse:

#+BEGIN_SRC python :session :results output latex :exports results
    res = {}
    res[C] = expr[C].subs(given).evalf()
    res[A] = expr[A].subs(given).evalf()
    prt(res)
#+END_SRC

Damit der Code so funktioniert, muss im Header der Org-Mode Datei noch die oben verwendete prt Funktion definiert werden:

#+BEGIN_SRC python :session :exports none
    from sympy import symbols, Symbol, latex, Float, sympify
    # print a dictionary that contains expressions, 
    # floats are sympified and then formatted as defined by frmt
    def prt(expr_dict, frmt='{:.4G}'):
        for symbol in expr_dict:
            expr = fmt(sympify(expr_dict[symbol]), frmt)
            print('$$'+ \
                  symbol.name + ' = ' + \
                  latex(expr, 
                        mul_symbol    ='dot',
                        imaginary_unit='rj') + \
                  '$$\n'
            )
    # apply format string to floats
    fmt = lambda expr, frmt: expr.xreplace(
        {n: Symbol(frmt.format(n)) for n in expr.atoms(Float)}
    )
#+END_SRC

Template und Anleitung

2025_02_08_org_sympy_template.png

Abbildung 2: Die Zip Datei enthält alle nötgen Ressourcen, um die ausführliche Anleitung zu reproduzieren oder als Basis für eigene Dokumente zu nutzen.

Flexibilität

Neben Python können auch andere Sprachen wie Octave interaktiv verwendet werden. Auch das Export Format muss nicht PDF sein.

Datum: 8. Februar 2025

Autor: Peter Vennemann

Email: mail@vennemann-online.de