Вы можете использовать SymPy
для представления правых частей в виде выражений относительно символьных переменных x
, r
, r0
и kB
:
x, r, r0, kB = sym.symbols('x,r,r0,kB')
y = 1.0066*x**2-1.8908*x-0.888
U = 0.5*kB*(r-r0)**2
Теперь мы можем преобразовать y
и U
в полиномы относительно x
и r
:
In [39]: sym.poly(y, x)
Out[39]: Poly(1.0066*x**2 - 1.8908*x - 0.888, x, domain='RR')
In [40]: sym.poly(U, r)
Out[40]: Poly(0.5*kB*r**2 - 1.0*kB*r0*r + 0.5*kB*r0**2, r, domain='RR[r0,kB]')
sym.Poly
s имеют _ 13_, который возвращает список коэффициентов:
In [41]: sym.poly(y, x).all_coeffs()
Out[41]: [1.00660000000000, -1.89080000000000, -0.888000000000000]
In [42]: sym.poly(U, r).all_coeffs()
Out[42]: [0.5*kB, -1.0*kB*r0, 0.5*kB*r0**2]
Мы можем использовать zip
для объединения коэффициентов из двух списков:
In [43]: list(zip(sym.poly(y, x).all_coeffs(), sym.poly(U, r).all_coeffs()))
Out[43]:
[(1.00660000000000, 0.5*kB),
(-1.89080000000000, -1.0*kB*r0),
(-0.888000000000000, 0.5*kB*r0**2)]
а затем используйте sympy.Eq
, чтобы приравнять выражения, и используйте sympy.solve
для решения их за kB
. Конструкция Python, которую я использую здесь для создания списка, называется пониманием списка < / а>:
In [44]: [sym.solve(sym.Eq(a, b), [kB]) for a, b in zip(sym.poly(y, x).all_coeffs(), sym.poly(U, r).all_coeffs())]
Out[44]: [[2.01320000000000], [1.8908/r0], [-1.776/r0**2]]
Собираем все вместе:
import sympy as sym
x, r, r0, kB = sym.symbols('x,r,r0,kB')
y = 1.0066*x**2-1.8908*x-0.888
U = 0.5*kB*(r-r0)**2
result = [sym.solve(sym.Eq(a, b), [kB]) for a, b in
zip(sym.poly(U, r).all_coeffs(), sym.poly(y, x).all_coeffs())]
print(result)
отпечатки
[[2.01320000000000], [1.8908/r0], [-1.776/r0**2]]
person
unutbu
schedule
12.05.2018
kB
, найденные путем приравнивания коэффициентов, - равны[[2.01320000000000], [1.8908/r0], [-1.776/r0**2]]
? - person unutbu   schedule 12.05.2018