Utmatting, eller mer presist, dynamisk utmatting, er svikt i materialet på grunn av varierende last. Det kan være nyttig å kategorisere utmatting i to typer:
I mange tilfeller vil det være en blanding av syklisk og stokastisk variasjon: til og med vær og vind kan ha identifiserbar og predikerbar periodisk gjentagelse (eksempelvis flo og fjære) som kombineres med mer stokastisk belastning fra f.eks. vind.
Syklisk utmatting er grunnprinsippet for testing av materialer med hensyn på utmatting, og dette prinsippet er enkelt:
Materialet utsettes for en et stort antall lastsykler, vanligvis i form av en sinusfunksjon for spenningen med gitt middelverdi $\sigma_m$, amplitude $\sigma_a$ og frekvens $f$. Antall sykler $N$ til brudd kalles levetid for det gitte lastnivået. R-verdi er forholdet mellom minimumsspenning $\sigma_{min}$ og maksimumspenning $\sigma_{max}$:
\begin{equation} \sigma_m = \frac{\sigma_{max} + \sigma_{min}}{2} \tag{1} \end{equation}\begin{equation} \sigma_a = \frac{\sigma_{max} - \sigma_{min}}{2} \tag{2} \end{equation}\begin{equation} R = \frac{\sigma_{min}}{\sigma_{max}} \tag{3} \end{equation}Sammenhenger mellom periode $T$, frekvens $f$ og vinkelfrekvens $\omega$ er jo godt kjent for alle på gløs...
\begin{equation} \omega = 2 \pi f = \frac{2 \pi}{T} \tag{4} \end{equation}En syklisk spenning kan da uttrykkes ved:
\begin{equation} \sigma(t) = \sigma_m + \sigma_a \sin \omega t \tag{5} \end{equation}Eksempler: (bruk funksjonen for å lage dine egne eksempler..)
import numpy as np
import matplotlib.pyplot as plt
def plotSykliskUtmatting(tid_max, f, sig_m, sig_a, tid_min=0, nt=10000, grid=True):
t = np.linspace(tid_min, tid_max, nt) # nt er antal datapunkt
w = 2*np.pi*f # vinkelfrekvens
sig_min = sig_m - sig_a
sig_max = sig_m + sig_a
R_verdi = sig_min/sig_max
sig = sig_m + sig_a*np.sin(w*t)
plt.subplots(figsize=(4,3))
plt.plot(t,sig, color='red', linewidth = 1)
plt.title('$\sigma_m$={:.1f}, $\sigma_a$={:.1f}, $R$={:.2f}'.format(sig_m, sig_a, R_verdi), fontsize = 10)
plt.xlabel('Tid')
plt.ylabel('Spenning')
plt.grid()
plt.show()
plotSykliskUtmatting(tid_max=60, f=0.1, sig_m=0, sig_a=150)
plotSykliskUtmatting(tid_max=10, f=1, sig_m=50, sig_a=100)
plotSykliskUtmatting(tid_max=5, f=1, sig_m=100, sig_a=50)
Eksperimentelle data for en aluminiumslegering er gitt under:
import numpy as np
import matplotlib.pyplot as plt
# Test-resultat for en aluminiumslegering (2017A)
S_eksp = [400, 300, 250, 200, 175, 150, 125, 120]
N_eksp = [2.5E4, 6.1E4, 1.0E5, 2.8E5, 5.5E5, 1.1E6, 3.0E6, 8.1E6]
plt.semilogx(N_eksp,S_eksp, 'o')
plt.ylim(0,)
plt.xlabel('N')
plt.ylabel('S')
plt.grid()
plt.show()
Vi ser rimelig tydelig at det ikke er en lineær sammenheng mellom spenningen (S) og log(N) for dette materialet.
Mange materialer viser imidlertid følgende sammenheng mellom spenningen og antall sykler:
\begin{equation} S = A \cdot N^{-B} \tag{6} \end{equation}hvor $A$ og $B$ er empiriske konstanter (altså verdier som vi forsøker å tilpasse de eksperimentelle verdiene). Merk at du vil finne alle mulige andre symbol for $A$ og $B$ i ulike kilder.
Fra ligning (6):
\begin{equation} \log S = \log A -B \log N \tag{7} \end{equation}Nå får vi altså en lineær sammenheng mellom $\log N$ og $\log S$.
Ligningen har to ukjent, så vi trenger 2 datapunkt ($S_1, N_1$) og ($S_2, N_2$) for å finne disse:
$$ S_1 = A \cdot N_1^{-B} \quad \text{og} \quad S_2 = A \cdot N_2^{-B} $$Løser for $B$:
$$ \frac{S_1}{S_2} = \frac{A \cdot N_1^{-B}}{A \cdot N_2^{-B}} = \frac{N_1^{-B}}{N_2^{-B}} = \bigg(\frac{N_1}{N_2}\bigg)^{-B} \Rightarrow \log \bigg( \frac{S_1}{S_2} \bigg) = -B \log \bigg( \frac{N_1}{N_2} \bigg) \Rightarrow$$\begin{equation} B = - \frac{\log S_1 - \log S_2}{\log N_1 - \log N_2} \tag{8} \end{equation}Dermed finner vi $A$ ved:
$$ S_1 = A \cdot N_1^{-B} \Rightarrow $$\begin{equation} A = S_1 N_1^{B} \tag{9} \end{equation}# Prøver med første [0] og siste [-1] datapunkt:
S1, S2 = S_eksp[0], S_eksp[-1]
N1, N2 = N_eksp[0], N_eksp[-1]
B = -( np.log10(S1) - np.log10(S2) )/( np.log10(N1) - np.log10(N2) )
A = S1*N1**B
print('A = {:.1f}, B = {:.3f}'.format(A,B))
# Sjekker om dette ser ut til å passe:
N=np.logspace(4,7)
S=A*N**(-B)
plt.semilogx(N_eksp,S_eksp, 'o')
plt.semilogx(N,S)
plt.ylim(0,)
plt.xlabel('N')
plt.ylabel('S')
plt.grid()
plt.show()
# Prøver heller med andre [1] og nærsiste [-2] datapunkt:
S1, S2 = S_eksp[1], S_eksp[-2]
N1, N2 = N_eksp[1], N_eksp[-2]
B = -( np.log10(S1) - np.log10(S2) )/( np.log10(N1) - np.log10(N2) )
A = S1*N1**B
N=np.logspace(4,7)
S=A*N**(-B)
plt.semilogx(N_eksp,S_eksp, 'o')
plt.semilogx(N,S)
plt.ylim(0,)
plt.xlabel('N')
plt.ylabel('S')
plt.grid()
plt.show()
# Samme som over, men i et log S - log N plot:
plt.loglog(N_eksp,S_eksp, 'o')
plt.loglog(N,S)
plt.xlabel('N')
plt.ylabel('S')
plt.grid()
plt.show()
En enkel metode for automatisk kurvetilpassing, er numpy.polyfit(x,y,deg)
, som antar et polynom av grad deg
.
Fra ligning (7) har vi
$$ \log S = \log A -B \log N$$som vi kan skrive som
$$ y = p_1 x + p_0 $$hvor $\quad y = \log S, \quad x = \log N, \quad p_0 = \log A, \quad p_1 = -B$
y = np.log10(S_eksp)
x = np.log10(N_eksp)
k = np.polyfit(x, y, 1)
p1=k[0]
p0=k[1]
print(p1,p0)
A = 10**p0
B = -p1
print('A = {:.1f}, B = {:.3f}'.format(A,B))
N=np.logspace(4,7)
S=A*N**(-B)
plt.loglog(N_eksp,S_eksp, 'o')
plt.loglog(N,S)
plt.xlabel('N')
plt.ylabel('S')
plt.grid()
plt.show()
plt.semilogx(N_eksp,S_eksp, 'o')
plt.semilogx(N,S)
plt.ylim(0,)
plt.xlabel('N')
plt.ylabel('S')
plt.grid()
plt.show()