.png)
Я хотел бы определить пользовательскую функцию f(x).
Например,
\f{3}
следует напечататьln(3) + 3
, если функция установлена наln(x) + 3
.Должна быть возможность изменить функцию:
\setfunc{sin(\x}}
.Это должно повлиять только на будущее использование
\f{...}
И должно быть возможно определить первые три производные.
Команды не должны быть такими. Может быть более элегантный/практичный способ. Предупреждение: это должно работать в этой среде: https://tex.stackexchange.com/a/299720/101053
Редактировать: Изменил производную на производную; Неясно, что должно означать "определить производную". Я пытался сказать, что я могу просто добавить другие функции (будь то производная или нет).
решение1
Если это работает в целом, то мне просто повезло. ОТРЕДАКТИРОВАНО для работы с производными.
EDITED Чтобы быть более верным математическому режиму. EDITED, чтобы разрешить разные имена функций с использованием необязательного аргумента (по умолчанию \f
). EDITED, чтобы использовать более естественный синтаксис \f(3)
вместо \f{3}
. EDITED, чтобы предоставить \listfunc
макрос. EDITED, чтобы работать с amsmath
.
Наконец, ОТРЕДАКТИРОВАНО, чтобы разрешить более общий синтаксис, который может включать штрихи, индексы и т. д. в самом имени функции.
\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}
ПРИМЕЧАНИЕ: Джоэл отметил, что метод может запутаться, если само значение оценки содержит термин в скобках, например, $\f ( \ln(a + 1.5) )$
. Обходной путь для этого — принять внутренний аргумент, например $\f({\ln(a + 1.5)})$
или $\listfunc y''({\ln(a + 1.5)})$
.
решение2
По моему мнению, это создает больше сложностей, чем решает, но вот идея:
\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}
Если вам нужна только функция, а не производные, то все гораздо проще:
\newcommand{\setfunc}[1]{\renewcommand\f[1]{#1}}
Полный пример:
\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}
Другая реализация, в которой вы можете задать любое имя по своему усмотрению (но будьте осторожны, чтобы не переопределить уже существующие команды)
\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}