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

После попытки решить символическую математическую задачу я получил выражение, содержащее около 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 ....

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

Ответы [ 2 ]

6 голосов
/ 30 января 2012

Возможно, попытка устранения общего подвыражения (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]]
2 голосов
/ 30 января 2012

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

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

Тогда вы можете использовать

Simplify[longExpression]  
and 
FullSimplify[longExpression]

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

...