首页 > 解决方案 > 使用python等化系数

问题描述

考虑到这两个方程,这实际上是一项非常简单的手动任务,但是我想知道它是否可以在 python 中使系数相等(也许使用 numpy 或 sympy/scipy?)。所以我的方程看起来像这样:

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

现在理想情况下,应首先将第二个等式相乘以形成与上述相同的形状,然后应通过三个系数 a (=1.0066)、b(=1.8908) 和 c (0.888) 计算kB ,其中 r0 也是常数(基本上给我 3 个 kB 值)所以唯一的变量是 x 和 r ,但我对它们并不感兴趣

是否有可能执行这样的任务?请记住,我只是一个初学者

谢谢

标签: pythonnumpyscipycoefficients

解决方案


您可以使用SymPy将右侧表示为关于符号变量xrr0的表达式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

现在我们可以将yand转换为关于andU的多项式:xr

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有一个all_coeffs返回系数列表的方法:

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]]

推荐阅读