是否有类似于Sympy的解决方案的函数将采用数组?

时间:2014-07-21 21:21:49

标签: python arrays numpy sympy solver

我试图解决二次方程式并且使用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)

1 个答案:

答案 0 :(得分:1)

一般quadratic equationa*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

那些数组root1root2长度相等,每个项目都是由a,{{b中定义的相应元素中的系数定义的二次系统的解。 1}}和c