Python 在不影响结果质量的情况下,将复数根转换为标准浮点形式

Python 在不影响结果质量的情况下,将复数根转换为标准浮点形式,python,numpy,scipy,Python,Numpy,Scipy,我有一个变换后的应力张量,它的主值以复杂的形式出现: #simple roots calculated by characteristic equation def princ_cherac(sten): sxx,syy,szz,sxy,syz,szx = sten H1 = (sxx+syy+szz)/3. H2 = (syz**2 + szx**2 + sxy**2 - syy*szz - szz*sxx - sxx-syy)/3. H3 = ( 2*s

我有一个变换后的应力张量,它的主值以复杂的形式出现:

#simple roots calculated by characteristic equation
def  princ_cherac(sten):
    sxx,syy,szz,sxy,syz,szx = sten
    H1 = (sxx+syy+szz)/3.
    H2 = (syz**2 + szx**2 + sxy**2  - syy*szz - szz*sxx - sxx-syy)/3.
    H3 = (  2*syz*szx*sxy  +  sxx*syy*szz   -  sxx*syz*syz  - syy*szx*szx - szz*sxy*sxy    )/2. 
    from numpy.polynomial import Polynomial as P 
    p = P([2*H3,3*H2,3*H1,-1])  
    S3,S2,S1 = p.roots()

但它产生复杂的根。对于我进一步的计算,复杂形式无法工作。如何在不丢失任何结果信息的情况下从复杂表单转换,例如,
S3=-32.894653311352783-28.288180652364915j
;如何更改它,使答案以正常的浮点形式表示它?

在实现
H2
时出错。最后一个术语是
sxx-syy
,但应该是
sxx*syy

顺便说一下,通过使用查找值,您可能会得到更准确的结果。例如,这里有一个完整的3x3张量
COEFS
是要传递给princ\u cherac的值:

In [200]: tensor = np.array([[2, 1, 1], [1, 2, 1], [1, 1, 2]])

In [201]: coeffs = tensor.ravel()[[0, 4, 8, 1, 5, 2]]

In [202]: tensor
Out[202]: 
array([[2, 1, 1],
       [1, 2, 1],
       [1, 1, 2]])

In [203]: coeffs
Out[203]: array([2, 2, 2, 1, 1, 1])
In [205]: princ_cherac(coeffs)
Out[205]: (0.9999999619754828, 1.0000000380245182, 4.0)
使用
eigvalsh
计算值

In [204]: np.linalg.eigvalsh(tensor)
Out[204]: array([ 1.,  1.,  4.])
将其与校正后的
princ\u cherac产生的值进行比较:

In [200]: tensor = np.array([[2, 1, 1], [1, 2, 1], [1, 1, 2]])

In [201]: coeffs = tensor.ravel()[[0, 4, 8, 1, 5, 2]]

In [202]: tensor
Out[202]: 
array([[2, 1, 1],
       [1, 2, 1],
       [1, 1, 2]])

In [203]: coeffs
Out[203]: array([2, 2, 2, 1, 1, 1])
In [205]: princ_cherac(coeffs)
Out[205]: (0.9999999619754828, 1.0000000380245182, 4.0)

你使用哪种语言?只标记您正在使用的语言。python和numpy函数,但我对其他语言很灵活,但它与数学更相关。然后只有一种语言。请不要用不相关的语言标签发送垃圾邮件,这只会让你的问题被否决和/或被否决。编辑您的问题以删除不相关的标记。
-32.894653311352783-28.288180652364915j
应该转换成什么?谢谢Buddy。你让我开心:*谢谢你宝贵的时间