Фон
Работая в Maxima, я получил два выражения, которые, как я знал, были эквивалентны, но Maxima так не думал.
(Это началось с вопроса о точности с плавающей запятой в Maxima, но я застрял на чем-то немного более фундаментальном: как сделать так, чтобы выражения были "нормализованы", если это вообще возможно.)
Проблемное занятие
При решении уравнения с использованием solve()
я получил ответ (a
), включающий рациональные числа и рациональные показатели. У меня также было «справочное решение» (b
) в другой форме. Из проверки не очевидно, что эти цифры идентичны:
(%i1) a:(311647*2181529^(1/5))/(63360*17424^(1/5))$
(%i2) b:(7^(7/5)*211^(12/5))/(40*11^(7/5)*12^(12/5))$
Я хотел посмотреть, были ли они, поэтому я попробовал несколько вещей:
(%i3) a=b,pred;
(%o3) false
(%i4) a-b,numer;
(%o4) 1.4210854715202E-14
(%i5) ratsimp(a-b);
2/5 2/5 1/5 7/5 12/5 1/5
311647 11 12 2181529 - 7 211 17424
(%o5) -----------------------------------------------------
7/5 12/5 1/5
40 11 12 17424
Ух ты, это полный рот! Очевидно, я сделал что-то не так, но я не сдамся. Я пробую разные вещи, пока не найду:
(%i6) radcan(a-b);
(%o6) 0
(%i7) radcan(a)=radcan(b),pred;
(%o7) true
Бинго! radcan()
удалось преобразовать его в каноническую форму, которую затем можно было бы упростить.
Вопрос
radcan()
было необходимо в этом случае, потому что выражение включало радикалы, но сначала я этого не знал - при разработке чего-то вы не всегда знаете, в какой форме решение. Существует ли стандартный набор функций, которые можно применить, чтобы «канонизировать» универсальное выражение в Maxima, или я злоупотребляю здесь Maxima?