如何制作使分子最高次系数为1的对称排列公式



我正在用sympy和python来解一些方程。我试着安排一个方程使系数以最高次数表示为+1。例如,下面的代码产生输出

Km, Kb, L, s, R, J, b = sym.symbols("Km, Kb, L, s, R, J, b")
G1 = Km / (L * s + R)
G2 = 1 / (J * s + b)
Msys = (G1 * G2) / (1 + G1 * G2 * Kb)
Msys = sym.expand(Msys)
Msys = sym.simplify(Msys)
Msys = sym.collect(Msys, s)
print(Msys)
#outputs Km/(J*L*s**2 + Kb*Km + R*b + s*(J*R + L*b))

我需要去掉s**2前面的系数(即设置为1)。这通常是通过上下同时除以J*L来完成的。我发现了一个名为monic的sympi函数,它应该可以做到这一点,但它只适用于分子。

这个问题的最佳解决方案是什么?

Thanks is advance

这不是一个理想的解决方案,因为它以我需要的形式获得公式。基本上,我把公式分成上下两部分,然后在最高次变量前面乘以1/(J * L)系数。

Km, Kb, L, R, J, b, Gc, Ain, Amp, Hoi, s = sym.symbols("Km, Kb, L, R, J, b, Gc, Ain, Amp, Hoi, s")
G1 = 1/ (L * s + R)
print(G1)
G2 = 1 / (J * s + b)
print(G2)
Msys = (Km * G1 * G2) / (1 + Km * G1 * G2 * Kb)
Msys = sym.expand(Msys)
Msys = sym.simplify(Msys)
Msys = sym.collect(Msys, s)
g3 = Msys * ((1/(J*L))/(1/(J*L)))
print(g3)
top, bot = Msys.as_numer_denom()
top = top * (1/(J*L))
print(top)
bot = bot * (1/(J*L))
bot = sym.expand(bot)
bot = sym.collect(bot, s)
print(bot)
Msys = top * 1/bot

虽然这个解决方案有效,但它并不理想,因为它的复杂性。我可能会进一步开发它,使它成为一个可以重用的函数,但必须有一个更简单的方法

最新更新