我目前正在使用solve()解决以下问题(高斯尾近似):
x, y = symbols('x y')
l_bound = np.mean(self.data[j]) - 3 * np.std(self.data[j]) # e.g. 4
u_bound = np.mean(self.data[j]) + 3 * np.std(self.data[j]) # e.g. 13
sol_dict = solve([y/(x-1) - 3 * y/sqrt(((x-1)**2)*(x-2))-l_bound, y/(x-1) + 3 * y/sqrt(((x-1)**2) * (x-2))-u_bound], [x, y], dict=True)
我试图找到一种方法来加快这个过程,因为它需要花费很长时间,而且我有相当多的数据矩阵行要处理(每个j是一行)。我在documentaries中找到的例子展示了如何计算函数-是否有可能在GPU上使用solve()?
到目前为止我所做的:我看过纪录片,找不到正确的表达方式。-因为我是新的主题,我可能错过了一些重要的部分(对不起,如果我的问题可能是微不足道的)。提前感谢任何指针在一个更合适的方向,感谢任何帮助。
1条答案
按热度按时间pvcm50d11#
Sympy是一个完全基于Python的CAS,所以我不相信像求解器这样的复杂计算可以轻松地移植到GPU上。
然而,通过查看您的示例,似乎您正在尝试获得数值解。因此,
solve
不是正确的工具。nsolve
(数值解)可能更适合这项工作。通常,您需要提供适当的初始猜测。例如:你会注意到,对于这个特殊的例子,
nsolve
比solve
快得多。然而,对于你的循环的每次迭代,nsolve
将使用lambdify
将符号方程组转换为数值函数组:这个操作是昂贵的。如果你的方程的形式没有随着迭代而改变,那么我们可以在开始时将符号方程系统转换为数值函数系统一次,然后在循环中使用更新的值重新使用它。例如:备注:
nsolve
将完全执行我们在前面代码块中所做的操作:将方程组转换为符号矩阵,计算符号雅可比矩阵,将系统和雅可比矩阵转换为数值函数,并使用mpmath的findroot
来找到解决方案。1.如果你不使用mpmath的
findroot
,而是使用Scipy的一些其他的求根算法,也许可以进一步提高性能。