我试图解决二次方程式并且使用Sympy的soler取得了巨大的成功,但我想解决a,b和c的变化值(在传统格式ax ** 2 + bx + c = 0)我已将其设置为numpy数组。
我没有广泛的编码背景......是否有一种简单的方法可以做到这一点?
供参考,这是我的(凌乱,凌乱,凌乱)代码。 A是一个数组,它是a,b和c中的一个因子。所有其他变量都在别处定义。
import numpy as np
from sympy import solve, symbols
s = symbols('s')
psi = np.linspace(0,89,18)
A = 2 * C * eta / (1 + np.tan(psi) * np.tan(psi))
a = (A * ((vPsr*vPsr) - 2 * (vLat * vEarLat + vLon * vEarLon) + (vEar * vEar))) + (dist * wavelength * wavelength)
b = -2 * A * (vPsr * vPsr) + 2 * A * (vLat * vEarLat + vLon * vEarLon) - (dist * wavelength * wavelength)
c = A * (vPsr * vPsr)
answers = solve(a * s**2 + b * s + c, s)
答案 0 :(得分:1)
一般quadratic equation,a*x**2 + b*x + c = 0
,有两个根(可能是复数值),可以通过表达式轻松获得:
discriminant = b**2 - 4*a*c
root1 = (-b + sqrt(discriminant))/2/a
root2 = (-b - sqrt(discriminant))/2/a
Numpy可以轻松地执行这3项计算,并且在您的3个系数数组a
b
上一次("矢量化代码") }和c
,它会比更快比将公式一直传递给sympy.solve
。
考虑到根的可能复杂性,你可以将复数单位的零次加到判别式上,以确保在取负数的根时,numpy不会返回nan
。
import numpy as np
# define your coefficient arrays a, b and c
discriminant = b**2 - 4*a*c + 0j # added 0 time the complex unit
root1 = (-b + np.sqrt(discriminant))/2/a
root2 = (-b - np.sqrt(discriminant))/2/a
那些数组root1
和root2
长度相等,每个项目都是由a
,{{b
中定义的相应元素中的系数定义的二次系统的解。 1}}和c
。