3
3

More than 3 years have passed since last update.

[材料系学生必見!]応力-ひずみ曲線をPythonで作成してみた

Posted at

はじめに

初投稿記事です。暖かい目でご覧あれ。
凄いデータ量の引張試験結果を、エクセルで処理するの面倒だったので作りました。
今回のコードを走らせることで、一発で応力ひずみ曲線を作成します。

環境

  • 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,

エッジ部の寸法

図1.png

寸法は、引張試験前にノギスやらマイクロメーターで測定しておいてください。

この図に示した長さ、幅、厚さを使って荷重(試験力)と変位(ストローク)から応力、ひずみに変換します。

コード


#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%平行移動する。弾性域をアップした図
Figure_1.png

応力-ひずみ曲線(保存)

応力-ひずみ曲線に0.2%耐力直線(?)を重ね、0.2%耐力の値をプロットした図。
Figure_2.png

応力-ひずみ曲線のみ表示したい場合は、

##0.2%耐力要らない時はここを消す

と書いてある行を、消してくれ!(突然のキャラ変)
Figure_3.png

こんなところかな。お疲れ様でした。ひずみはパーセント表示ではないので、気を付けてください。

最後に

Pythonとやらを始めて1カ月も経ってない超初心者が作ったコードなので、色々と粗いところがあると思います。インポートする必要のないものまでインポートしてたり...

参考にした記事

Qiita Markdown 書き方 まとめ

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3