繁体   English   中英

为Sympy解决方案提供建议

[英]Suggesting solutions for Sympy solve

我正在尝试使用SymPy solve许多输入值的方程来求解方程。 到目前为止,这是我的代码:

E = np.linspace(Emin,Emax,((Emax-Emin)/Emesh)+1)
z1 = np.zeros(len(E))+0j

for i in xrange(len(E)):    
    z = Symbol('z')
    z1[i] = solve( (d - E[i])/s - z - 1/z, z)

此处ds是常数, E是一维数组。 该代码工作正常,但速度很慢。 由于E[i]变化缓慢,因此z1[i]几乎等于z1[i+1] 与其每次为每个新E[i]从头开始求解方程,不如将结果z1[i]用作求解z1[i+1]的起点。 另一种选择是基于z[i]值对z[i+1]的允许值设置界限。 基本上,我希望尽可能加快这一部分的速度。

有什么建议么?

如果看你的方程式,

(d - e) / s - z - 1/z == 0

-z乘。

z**2 + ((e - d) / 2) * z + 1 == 0

现在是二次方,我们可以轻松解决,

b = (e - d) / s

z = (-b +/- (b*b - 4)**0.5) / 2

numpy代码可以做到这一点,

import numpy as np

# some made-up numbers
e_min = 1.9
e_max = 2.6
e_mesh = 0.05
d = 2.1
s = 0.45

es = np.arange(e_min, e_max, e_mesh, dtype=np.complex)

bs  = (es - d) / s
rts = np.sqrt(bs * bs - 4)
z1 = (-bs + rts) / 2
z2 = (-bs - rts) / 2

运行时产生的

z1
Out[118]: 
array([ 0.22222222-0.97499604j,  0.16666667-0.9860133j ,
        0.11111111-0.99380799j,  0.05555556-0.9984556j ,
        0.00000000+1.j        , -0.05555556+0.9984556j ,
       -0.11111111+0.99380799j, -0.16666667+0.9860133j ,
       -0.22222222+0.97499604j, -0.27777778+0.96064536j,
       -0.33333333+0.94280904j, -0.38888889+0.92128466j,
       -0.44444444+0.89580642j, -0.50000000+0.8660254j ,
       -0.55555556+0.83147942j])

z2
Out[119]: 
array([ 0.22222222+0.97499604j,  0.16666667+0.9860133j ,
        0.11111111+0.99380799j,  0.05555556+0.9984556j ,
       -0.00000000-1.j        , -0.05555556-0.9984556j ,
       -0.11111111-0.99380799j, -0.16666667-0.9860133j ,
       -0.22222222-0.97499604j, -0.27777778-0.96064536j,
       -0.33333333-0.94280904j, -0.38888889-0.92128466j,
       -0.44444444-0.89580642j, -0.50000000-0.8660254j ,
       -0.55555556-0.83147942j])

在这种情况下,您甚至可能不需要使用solve! 您要做的就是求解方程式:

(d - E[i])/s - z - 1/z=0

对于z。 在朋友WolframAlpha的帮助下,我们得到:

z=-(-d+E[i]+sqrt(d**2-2*d*E[i]+E[i]**2-4*s**2))/(2*s)

z=(d-E[i]+sqrt(d**2-2*d*E[i]+E[i]**2-4*s**2))/(2*s)

我不确定您的域,因此选择使用这两者中的一个或两个。

供参考,完整功能:

E = np.linspace(Emin,Emax,((Emax-Emin)/Emesh)+1)
z1 = np.zeros(len(E))+0j
for i in xrange(len(E)):    
    z1[i] = z #Replace z with one/both of the expressions above

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM