.png)
Ich möchte eine benutzerdefinierte Funktion f(x) definieren.
Beispielsweise
\f{3}
sollte gedruckt werdenln(3) + 3
, wenn die Funktion auf eingestellt istln(x) + 3
.Man sollte die Funktion ändern können:
\setfunc{sin(\x}}
.Dies sollte nur zukünftige Verwendungen von
\f{...}
Und es sollte möglich sein, die ersten drei Ableitungen zu definieren.
Die Befehle müssen nicht so sein. Es gibt vielleicht einen eleganteren/praktischeren Weg. Achtung: In dieser Umgebung sollte es funktionieren: https://tex.stackexchange.com/a/299720/101053
Bearbeiten: Derivat in Derivat geändert; Es ist unklar, was „die Ableitung definieren“ bedeuten soll. Ich wollte sagen, dass ich einfach andere Funktionen hinzufügen kann (egal ob Ableitung oder nicht).
Antwort1
Wenn das grundsätzlich funktioniert, hatte ich einfach Glück. BEARBEITET, um Ableitungen zu machen.
BEARBEITET, um dem Mathematikmodus näher zu kommen. BEARBEITET, um verschiedene Funktionsnamen mit Verwendung optionaler Argumente zuzulassen (Standard \f
). BEARBEITET, um eine natürlichere Syntax \f(3)
anstelle von zu verwenden. BEARBEITET, um Makros \f{3}
bereitzustellen . BEARBEITET, um mit zu arbeiten .\listfunc
amsmath
Schließlich BEARBEITET, um eine allgemeinere Syntax zu ermöglichen, die Primzahlen, Indizes usw. im Funktionsnamen selbst enthalten kann.
\documentclass{article}
\usepackage{amsmath}% BREAKS ORIGINAL CODE; REQUIRES \protected@edef IN \setfunc
\makeatletter
\newcommand\setfunc[2][f]{\expandafter\protected@edef\csname#1\endcsname(##1){#2}}
\makeatother
\def\func#1(#2){\csname#1\endcsname(#2)}
\def\listfunc#1(#2){#1(#2)=\func#1(#2)}
\newcommand\x{(##1)}
\begin{document}
\setfunc{\sin\x} I can list the function: $\listfunc f(3)$\par
or I can just print out $\f(x+y)$.\par
or with a general input syntax: $\func f(x+y)$\par
\setfunc[g'_y]{\ln\x + 3\x^2} Now we can have $\listfunc g'_y(7)$\par
\medskip
Derivatives:\par
\setfunc[y]{4\x^5 - 2\x^2 +3}
\setfunc[y']{20\x^4 - 4\x}
\setfunc[y'']{80\x^3 - 4}
\setfunc[y''']{240\x^2}
\setfunc[y^{iv}]{480\x}
$\listfunc y(2)$\par
$\listfunc y'(2)$\par
$\listfunc y''(2)$\par
$\listfunc y'''(2)$\par
$\listfunc y^{iv}(2)$\par
\end{document}
HINWEIS: Joel hat darauf hingewiesen, dass die Methode verwirrend sein kann, wenn der Auswertungswert selbst einen Term in Klammern enthält, z. B. $\f ( \ln(a + 1.5) )$
. Die Problemumgehung hierfür besteht darin, das innere Argument einzubeziehen, z. B. $\f({\ln(a + 1.5)})$
oder $\listfunc y''({\ln(a + 1.5)})$
.
Antwort2
Meiner Meinung nach führt dies eher zu Komplikationen als dass es Probleme löst, aber hier ist eine Idee:
\documentclass{article}
\makeatletter
\newcommand{\setfunc}[4]{%
\@namedef{f@}##1{#1}%
\@namedef{f@'}##1{#2}%
\@namedef{f@''}##1{#3}%
\@namedef{f@'''}##1{#4}%
}
\def\f#1#{\@nameuse{f@#1}}
\makeatother
\begin{document}
\setfunc{\sin(#1)}{\cos(#1)}{-\sin(#1)}{-\cos(#1)}
$\f{x}$ $\f'{1}$ $\f''{\pi}$ $\f'''{\pi/2}$
\setfunc{\log(#1)+1}{}{}{}
$\f{3}$
\end{document}
Wenn Sie nur die Funktion und nicht die Ableitungen möchten, ist es viel einfacher:
\newcommand{\setfunc}[1]{\renewcommand\f[1]{#1}}
Vollständiges Beispiel:
\documentclass{article}
\newcommand{\f}[1]{} % initialize
\newcommand{\setfunc}[1]{\renewcommand{\f}[1]{#1}}
\begin{document}
\setfunc{\sin(#1)}
$\f{x}+\f{3}$
\setfunc{\log(#1)+1}
$\f{3}$
\end{document}
Eine andere Implementierung, bei der Sie jeden beliebigen Namen festlegen können (achten Sie jedoch darauf, bereits vorhandene Befehle nicht neu zu definieren).
\documentclass{article}
\newcommand{\setfunc}[2][\f]{\def#1##1{#2}}
\begin{document}
\setfunc{\sin(#1)}
$\f{x}+\f{3}$
\setfunc[\g]{\log(#1)+1}
$\g{3}$
\end{document}