RSS for en tilfeldig lastretning

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.

image.png

Plan gitt ved normalen ni og tilhørende retninger si er listet i følgende kode:

In [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] ]

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.

Vilkårlig vektor....

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:

In [2]:
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()  )
[-0.55574449  0.23354207  0.79787603]
[-0.59936025  0.56886746  0.56316703]
[-0.55297585 -0.56008334 -0.61686657]
[0.65418483 0.63261763 0.41453243]

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:

In [3]:
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...):

In [4]:
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:

In [5]:
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$.

In [6]:
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)))
Mean: 0.452, Min: 0.277, Max: 0.500

Til slutt et histogram av resultatet:

In [7]:
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:

In [8]:
ts = np.asarray(taurmax)
prosentOverVerdi = 100*(ts > 0.4).sum()/len(ts)

print('{}% av tilfellene gir verdi over 0.4'.format(prosentOverVerdi))
    
88.6% av tilfellene gir verdi over 0.4

Disclaimer:This site is designed for educational purposes only. There are most likely errors, mistakes, typos, and poorly crafted statements that are not detected yet... www.ntnu.edu/employees/nils.p.vedvik

Copyright 2023, All rights reserved