2015-08-02 1 views
1

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

var('a b c') 
b = a/(1 - a^2) 
c = 2*b/(1 + sqrt(1+4*b^2)) 
c 

Были 'а' ограничивается -1 < < 1, то не было бы особенность в 'B'.

ответ

2

Наличие сингулярности не является препятствием для символического упрощения. Мудрец просто упрощает рациональные функции (которые обычно имеют особенности).

Я подозреваю, что вы пробовали 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 нет.

+0

Большое спасибо. Я не знал о * canonicalize_radical() *. (И я вижу, что я отстал в цикле выпуска, у меня только теперь нет устаревших * radical_simplify() *.) –

+0

Я использую https://cloud.sagemath.com/, который остается актуальным без меня что-нибудь... –