はじめに
初投稿記事です。暖かい目でご覧あれ。
凄いデータ量の引張試験結果を、エクセルで処理するの面倒だったので作りました。
今回のコードを走らせることで、一発で応力ひずみ曲線を作成します。
環境
- Windows 64 bit
- Anaconda3
- Visual Studio code
引張試験とは
材料の強度評価試験です。材料が硬いかどうか分かる比較的簡単な試験方法として、広く使われています。そこから得られる荷重、変位の変化から応力とひずみの変化に変換後、応力―ひずみ曲線(S-S カーブ)を作成します。
##この記事って...
専門用語等の詳しい説明については割愛しています。材料系の学生に少しでもサボってほしい!そういう記事です。
材料系の方以外で、勉強したい方は↓
引張試験- Wikipedia
Anacondaダウンロードしてない方は↓
1.Anacondaダウンロード・インストール・設定 - Qiita
準備するもの
- 引張試験結果(CSVファイル)
- 試験片寸法(エッジ部の寸法)
CSVファイル(例)
"試験名","試験モード","試験種類","コントロール","試験速度1","試験速度2","試験速度3","切替点1","切替点2","伸び原点","破断、リミット後の動作","感度:","レベル:"
"002.tag","シングル","引張","ストローク",3.888,1.001,1.001,"Off","Off","最初から","ストップ",50,5
"タイトル","サブタイトル","コメント"
"","",""
"形状:","バッチ数:","サブバッチ数:"
"平板",1,1
"名前:","厚さ","幅","つかみ具間距離",
"寸法単位:","mm","mm","mm",
" sus316l","1.2000","2.0000","12.0000",
"名前",
"パラメータ",
"単位",
" sus316l",
" 1- 1"
"時間","試験力","ストローク",
"sec","N","mm",
"0.00",1.25,0,
"0.05",1.25,.003,
.
.
.
"155.30",1218.75,10.063,
"155.35",1210,10.066,
"155.40",1201.25,10.07,
"155.45",1191.25,10.073,
"155.50",1178.75,10.076,
"155.55",1095,10.08,
"155.60",403.75,10.083,
エッジ部の寸法
寸法は、引張試験前にノギスやらマイクロメーターで測定しておいてください。
この図に示した長さ、幅、厚さを使って荷重(試験力)と変位(ストローク)から応力、ひずみに変換します。
コード
#CSVデータから散布図を作成
import csv
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import os
import seaborn as sns
import matplotlib as mpl
#CSVの必要な行だけ表示
#sec","N","mm",のみ
filename = 'result.csv'
root, ext = os.path.splitext(filename)
print(filename)
df = pd.read_csv(filename, header=None, skiprows=20, usecols=[0,1,2], names=['sec', 'N', 'mm'], encoding = 'shift_jis')
#寸法入力
first_length = 19.830-8 #mm #初期長さ
t =2.002 #mm #断面長さ(厚さ)
w = 1.304 #mm #断面長さ(幅)
area = t * w #mm #断面積
#ひずみの計算
df['strain']=df['mm']/ first_length
#0.2%耐力
df['strain_0.2%'] = df['strain'] + 0.002
#0.2%との交点の値
index = np.where(df['strain'] == df['strain_0.2%'])
print(index)
#応力の計算
df['stress(MPa)'] = (df['N']/ area )
new = df[(df['strain'] > 0.0025) & (df['strain'] < 0.005)] #弾性域の範囲
print(new)
#傾きを求める
x_1 = new['strain']
y_1 = new['stress(MPa)']
plt.scatter(x_1, y_1, s=6, c="black")
plt.plot(x_1, np.poly1d(np.polyfit(x_1, y_1, 1))(x_1), label='d=1')
a ,b= np.polyfit(x_1, y_1, 1)
print("傾き = ",a)
print("切片 = ",b)
#グラフを書く
#0,1,2 = "sec","N","mm"
fig = plt.figure(figsize=(14, 10))
x = df['strain']
y = df['stress(MPa)']
y2 = a*(x-0.002) + b
#グラフ表示範囲
plt.xlim(0,1.2)
plt.ylim(0,600)
#0.2%耐力直線
plt.scatter(x, y2, s=6, c="yellow") ##0.2%耐力要らない時はここを消す
x2 = df['strain_0.2%']
plt.scatter(x, y, s=6, c="black")
#交点の座標表示
idx = np.argwhere(np.diff(np.sign(y - y2))).flatten()
#交点の座標を書く
i=0
for i in idx.ravel(): #点が複数ある場合は、高い値を採用
x[i] = round(x[i],3)
y[i] = round(y[i],3)
plt.text(x[i], y[i] ,' ({x}, {y})'.format(x=x[i], y=y[i]), fontsize=10) ##0.2%耐力要らない時はここを消す
print('0.2%耐力',y[max(idx)])
#引張強さ
print('T.S = ' ,max(y))
#グラフの体裁
plt.tick_params(axis='both', direction='in',pad=10)
plt.ylabel('Stress, σ/MPa',fontsize=20)
plt.xlabel('Strain, ε',fontsize=20)
plt.tick_params(labelsize=20)
#グラフの保存
plt.savefig(root+".png")
#グラフの表示
plt.show()
表示されるグラフ
0.2%耐力を求める範囲(確認用)
弾性域の範囲を入力しておくと、その部分の傾きを求めてそこからひずみ0.2%平行移動する。弾性域をアップした図
応力-ひずみ曲線(保存)
応力-ひずみ曲線に0.2%耐力直線(?)を重ね、0.2%耐力の値をプロットした図。
応力-ひずみ曲線のみ表示したい場合は、
##0.2%耐力要らない時はここを消す
こんなところかな。お疲れ様でした。ひずみはパーセント表示ではないので、気を付けてください。
最後に
Pythonとやらを始めて1カ月も経ってない超初心者が作ったコードなので、色々と粗いところがあると思います。インポートする必要のないものまでインポートしてたり...