Ich möchte eine mathematische Funktion in LaTeX in Abhängigkeit eines Argumentes auswerten. Nennen wir die Funktion \myMathFunction, dann soll

Open in writeLaTeX
\myMathFunction{2}

den Wert 6 zurückgeben, wenn die Funktion definiert ist als 5*x - x^2. Außerdem wäre es schön, wenn die Funktion in einem PSTricks Plot nutzbar wäre.

Open in writeLaTeX
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\begin{document}
\begin{pspicture}(0,0)(6.5,7)
    \psplot[
        algebraic,
        linecolor = red,
        linewidth = 1pt
    ]{0}{TwoPi}
    {\myMathFunction{x}}
\end{pspicture}
\end{document}

gefragt 10 Mär '14, 23:54

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 11 Mär '14, 15:32

cgnieder's gravatar image

cgnieder
22.1k243463

Die Frage ist zum Archivieren gedacht, kein Support benötigt. Antworten sind jedoch sehr willkommen! Ich antworte auf jeden Fall selbst.

(10 Mär '14, 23:54) Henri

l3fp

Das LaTeX3 Makropaket bietet umfangreiche Möglichkeiten für dieses Problem. Hier wurde der Teil l3fp verwendet, der automatisch von xparse geladen wird.

Open in writeLaTeX
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myMathFunction}{m}
    { \fp_to_decimal:n {((#1) * 5) - (#1)^2} }
\ExplSyntaxOff
\begin{document}
\myMathFunction{2}
\end{document}

pgfmath

Das PGF Paket besitzt ein Modul namens pgfmath, das nur dazu gedacht ist mathematische Ausdrücke zu verarbeiten. Außerdem funktioniert diese Lösung auch mit Plain TeX. Eine beispielhafte Benutzung zeigt sich hier

Open in writeLaTeX
\documentclass{article}
\usepackage{pgfmath}
\newcommand*\myMathFunction[1]{\pgfmathparse{5*#1-(#1)^2}\pgfmathresult}
\begin{document}
\myMathFunction{2}
\end{document}

siehe auch Original-Antwort auf TeX.SX von Jubobs.

fp

Ein weiteres Paket für diesen Zweck stellt fp dar. Im Gegensatz zu pgfmath ist fp sehr leichtgewichtig, hat dafür aber mit Rundungsfehlern und grauenhafter Syntax zu kämpfen.

Open in writeLaTeX
\documentclass{article}
\usepackage[nomessages]{fp}
\newcommand*\myMathFunction[1]{\FPeval\result{trunc(((#1)*5)-(#1)^2:0)}\result}
\begin{document}
\myMathFunction{2}
\end{document}

siehe auch Original-Antwort auf TeX.SX von Werner.

Integration in PSTricks

Im Prinzip eignet sich keine der obigen Lösungen für einen PSTricks Plot, da \psplot die funktionale Form erwarten und kein Makro. Jedoch lässt sich dies über ein \ifx sehr leicht mit allen anderen Lösungen verbinden.

Open in writeLaTeX
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\newcommand*\myMathFunction[1]{%
    \ifx x#1 (#1*5)-(#1)^2
    \else %other solution
    \fi}
\begin{document}
\begin{pspicture}(-1,-1)(6.5,7)
    \psaxes{->}(6.5,6)
    \psplot[
        algebraic,
        linecolor = red,
        linewidth = 1pt
    ]{0}{TwoPi}
    {\myMathFunction{x}}
\end{pspicture}
\end{document}

siehe auch Original-Antwort auf TeX.SX von Herbert.

alt text

Permanenter link

beantwortet 11 Mär '14, 00:12

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 14 Mär '14, 23:18

2

Vielen Dank für das Übertragen Deiner Lösung und das kommentierte Posten der weiteren Lösungen von TeX.SE! (Herbert, Werner, Jubobs) Ich habe da mal eine 300er bounty gesetzt, um meine Anerkennung zu zeigen, und schiebe dann noch 50er nach an Teillösungen. Evtl. postet Mico ja noch seinen LuaTeX-Weg als eine Antwort.

(11 Mär '14, 09:56) stefan ♦♦
2

+100 weil sehr gute Archiv-Frage! Jetzt probiere ich glatt mal Deinen Vorschlag l3fp, damit zu rechnen, scheint mir das natürlichste, wenn ich nicht grad mit pgf bzw. TikZ arbeite.

(11 Mär '14, 10:08) Student

LuaLaTeX

Hier ist eine Lösung die auf LuaLaTeX beruht. (Fürs Original dieser Antwort siehe diesen Beitrag in TeX.SE. Der code hat ein TeX-seitiges Makro names \myMathFunction und eine Lua-seitige Funktion names mymathmacro.

Die Eingabe braucht keine Konstante zu sein; sie könnte selber das Resultat einer Kalkulation. Umgekehrt kann das Resultat von \myMathFunction als Eingabe in eine andere Lua Funktion gebraucht werden (so etwa wenn gewisse Rundungsregeln eingehalten werden müssen).

alt text

Open in writeLaTeX
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\usepackage{luacode}    % für 'luacode' Umgebung und '\luaexec' Makro
\usepackage{luatexbase} % für '\luatexluaescapestring' Makro
% Lua-seitig
\begin{luacode}
   function mymathfunction( x )
      return 5*x - x^2  -- die gewünschte Funktion hier spezifieren
   end
\end{luacode}

% TeX-seitig
\newcommand\myMathFunction[1]{%
   \directlua{ tex.sprint( 
      mymathfunction( "\luatexluaescapestring{#1}" ))}}

\begin{document}
Der Wert von \texttt{\textbackslash myMathFunction\{2\}} ist 
\myMathFunction{ 2 }.

Der Wert von \texttt{\textbackslash myMathFunction\{exp(1)\}} ist 
\myMathFunction{\directlua{ tex.sprint(math.exp(1)) }}.

Der Wert von \texttt{\textbackslash myMathFunction\{$\pi$\}}, gerundet auf 4 Stellen, ist
\luaexec{ tex.sprint(string.format( "\%.4f", \myMathFunction{\directlua{ tex.sprint(math.pi) }}))}.
Permanenter link

beantwortet 11 Mär '14, 15:01

Mico's gravatar image

Mico
28513
Akzeptiert-Rate: 10%

bearbeitet 15 Mär '14, 17:38

Auf meinem System gibt es einen Alias auf lualatex --output-format=dvi namens dvilualatex. Das ist halt etwas kürzer zu tippen.

(14 Mär '14, 23:20) Henri
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×117
×22
×10
×9

gestellte Frage: 10 Mär '14, 23:54

Frage wurde gesehen: 12,245 Mal

zuletzt geändert: 15 Mär '14, 17:38