Наличие сингулярности не является препятствием для символического упрощения. Мудрец просто упрощает рациональные функции (которые обычно имеют особенности).
Я подозреваю, что вы пробовали c.simplify()
и были разочарованы результатом. Как documentation says, это не команда, которую вы хотите. c.simplify_full()
является более универсальным упрощение рутина:
c.simplify_full()
-2*a/(a^2 + (a^2 - 1)*sqrt((a^4 + 2*a^2 + 1)/(a^4 - 2*a^2 + 1)) - 1)
Но чтобы получить больше сделать, вы должны быть конкретными в том, что вы хотите быть упрощена. Вот это радикальное выражение, поэтому давайте попробуем
c.canonicalize_radical()
-1/a
Ну ... это правильный результат при больших значениях а, что предполагаемое поведение, согласно documentation. Если вы хотите, чтобы Sage выбрал правильную ветвь, когда она мала, пусть a = 1/x. Тогда Sage возьмет ветвь для больших x, следовательно, малую a.
var('a b c x')
a = 1/x
b = a/(1 - a^2)
c = 2*b/(1 + sqrt(1+4*b^2))
c.canonicalize_radical()
Выход: 1/x, что является a.
Чтобы получить ответ на ваш вопрос об ограничении: assume(a>-1, a<1)
делает это в некоторой степени. Однако не все команды используют информацию от assume
; в частности canonicalize_radical
нет.
Большое спасибо. Я не знал о * canonicalize_radical() *. (И я вижу, что я отстал в цикле выпуска, у меня только теперь нет устаревших * radical_simplify() *.) –
Я использую https://cloud.sagemath.com/, который остается актуальным без меня что-нибудь... –