Skip to content

Instantly share code, notes, and snippets.

@portnov
Created September 21, 2024 14:30
Show Gist options
  • Save portnov/d19b42aaa5193522d739f79d5f690648 to your computer and use it in GitHub Desktop.
Save portnov/d19b42aaa5193522d739f79d5f690648 to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
import numpy as np
from math import pi
def shear_xy(f1, f2):
m = np.eye(3)
m[0][2] = f1
m[1][2] = f2
return m
def shear_yz(f1, f2):
m = np.eye(3)
m[1][0] = f1
m[2][0] = f2
return m
def shear_xz(f1, f2):
m = np.eye(3)
m[0][1] = f1
m[2][1] = f2
return m
def rotate_z(a):
m = np.eye(3)
m[0][0] = np.cos(a)
m[0][1] = -np.sin(a)
m[1][0] = -m[0][1]
m[1][1] = m[0][0]
return m
def rotation(k, theta):
# https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
K = np.zeros((3,3))
K[0,1] = -k[2]
K[0,2] = k[1]
K[1,2] = -k[0]
K[1,0] = -K[0,1]
K[2,0] = -K[0,2]
K[2,1] = -K[1,2]
I = np.eye(3)
R = I + np.sin(theta) * K + (1 - np.cos(theta)) * (K @ K)
return R
def decompose_shear(m):
"""
(%i4) sxy . syz . sxz;
[ f1 f4 + 1 f1 (f6 + f4 f5) + f5 f1 ]
[ ]
(%o4) [ f2 f4 + f3 f2 (f6 + f4 f5) + f3 f5 + 1 f2 ]
[ ]
[ f4 f6 + f4 f5 1 ]
"""
A = np.zeros((3,2))
A[0][0] = 1 + m[2][0]*m[0][2]
A[0][1] = m[0][2]
A[1][0] = m[1][0]
A[1][1] = m[1][2]
A[2][0] = m[2][0]
A[2][1] = 1.0
B = np.array([m[0][1], m[1][1] - 1, m[2][1]])
x, res, rank, sing = np.linalg.lstsq(A, B, rcond=None)
f5, f6 = list(x)
f1 = m[0][2]
f2 = m[1][2]
f3 = m[1][0] - m[1][2]*m[2][0]
f4 = m[2][0]
sxy_ans = shear_xy(f1, f2)
syz_ans = shear_yz(f3, f4)
sxz_ans = shear_xz(f5, f6)
return sxy_ans, syz_ans, sxz_ans
if __name__ == "__main__":
R = rotation([1,1,2], pi/3)
m = np.linalg.inv(R) @ shear_yz(0.3, 0.7) @ R
print("M:")
print(m)
sxy_ans, syz_ans, sxz_ans = decompose_shear(m)
print("ShearXY:")
print(sxy_ans)
print("ShearYZ:")
print(syz_ans)
print("ShearXZ:")
print(sxz_ans)
res = sxy_ans @ syz_ans @ sxz_ans
print("Res:")
print(res)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment