Materialvariabilitet i tre

Denne siden inneholder lite eller ingen forklaring, men verktøy for å behandle testdata som potensielt blir utgangspunkt for øving. Se Blackboard (forelesning, video) for både teori og praktiske aspekt ved testing og testdata.

Tre er et naturlig material, med naturlig mye variasjon.

Det er utført 3-punkt bøyeprøving av 16 antatt like bjelker av tre og følgende viser rådata av last versus deformasjon (nedbøying):

In [2]:
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

path='files/wood3ptest/'
testfiles=os.listdir(path)
fig,ax = plt.subplots(figsize=(8,5))
ax.set_xlabel('Deformation [mm]')
ax.set_ylabel('Load [N]')
ax.grid(True)
v=[]
for f in testfiles:
    table=np.genfromtxt(fname=path+f,skip_header=1,delimiter=',',filling_values=0.0)
    disp,load=table[:,2],table[:,1]
    ax.plot(disp,load,label=f)
    v.append(max(load))
plt.legend()
plt.show()

Nå ser jo ikke dette pent ut, og det er ingen grunn til å ha med data etter maks last/brudd, så vi rydder opp med følgende hendige funksjon og plotter på nytt:

In [2]:
def slettEtterMaksLast(disp,load):
    maksindeks = np.argmax(load)
    return disp[0:maksindeks], load[0:maksindeks]
    

fig,ax = plt.subplots(figsize=(8,5))
ax.set_xlabel('Deformation [mm]')
ax.set_ylabel('Load [N]')
ax.grid(True)
v=[]
for f in testfiles:
    table=np.genfromtxt(fname=path+f,skip_header=1,delimiter=',',filling_values=0.0)
    disp,load=table[:,2],table[:,1]
    disp,load=slettEtterMaksLast(disp,load)
    ax.plot(disp,load,label=f)
    v.append(max(load))
plt.legend()
plt.show()

Det er også mer ryddig å nullstille hver serie (siden de som testet greiene ikke har vært så nøye med dette). Følgende funksjon nullstiller ved å først finne første datapunkt som faktisk har signifikant last over null, for så å forskyve langs x-aksen:

In [3]:
def nullstill(disp,load):
    startindex=np.argmax(load > 0.1)
    disp = disp[startindex:-1]
    load = load[startindex:-1]
    disp = disp - [disp[0]]
    return disp,load
    
fig,ax = plt.subplots(figsize=(8,5))
ax.set_xlabel('Deformation [mm]')
ax.set_ylabel('Load [N]')
ax.grid(True)
v=[]
for f in testfiles:
    table=np.genfromtxt(fname=path+f,skip_header=1,delimiter=',',filling_values=0.0)
    disp,load=table[:,2],table[:,1]
    disp,load=slettEtterMaksLast(disp,load)
    disp,load=nullstill(disp,load)
    ax.plot(disp,load,label=f)
    v.append(max(load))
plt.legend()
plt.show()

Variasjon i bøyestivhet

Kurvene virker lineære opp til en deformasjon på 2 mm, eventuelt opp til en last på 50 N, så vi sjekker begge alternativ:

In [4]:
k_2mm = []
k_50N = []

for f in testfiles:
    table=np.genfromtxt(fname=path+f,skip_header=1,delimiter=',',filling_values=0.0)
    disp,load=table[:,2],table[:,1]
    disp,load=slettEtterMaksLast(disp,load)
    disp,load=nullstill(disp,load)
    ind=np.argmax(disp > 2)
    k_2mm.append(load[ind]/disp[ind])
    ind=np.argmax(load > 50)
    k_50N.append(load[ind]/disp[ind])
    
for k1, k2 in zip(k_2mm, k_50N):
    print('{:.1f}   ,   {:.1f}'.format(k1,k2))
25.8   ,   25.8
31.4   ,   31.3
27.2   ,   27.2
25.6   ,   25.6
22.7   ,   22.7
30.5   ,   30.4
25.3   ,   25.3
35.0   ,   34.9
28.4   ,   28.4
29.4   ,   29.3
27.4   ,   27.4
36.1   ,   36.1
36.0   ,   36.0
26.7   ,   26.7
27.6   ,   27.7
33.9   ,   33.8

Det er lite eller ingen forskjell, men siden vi er i gang, la oss definere bøyestivheten som gjennomsnittet:

In [5]:
k = []
for k1, k2 in zip(k_2mm, k_50N):
    k.append((k1+k2)/2)

Deretter statistikk på bøyestivhet for de 16 paralelle testene:

In [6]:
n    =  len(k)
vmin =  np.amin(k)
vmax =  np.amax(k)
vmean=  np.mean(k)
vstd =  np.std(k,ddof=1)
vcov =  100*vstd/vmean

print('Sample size:',n)
print('Min:        ',vmin)
print('Max:        ',vmax)
print('Mean:       ',vmean)
print('Stdev:      ',vstd)
print('COV%:       ',vcov)
Sample size: 16
Min:         22.68665031611951
Max:         36.098218612472735
Mean:        29.298387215119185
Stdev:       4.104964596794485
COV%:        14.010889291121638

Variasjon i bruddstyrke

In [1]:
b = []

for f in testfiles:
    table=np.genfromtxt(fname=path+f,skip_header=1,delimiter=',',filling_values=0.0)
    disp,load=table[:,2],table[:,1]
    disp,load=slettEtterMaksLast(disp,load)
    disp,load=nullstill(disp,load)
    b.append(max(load))

for bi, no in zip(b,range(1,17)):
    print('Bruddlast for test {:0>{}}: {:.2f} N'.format(no,2,bi))
    
n    =  len(b)
vmin =  np.amin(b)
vmax =  np.amax(b)
vmean=  np.mean(b)
vstd =  np.std(b,ddof=1)
vcov =  100*vstd/vmean

print('')
print('Sample size:',n)
print('Min:        ',vmin)
print('Max:        ',vmax)
print('Mean:       ',vmean)
print('Stdev:      ',vstd)
print('COV%:       ',vcov)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[1], line 3
      1 b = []
----> 3 for f in testfiles:
      4     table=np.genfromtxt(fname=path+f,skip_header=1,delimiter=',',filling_values=0.0)
      5     disp,load=table[:,2],table[:,1]

NameError: name 'testfiles' is not defined

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