Упрощение очень длинного символьного выражения путем автоматического введения временных переменных или любым другим способом

После попытки решить символьную математическую задачу я получил выражение длиной около 17000 символов. Я использую символический набор инструментов для Matlab, но я открыт для любых предложений (Mathematica, что угодно).

По понятным причинам я не буду копировать выражение прямо в вопрос. Вместо этого ссылка.

Выполнение Matlab команд simplify и simple и даже попытки collect ситуацию не улучшили (у некоторых стало только хуже).

Но мне интересно, мне все равно, оценивается ли выражение пошагово с временными параметрами. Что-то типа:

 z1 = a^2*y1;
 %Now the expression can be simplified by using z1 as alias!
 z1+z1^2 ....

Есть ли автоматический метод для получения такого пошагового упрощения с временными переменными? Кроме того, любой другой метод, который вы можете придумать, правдоподобен.


person Andrey Rubshtein    schedule 29.01.2012    source источник
comment
@Мистер. Волшебник согласен. Чуть не купил тебе, пока не посмотрел на ценник (все завышают...)   -  person Daniel Lichtblau    schedule 30.01.2012
comment
@ Даниэль Я еще не решил, должен ли я поблагодарить вас или выдвинуть обвинения. О_о   -  person Mr.Wizard    schedule 30.01.2012
comment
Я не могу сравнивать напрямую с Matlab (у меня нет этой программы), но кажется, что Simplify и FullSimplify в Mathematica более эффективны, чем аналогичные команды в Matlab. После Simplify ваше выражение имеет 2192, а после FullSimplify — всего 1535 символов. Возможно, этого упрощения для вас достаточно или это будет хорошей новой отправной точкой для дальнейших попыток упрощения.   -  person partial81    schedule 30.01.2012
comment
Спасибо за ответ! Один из основных моментов вашего вопроса касается упрощения с помощью временных переменных. Я полностью проигнорировал это в своем ответе. Так что, на мой взгляд, мой комментарий остается просто комментарием, а не ответом. Но, возможно, вы сможете переубедить меня какими-то аргументами ;-) Может быть, ваше выражение после упрощения Mathematica достаточно простое, тогда мой комментарий будет действительно (случайным) ответом.   -  person partial81    schedule 30.01.2012


Ответы (2)


Можно попробовать устранение общих подвыражений (CSE). Вот пример, взятый из

Получить mathematica для упрощения выражения с помощью другого уравнения

InputForm[Experimental`OptimizeExpression[(3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] +
      a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6]]

==>

Out[206]//InputForm=
Experimental`OptimizedExpression[Block[{Compile`$1, Compile`$3, Compile`$4, 
   Compile`$5, Compile`$6}, Compile`$1 = a^2; Compile`$3 = 6*a; 
   Compile`$4 = 5*Compile`$1; Compile`$5 = 5 + Compile`$3 + Compile`$4; 
   Compile`$6 = Sqrt[Compile`$5]; (3 + 3*Compile`$1 + Compile`$6 + 
     a*(4 + Compile`$6))/6]]
person Daniel Lichtblau    schedule 30.01.2012
comment
Есть ли способ установить эти переменные Compile** как простые переменные, такие как c1, c3, c4, c5 и т. д.? - person Boogeyman; 08.08.2020

Как я писал в своем комментарии, кажется, что инструменты упрощения Mathematica более эффективны, чем аналогичные команды в Matlab. Поскольку кажется, что вы являетесь пользователем Matlab, я даю вам здесь подробную инструкцию, как использовать только две команды упрощения Mathematica. Если вы определите свое длинное выражение как

longExpression = (x3^2*(y2+y3-a*y1-a*y2-2*a*y3-...

Затем вы можете использовать

Simplify[longExpression]  
and 
FullSimplify[longExpression]

Последнее дает красивое и ясное выражение, в котором всего 1535 символов (звучит много, но переменных не так много). Возможно, этого упрощения достаточно для вашей проблемы. Если нет, то дайте нам знать.

person partial81    schedule 30.01.2012
comment
Не могли бы вы предложить мне, есть ли какие-либо эквивалентные функции в Maple. - person Rohithsai Sai; 17.09.2018