LaTex — выполнение алгебраических операций над переменными

LaTex — выполнение алгебраических операций над переменными

Предположим, у меня есть следующий документ:

\documentclass{article}

\newcommand\mass{30}
\newcommand\acc{9.8}

\newcommand\force{\the\numexpr \mass * \acc \relax} % F=m*a

\begin{document}
  \section{Exerted force}
    F = \force N
\end{document}

Он создает три «переменные»: mass, accи force, которая является произведением первых двух.

В этом конкретном примере ( mass = 30, acc = 9.8) печатается F = 270.8N, как и задумано.

Умножение выполняется командой \numexpr. Это работает всякий раз, когда massи accявляются обычными числами. Если massили accявляется переменной (т.е. \newcommand\mass{m}), документ не может быть построен, так как \numexprможет выполнять операции только с числами.

Есть ли способ выполнять алгебраические операции над переменными, так что когда mass = 30gи acc = g, он выведет F = 30g^2? Я знаю, что это не имеет физического смысла, но я думаю, что суть ясна.

Еще несколько примеров:

  • mass = m, acc = 9.8-> F = m*9.8илиF = 9.8*m
  • mass = m, acc = g-> F = m*gилиF = g*m
  • mass = x, acc = x->F = x^2

EDIT: Как любезно указал @PhelypeOleinik,\numexpr работает только нацелые числа. Таким образом, хотя 9,8 * 30 = 294, в результате получается 270,8, поскольку 30 * 9 = 270 и добавляется 0,8.

решение1

Вот код, использующий sagetexзапрошенный вами пакет:

\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
m = 30.0
a = 9.8
Force = m*a
var('g')
mass = 30*g
\end{sagesilent}
\section{Exerted force}
    F = $\sage{Force.n(digits=5)}$ N \\\\
If the mass is $\sage{mass}$ then it's square is $\sage{mass^2}$.
\begin{sagesilent}
var('m')
acc = 9.8
\end{sagesilent}

$F = \sage{m*acc.n(digits=2)}$\\
\begin{sagesilent}
var('a')
m=a
\end{sagesilent}
If the mass, $m$, is equal to the acceleration, $a$ then 
$F = \sage{m*a}$.

Sage even works with square roots:
\begin{sagesilent}
var('g')
m=sqrt(3)
\end{sagesilent}
$F = \sage{m*g}$ which, if you want decimals, is about     $F=\sage{m.n(digits=4)*g}$
\end{document}

Вывод, запущенный в Cocalc (упомянутом в моем комментарии выше), выглядит так: введите описание изображения здесь

В Sage x по умолчанию является переменной. Все остальные переменные должны быть определены так, как это сделано в коде, например var('g'). Среда sagesilentпохожа на черновик. Она состоит из команд Python и Sage, которые будут выполнять вычисления. Используйте формат, \sage{}чтобы получить результат. Поскольку это число, это делается в математическом режиме (между знаками доллара). Sage будет стремиться выдавать много цифр. Это .n(digits=5)заставит ответ состоять из 5 значащих цифр.

решение2

Вы можете использовать pythontexпакет для встраивания Python в документ LaTeX, а затем использовать sympyпакет Python для символьных вычислений, например:

\documentclass{article}

\usepackage{pythontex}

\begin{pycode}
from sympy import *

m = sqrt(3)
a = symbols('g')
f = m * a
\end{pycode}

\begin{document}
  \section{Exerted force}
    F = $\pyc{print(latex(f))}$
\end{document}

Для этого требуется, чтобы у вас были установлены LaTeX, python3, pythontexпакет для LaTeX и sympyпакет для python. Также не помешает некоторое знание python.

Краткое объяснение кода:

\usepackage{pythontex}импортирует требуемый пакет.

\begin{pycode}начинает блок кода Python.

Давайте рассмотрим следующий блок кода Python:

from sympy import *

m = sqrt(3)
a = symbols('g')
f = m * a

Это импортирует sympyбиблиотеку, устанавливает mравным квадратному корню из 3 и aпеременной g. Затем он умножает mи aи сохраняет результат в f. Обратите внимание, что sqrt()функция, используемая для извлечения квадратного корня из 3, является функцией из библиотеки sympy, а не из математической библиотеки. Это означает, mчтоточноравно sqrt(3)и не является приближением.

$\pyc{latex(f)}$затем печатает все, что latex(f)возвращается. Значение f теперь равно sqrt(3) * g. При передаче его через latex()функцию оно печатается с использованием нотации LaTeX, поэтому знаки доллара необходимы для входа в математический режим.

Это можно сделать, сначала вызвав latex, затем pythontexи latexеще раз.

В конечном итоге документ будет выглядеть так:

Результат

Некоторые ресурсы по теме sympyи pythontex:

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