Utløst skjærspenning $\tau_R$ er
\begin{equation} \tau_R = \sigma \text{cos}(\phi) \text{cos}(\lambda) \end{equation}hvor
$$ \text{cos}(\phi) = \frac{\boldsymbol{\sigma}\cdot\mathbf{n}}{|\boldsymbol{\sigma}||\mathbf{n}|}, \quad \text{cos}(\lambda) = \frac{\boldsymbol{\sigma}\cdot\mathbf{s}}{|\boldsymbol{\sigma}||\mathbf{s}|} $$FCC har 12 glidesystem som består av 4 plan (vist i figuren under) og 3 retninger i hvert plan.
Plan gitt ved normalen ni
og tilhørende retninger si
er listet i følgende kode:
n1 = [1,1,1]
s1 = [ [-1,1,0], [0,-1,1], [1,0,-1] ]
n2 = [1,1,-1]
s2 = [ [-1,1,0], [1,0,1], [0,-1,-1] ]
n3 = [1,-1,1]
s3 = [ [1,1,0], [-1,0,1], [0,-1,-1] ]
n4 = [1,-1,-1]
s4 = [ [1,1,0], [0,-1,1], [-1,0,-1] ]
Ideen til denne studien er følgende:
Siden FCC har mange glidesystem, vil en vilkårlig retning på spenningen $\boldsymbol{\sigma}$ (eller alternativt: en vilkårlig orientering av krystallen i forhold til spenningen) sannsynligvis gi en høy verdi av $\text{cos}(\phi) \text{cos}(\lambda)$ for ett eller flere av de 12 system.
Det er nærliggende å tenke at en vilkårlig vektor består av 3 vilkårlige tall, så la oss prøve dette med følgende funksjon:
import numpy as np
def randomvektorA():
v = 1 - 2*np.random.rand(3) # en vektor med 3 vilkårlige verdier i intervallet {-1,1}
v = v/np.linalg.norm(v) # normaliserer vektoren
return v
print( randomvektorA() ) # tester...
print( randomvektorA() )
print( randomvektorA() )
print( randomvektorA() )
De fire vektorene som ble produsert over, ser jo ut til å være tilfeldige. Problemet er imidlertid at denne metoden føre til en tydelig bias som vi kan illustrerer ved å generere en bunch av slike, for så å lage et histogram over projeksert orientering på ett plan:
vs = [randomvektorA() for i in range(0,10000)] # 10000 vektorer
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4,4))
ax = plt.subplot(projection='polar')
ax.set_title('Histogram av vektorer projektert til x-y planet')
vinkler = [np.arctan2(y, x) for (x,y,z) in vs]
ax.hist(vinkler, bins=36)
plt.show()
Histogrammet viser altså en tydelig preferanse for orientering langs diagonaler (45, 135, 225 og 315 grader).
Altså: vi må finne en annen måte å generere tilfeldige vektorer, og denne gjør jobben (fant den på internett...):
def randomvektorB():
alpha = np.random.uniform(0,np.pi*2)
cosbeta = np.random.uniform(-1,1)
beta = np.arccos( cosbeta )
x = np.sin( beta) * np.cos( alpha )
y = np.sin( beta) * np.sin( alpha )
z = np.cos( beta )
return [x,y,z]
Tester:
vs = [randomvektorB() for i in range(0,10000)]
fig = plt.figure(figsize=(4,4))
ax = plt.subplot(projection='polar')
ax.set_title('Histogram av vektorer projektert til x-y planet')
vinkler = [np.arctan2(y, x) for (x,y,z) in vs]
ax.hist(vinkler, bins=36)
plt.show()
Da er vi klar til å regne ut $\tau_R$ i alle glidesystem for 10000 vilkårlige retninger (!).
Antar at spenningens skalar-verdi er $\sigma = 1$.
n1 = [1,1,1]
s1 = [ [-1,1,0], [0,-1,1], [1,0,-1] ]
n2 = [1,1,-1]
s2 = [ [-1,1,0], [1,0,1], [0,-1,-1] ]
n3 = [1,-1,1]
s3 = [ [1,1,0], [-1,0,1], [0,-1,-1] ]
n4 = [1,-1,-1]
s4 = [ [1,1,0], [0,-1,1], [-1,0,-1] ]
taurmax=[] # fylles med høyeste verdi fra de 12 system for hver tilfeldig vektor 'sig'
for sig in vs: # bruker verdier 'vs' fra sist prosedyre (den uten bias..)
taur=[] # fylles med 12 verdier, fra hvert system
for n, si in zip([n1,n2,n3,n4],[s1,s2,s3,s4]):
for s in si:
cosphi = (np.dot(sig,n))/(np.linalg.norm(sig) * np.linalg.norm(n))
coslam = (np.dot(sig,s))/(np.linalg.norm(sig) * np.linalg.norm(s))
taur.append(abs(cosphi*coslam))
taurmax.append(max(taur))
# Litt statestikk:
print('Mean: {:.3f}, Min: {:.3f}, Max: {:.3f}'.format(np.mean(taurmax), np.min(taurmax), np.max(taurmax)))
Til slutt et histogram av resultatet:
fig,ax = plt.subplots(figsize=(6,4))
plt.hist(taurmax, 10, density=False,facecolor='teal', alpha=0.4 )
ax.set_ylabel('frekvens', size=12)
ax.set_xlabel(r'max $\tau_r$ [MPa]', size=12)
ax.set_xlim(0,)
ax.grid(True)
plt.show()
Hvor mange prosent av tilfellene er over en gitt verdi, f.eks. 0.4:
ts = np.asarray(taurmax)
prosentOverVerdi = 100*(ts > 0.4).sum()/len(ts)
print('{}% av tilfellene gir verdi over 0.4'.format(prosentOverVerdi))