2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Алгоритмы упрощения сложных символьных выражений
Сообщение10.03.2022, 13:41 
Добрый день,

часто сталкиваюсь с проблемой - после какого-нибудь аналитического интегрирования или решения системы уравнений в качестве ответа Mathematica или Maple выдают крокодилов на пару сотен страниц, на котороых FullSimplify или падает, или дождаться не получается, хотя ждшь обычно пару суток.

Есть ли какие-то специальные команды в этих софтах, или системы по такому упрощению, или софтвер?

А может даже алгоритмы есть, чтобы можно было запрограммиорвать и попробовать самому поупрощать? У меня на столько назрела необходимость, что готов даже сам что-то запрограммировать или собрать из каких-то кубиков с таким низкоуровневым программиорванием.

Особенно важно, чтобы после упрощения суммарное число арифметических операций было бы минимально, то есть чтобы ответ можно было бы воткнуть в С/С++ код и радоваться тому, что оно быстро считается.

Спасибо!

 
 
 
 Re: Алгоритмы упрощения сложных символьных выражений
Сообщение10.03.2022, 14:26 
Любой такой софт имеет функции редукции выражений. (Например в Maxima есть ratsimp, radcan, trigrat и прочие.)
Конкретно, минимизация арифметических операций - вряд ли. Это обычно никому не нужно.
Обычно функций много - для разных типов редукции. Нужно самостоятельно выбирать - какие и в каком порядке применять. Завист от выражения и от целей.

 
 
 
 Re: Алгоритмы упрощения сложных символьных выражений
Сообщение10.03.2022, 14:59 
Аватара пользователя
В Mathematica порою для упрощения полезно использовать частные функции вместо Simplify/FullSimplify. См. функции, перечисленные в разделе See Also страницы документации по Simplify. Также нередки случаи, когда относительно упрощаемого выражения существуют некие предположения, которые человек считает очевидными, а СКА не догадывается (примеры: $a \in \mathbb{R}$, $a \in \mathbb{Z}$, $a > 0$). Для их указания в Mathematica есть функция Assuming и опция Assumptions.

-- 10.03.2022, 15:03 --

ilghiz в сообщении #1550134 писал(а):
чтобы ответ можно было бы воткнуть в С/С++ код и радоваться тому, что оно быстро считается
Mathematica и сама немножко умеет компилировать: почитайте здесь и здесь.

 
 
 
 Re: Алгоритмы упрощения сложных символьных выражений
Сообщение10.03.2022, 18:03 
Ну, выражение само по себе может не упрощаться. А если и вохможно упростить 10 страниц до 2 страниц, то не стоит ожидать от математики, что она такое найдет в общем случае найдет. Разве что там просто дроби без корней и пр.

Для минимизации числа операций в Compile математика использует функцию Experimental`OptimizeExpression. Например, для выражения $x^2+\sin x^2+\cos \sin x^2$

Experimental`OptimizeExpression[x^2 + Sin[x^2] + Cos[Sin[x^2]]]

выдает

Код:
Experimental`OptimizedExpression[
Block[{Compile`$1, Compile`$2}, Compile`$1 = x^2;
  Compile`$2 = Sin[Compile`$1];
  Compile`$1 + Cos[Compile`$2] + Compile`$2]]

Видно, что здесь $x^2$ и $\sin x^2$ вычисляются по одному разу.

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group