Я начинаю с выражения x*(A*x*x + B*x + C*x)
, а после замены x -> r + sqrt(s)
я хочу собрать термины, чтобы они имели вид a + sqrt(s)*b
, где a
не имеет sqrt(s)
терминов.Затем я хочу извлечь выражения a
и b
.
. Явно хочу, чтобы sympy
уменьшил s**(3/2)
до s*sqrt(s)
, чтобы он стал частью выражения b
.
Я пробовал что-то в этом роде.Я могу извлечь коэффициент sqrt(s)
, но он не включает термин s**3/2
:
In [1]: import sympy as sp
In [2]: r, A, B, C, a, b, c, x = sp.symbols("r A B C a b c x")
In [3]: s = sp.Symbol("s", positive=True)
In [4]: f1 = x*(A*x*x + B*x + C)
In [5]: f2 = f1.subs(x, r + sp.sqrt(s)).expand()
In [6]: f2
Out[6]: A*r**3 + 3*A*r**2*sqrt(s) + 3*A*r*s + A*s**(3/2) + B*r**2 + 2*B*r*sqrt(s) + B*s + C*r + C*sqrt(s)
In [7]: f2.coeff(sp.sqrt(s))
Out[7]: 3*A*r**2 + 2*B*r + C
Обновление: я обнаружил, что могу получить нужный ответ, рассматривая выражение как многочлен вдругую переменную Z
и затем делать замены Z*Z -> s
и Z*Z*Z -> Z*s
, например:
r, s, A, B, C, a, b, c = sp.symbols("r s A B C a b c")
Z = sp.symbols("Z")
f1 = x*(A*x*x + B*x + C)
f2 = f1.subs(x, r+Z).expand().subs(Z**3, Z*s).subs(Z**2, s)
Тогда f2.coeff(Z)
вернет то, что я хочу.Я думаю, что мне еще хотелось бы знать, как я могу объединить две замены Z*Z*Z -> Z*s
и Z*Z -> s
в одну?Например, это было бы удобно, если бы многочлен имел более высокую степень, и мне нужно было уменьшить более высокие степени на Z
.