Приравнивание коэффициентов с помощью Python

На самом деле это довольно простая задача, которую можно выполнить вручную, учитывая два уравнения, но, тем не менее, я хотел знать, можно ли приравнять коэффициенты в python (возможно, используя numpy или sympy / scipy?). Итак, уравнения, которые у меня есть, выглядят примерно так:

y = 1.0066*x**2-1.8908*x-0.888
U = 0.5kB*(r-r0)**2

Теперь в идеале второе уравнение должно быть сначала умножено, чтобы принять форму, подобную приведенной выше, а затем необходимо вычислить kB с помощью трех коэффициентов a (= 1,0066), b (= 1,8908) и c (0,888). причем r0 также является константой (в основном дает мне 3 значения для kB) Таким образом, единственными переменными являются x и r, но меня они действительно не интересуют

Возможно ли выполнить такую ​​задачу? Помните, что я только новичок

Спасибо


person TheChemist    schedule 12.05.2018    source источник
comment
Какие 3 значения для kB вы ищете?   -  person unutbu    schedule 12.05.2018
comment
@unutbu для этого конкретного случая? Это были бы просто числа в диапазоне 2,0хх или вы имели в виду что-то другое?   -  person TheChemist    schedule 12.05.2018
comment
Я не уверен, что понимаю описанный вами расчет. Для приведенного вами примера ответ, который вы ищете - значения kB, найденные путем приравнивания коэффициентов, - равны [[2.01320000000000], [1.8908/r0], [-1.776/r0**2]]?   -  person unutbu    schedule 12.05.2018
comment
@unutbu да именно так! Я забыл указать значения r0, но это просто константа. Как ты это сделал?   -  person TheChemist    schedule 12.05.2018


Ответы (1)


Вы можете использовать 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.Polys имеют _ 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
comment
классно! это работает как шарм, и я обязательно буду использовать его в будущем для более сложных вещей - person TheChemist; 13.05.2018