将复杂根转换为标准浮点形式,而不会影响结果质量

时间:2016-08-26 16:16:10

标签: 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*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;如何改变它以便答案代表它,但是以正常的漂浮形式?

1 个答案:

答案 0 :(得分:3)

执行H2时出错。您的最后一个字词为sxx-syy,但应为sxx*syy

顺便说一下,使用numpy.linalg.eigvalsh查找值可能会获得更准确的结果。例如,这是一个完整的3x3张量; coeffs是要传递给princ_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])

使用eigvalsh计算值。

In [204]: np.linalg.eigvalsh(tensor)
Out[204]: array([ 1.,  1.,  4.])

将其与更正后的princ_cherac生成的值进行比较:

In [205]: princ_cherac(coeffs)
Out[205]: (0.9999999619754828, 1.0000000380245182, 4.0)