我有一个转换的应力张量,它的原理值以复杂的形式出现:
#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
;如何改变它以便答案代表它,但是以正常的漂浮形式?
答案 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)