Полезная функция для упрощения выражений в символьных вычислениях

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

В Mathematica есть бесконечно полезная функция Simplify[]. Однако, она не обладает всей тонкостью ума заядлого математика или физика-теоретика, чтобы справляться с выражениями вида «спагетти» из переменных.

Иногда требуется вытаскивать некоторые степени определенной комбинации переменных, чтобы сделать выражение более читаемым. Функция Collect[] может только собирать урожай, а непосредственно уродить его может doThat[].

doThat[expr_, vars_List] := 
 Expand[Simplify[
    expr /. Flatten[
      Solve[# == ToString@#, First@Variables@#] & /@ vars]], 
   Alternatives @@ ToString /@ vars] /. 
  Thread[ToString /@ vars -> vars]

Я обнаружил ее на StackOverflow, оно может эффективно выделять заданные подвыражения из спагетти-формул.

Пример использования

Упрощаем жуткое выражение в три хода
In[]:=
1
59136
2
b
2
(a+2b)
πr
d1801
2
a
+3602ab+1801
2
b
3586
2
a
β14344abβ14344
2
b
β+1155
2
(a+b)
6
n
1
1155
2
(a+b)
6
n
2
13183
2
a
2
n
3
41150ab
2
n
3
35359
2
b
2
n
3
+10516
2
a
β
2
n
3
+42064abβ
2
n
3
+42064
2
b
β
2
n
3
+1911
2
a
4
n
3
+3822ab
4
n
3
+1911
2
b
4
n
3
+4158
2
a
β
4
n
3
+16632abβ
4
n
3
+16632
2
b
β
4
n
3
3465
2
a
6
n
3
6930ab
6
n
3
3465
2
b
6
n
3
+21
4
n
2
2
a
(25+66β)+2ab(25+132β)+
2
b
(25+264β)55
2
(a+b)
2
n
3
+21
4
n
1
25
2
a
50ab25
2
b
+66
2
a
β+264abβ+264
2
b
β165
2
(a+b)
2
n
2
55
2
(a+b)
2
n
3
+11
2
n
2
2
a
(1187+1208β)+2ab(1859+2416β)+
2
b
(3203+4832β)+126(
2
a
(1+4β)+2ab(1+8β)+
2
b
(1+16β))
2
n
3
315
2
(a+b)
4
n
3
+
2
n
1
3465
2
(a+b)
4
n
2
42
2
n
2
2
a
(85+198β)+2ab(85+396β)+
2
b
(85+792β)55
2
(a+b)
2
n
3
11
2
b
(221800β)+ab(442800β)+
2
a
(221200β)+126(
2
a
(1+4β)+2ab(1+8β)+
2
b
(1+16β))
2
n
3
315
2
(a+b)
4
n
3
;doThat%,
2
(a+b)
2
(a+2b)
/.
2
(a+b)
2
(a+2b)
2
β
//FullSimplifydoThat[%,
2
n
1
+
2
n
2
+
2
n
3
]/.
2
n
1
+
2
n
2
+
2
n
3
1Collect[%,{β}]
Out[]=
1
59136
2
b
πr
d(35861801β)β1155
2
β
6
n
1
+1155
2
β
6
n
2
+21β
4
n
2
66+25β+55β
2
n
3
+21β
4
n
1
66+25β+55β3
2
n
2
+
2
n
3
+11
2
n
2
672+β(1208+515β)+63β
2
n
3
8+2β+5β
2
n
3
β
2
n
1
22002431β+3465β
4
n
2
+693
2
n
3
8+2β+5β
2
n
3
+42
2
n
2
198+85β+55β
2
n
3
+
2
n
3
7392+β(10516+5791β)+21β
2
n
3
19891β+165β
2
n
3
Out[]=
d
2
n
2
8
2
b
πr
+
3d
2
β
2
n
2
32
2
b
πr
3dβ
4
n
2
16
2
b
πr
5d
2
β
4
n
2
32
2
b
πr
+
5d
2
β
6
n
2
32
2
b
πr
+
d
2
n
3
8
2
b
πr
+
3d
2
β
2
n
3
32
2
b
πr
3dβ
2
n
2
2
n
3
8
2
b
πr
3d
2
β
2
n
2
2
n
3
16
2
b
πr
+
5d
2
β
4
n
2
2
n
3
16
2
b
πr
3dβ
4
n
3
16
2
b
πr
5d
2
β
4
n
3
32
2
b
πr
+
5d
2
β
2
n
2
4
n
3
16
2
b
πr
+
5d
2
β
6
n
3
32
2
b
πr
Out[]=
d
2
n
2
8
2
b
πr
+
d
2
n
3
8
2
b
πr
+β
3d
4
n
2
16
2
b
πr
3d
2
n
2
2
n
3
8
2
b
πr
3d
4
n
3
16
2
b
πr
+
2
β
3d
2
n
2
32
2
b
πr
5d
4
n
2
32
2
b
πr
+
5d
6
n
2
32
2
b
πr
+
3d
2
n
3
32
2
b
πr
3d
2
n
2
2
n
3
16
2
b
πr
+
5d
4
n
2
2
n
3
16
2
b
πr
5d
4
n
3
32
2
b
πr
+
5d
2
n
2
4
n
3
16
2
b
πr
+
5d
6
n
3
32
2
b
πr

Также замечу, что полезно будет добавлять часто используемые функции в контекстное меню, следуя этому уроку.

0
0

About Кирилл Васин

Прохожий из шапки сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *