Собственная математическая функция f(x)

Собственная математическая функция f(x)
  • Я хотел бы определить пользовательскую функцию 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}

Связанный контент