.png)
Gostaria de definir uma função personalizada f(x).
Por exemplo,
\f{3}
deve imprimirln(3) + 3
se a função estiver definida comoln(x) + 3
.Deve-se ser capaz de alterar a função:
\setfunc{sin(\x}}
.Isto só deverá afectar futuras utilizações de
\f{...}
E deveria ser possível definir as três primeiras derivadas.
Os comandos não precisam ser assim. Pode haver uma maneira mais elegante/prática. Aviso: Deve funcionar neste ambiente: https://tex.stackexchange.com/a/299720/101053
Editar: Derivada alterada para derivada; Não está claro o que “definir a derivada” deveria significar. Tentei dizer que posso simplesmente adicionar outras funções (sejam derivadas ou não).
Responder1
Se isso funcionar de maneira geral, tive sorte. EDITADO para fazer derivadas.
EDITADO Para ser mais fiel ao modo matemático. EDITADO para permitir nomes de funções diferentes com uso de argumento opcional (padrão \f
). EDITADO para usar sintaxe mais natural \f(3)
em vez de \f{3}
. EDITADO para fornecer \listfunc
macro. EDITADO para trabalhar com amsmath
.
Finalmente, EDITADO para permitir uma sintaxe mais geral que pode incluir números primos, subscritos etc. no próprio nome da função.
\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 observou que o método pode ficar confuso se o próprio valor de avaliação contiver um termo entre parênteses, por exemplo, $\f ( \ln(a + 1.5) )$
. A solução alternativa para isso é adotar o argumento interno, como $\f({\ln(a + 1.5)})$
ou $\listfunc y''({\ln(a + 1.5)})$
.
Responder2
Isso levanta mais complicações do que resolve, na minha opinião, mas aqui vai uma ideia:
\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}
Se você quer apenas a função e não as derivadas, é muito mais simples:
\newcommand{\setfunc}[1]{\renewcommand\f[1]{#1}}
Exemplo 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}
Uma implementação diferente, onde você pode definir qualquer nome que desejar (mas cuidado para não redefinir comandos já 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}