2015-09-16 8 views
2

Я использую IPython (дистрибутив Anaconda) с символической математической библиотекой математики.Сбор выражения фракции в большей доле (sympy)

У меня есть следующее выражение:

 t⋅(h + l)  
─────────────────────── 
l⋅(h + l⋅sin(θ))⋅cos(θ) 

Я хотел бы изменить это, чтобы получить его с точки зрения (h/l) и (t/l):

(t/l)⋅((h/l)+1) 
───────────────────── 
((h/l)+sin(θ))⋅cos(θ) 

Это довольно легко сделать вручную; просто разделите обе стороны фракции на l и перестройте.

До сих пор мне не повезло с встроенными функциями sympy.

Я пробовал использовать expand, а затем collect(expr,h/l), но это не меняет выражения. Я подозреваю, что это не работает, потому что : no h/l Условия для его сбора в первую очередь.

Как получить симптом для этого?

код Python для первого выражения, чтобы сэкономить время: t*(h + l)/(l*(h + l*sin(theta))*cos(theta))

ответ

1

Основываясь на идее strubbly в:

In [2]: expr = t *(h +l)/(l *(h +l *sin (theta))*cos (theta)) 

In [3]: expr 
Out[3]: 
      t*(h + l)   
------------------------------- 
l*(h + l*sin(theta))*cos(theta) 

In [4]: repl1 = [x-h/l, y-t/l] 

In [7]: repl2 = solve(repl1, t, l) 

In [8]: repl2 
Out[8]: 
    h  h*y 
{l: -, t: ---} 
    x  x 
In [9]: simplify(expr.subs(repl2)).subs({x: h/l, y: t/l}) 
Out[9]: 
      /h \   
      t*|- + 1|   
      \l /   
----------------------------- 
    /h    \   
l*|- + sin(theta)|*cos(theta) 
    \l   / 

То есть, ввести две переменные х и у в замените h/l и t/l (В [4]), инвертируйте равенства для получения словаря замены (В [7]). Замените, упростите (чтобы избавиться от l), затем замените исходные значения на x и y. Одна переменная все еще упрощается.

Следует указать .subs (...) не оценивать выражение после подстановки. Я не знаю, поддерживается ли это в настоящее время.

+0

ОК, это, безусловно, работает, но я хочу убедиться, что понимаю, что происходит, прежде чем я полностью доверяю ему. Если я правильно понимаю, вы создаете подстановки 'x = h/l' и' y = t/l', (2) используйте 'solve', чтобы переупорядочить их так, что' t' или 'l' является предметом , (3) замените на 'expr' и используйте' simplify', чтобы отменить любые переменные '' '' '' '' 'и (4) заменить' x = h/l' и 'y = t/l'. Я попробую это на некоторых более сложных выражениях, с которыми я работаю, и если это сработает, я помечаю этот ответ как принятый. – byntje

+0

Кстати, я не знал, что 'solve' может взять целый список уравнений, и я не знал, что вы можете использовать словари с' subs'. Я все время использую вложенные списки! Взорвался разум! – byntje

+0

Да, вот что я имел в виду. Хотя я сделал битку вручную. (BTW это страшно). – strubbly

-1

Я действительно не знаю, если вы можете использует регулярное выражение, но если вы можете, вы можете использовать re.sub заменить все экземпляры h с (h/1). или если выражение является строкой, вы можете использовать str.replace, чтобы сделать то же самое.

+0

Это не просто случай замены строк; он также должен иметь математический смысл. Полагаю, я мог взломать его так, что я добавляю '/ l' к обеим сторонам фракции, но это не совсем то, что я ищу. Должен быть способ сделать это в sympy. – byntje

0

Поэтому я использовал x = h/l и y = t/l и заменил. Тогда упрощается. Это дало мне

 x*(y + 1)/((y + sin(theta))*cos(theta)) 

Что я думаю, это то, что вы хотите. Я не могу видеть, как упростить «по отношению к» h/l, но это работает ...

+0

Не могли бы вы рассказать о том, как вы выполнили замену? Из вашего ответа, похоже, вы заменили 'x = h/l' и' y = t/l' на второе выражение, но это не то, что я имел в виду.Я хочу * получить * второе выражение, и мы должны предположить, что я не знаю, как он выглядит. – byntje