.png)
Me gustaría definir una función personalizada f(x).
Por ejemplo,
\f{3}
debería imprimirseln(3) + 3
si la función está configurada enln(x) + 3
.Uno debería poder cambiar la función:
\setfunc{sin(\x}}
.Esto sólo debería afectar los usos futuros de
\f{...}
Y debería ser posible definir las tres primeras derivadas.
Los comandos no tienen que ser de esta manera. Puede haber una forma más elegante/práctica. Advertencia: debería funcionar en este entorno: https://tex.stackexchange.com/a/299720/101053
Editar: Se cambió derivado a derivado; No está claro qué debería significar "definir la derivada". Intenté decir que simplemente puedo agregar otras funciones (ya sean derivadas o no).
Respuesta1
Si esto funciona en general, simplemente tuve suerte. EDITADO para hacer derivados.
EDITADO Para ser más fiel al modo matemático. EDITADO para permitir diferentes nombres de funciones con el uso de un argumento opcional (predeterminado \f
). EDITADO para utilizar una sintaxis más natural \f(3)
en lugar de \f{3}
. EDITADO para proporcionar \listfunc
macro. EDITADO para trabajar con amsmath
.
Finalmente, EDITADO para permitir una sintaxis más general que puede incluir números primos, subíndices, etc. en el nombre de la función.
\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}
NOTA: Joel señaló que el método puede resultar confuso si el valor de evaluación en sí contiene un término entre paréntesis, por ejemplo $\f ( \ln(a + 1.5) )$
. La solución para esto es adoptar el argumento interno, como $\f({\ln(a + 1.5)})$
o $\listfunc y''({\ln(a + 1.5)})$
.
Respuesta2
En mi opinión, esto plantea más complicaciones de las que resuelve, pero aquí tienes una idea:
\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}
Si sólo quieres la función y no las derivadas, es mucho más sencillo:
\newcommand{\setfunc}[1]{\renewcommand\f[1]{#1}}
Ejemplo completo:
\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}
Una implementación diferente, donde puedes establecer el nombre que quieras (pero ten cuidado de no redefinir comandos ya existentes)
\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}