当试图寻找根时,与Cython同音产生奇异矩阵

2024-10-06 07:17:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Sympy解一组非线性方程组。这是我的代码,更改了一些数字,只有一个输入值(实际代码运行了170000行数据):

import sympy as sp

K0 = 2.00*10**-4
x2, y2 = sp.symbols('x2, y2')
x0 = 500
y0 = 500
R1 = ((x2 - x0)**2 + (y2 - y0)**2)**0.5
R2 = K0 * R1
H2 = sp.atan(R2 * (x2 - x0)/R1)
V2 = sp.atan(R2 * (y2 - y0)/R1)
x, y = sp.symbols('x, y')
x0 = 1.0
y0 = 2.0
x = R1 * H2
y = R1 * V2
dat = sp.nsolve([x - x0, y - y0], [x2, y2], [512, 512]) # This line is the problem
print "dat = %f, %f" % (dat[0], dat[1])

纯粹使用Python,代码运行良好并产生良好的输出,但速度非常慢。为了加快这个过程,我使用Cython编译了一个带有完全相同代码的.pyx文件(在定义中,def test()),但是在运行时我遇到了:

^{pr2}$

我已经把问题缩小到x - x0和{}部分。由于某些原因,当根不等于0时,编译的代码无法处理查找根。nsolve不能简单地用Cython转换成C吗?我有没有遗漏什么事跟赛顿有关?在


Tags: 代码h2spdatv2r2x2symbols
1条回答
网友
1楼 · 发布于 2024-10-06 07:17:47

您可以将sympy.lambdify与SciPy的解算器一起使用。如果速度不够快,可以使用symengine.Lambdify。在

正确地获得函数签名,并导出Jacobian,需要您跳出重重障碍。如果您想使用我为其编写的库pyneqsys

>>> from pyneqsys.symbolic import SymbolicSys
>>> neqsys = SymbolicSys([x2, y2], [x - x0, y - y0])
>>> neqsys.solve([512, 512])
Out[4]: 
(array([ 547.28609349,  594.58064617]),
     fjac: array([[ 0.91320338,  0.4075041 ],
       [-0.4075041 ,  0.91320338]])
     fun: array([ -1.37667655e-13,   1.52011737e-12])
 message: 'The solution converged.'
    nfev: 17
    njev: 2
     qtf: array([  1.55620322e-10,   4.63225371e-10])
       r: array([ 0.02751454,  0.023682  ,  0.03261983])
  status: 1
 success: True
       x: array([ 547.28609349,  594.58064617]))

如果这17万个解包含逐渐变化的参数,pyneqsys可以利用这一点(通过在解之间传播解作为猜测)。它还可以通过设置环境变量SYM_BACKEND=sympysymengine自动使用symengine.Lambdify

相关问题 更多 >