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


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

## 引張試験とは
材料の強度評価試験です。材料が硬いかどうか分かる比較的簡単な試験方法として、広く使われています。そこから得られる荷重、変位の変化から応力とひずみの変化に変換後、応力―ひずみ曲線(S-S カーブ)を作成します。

##この記事って...
専門用語等の詳しい説明については割愛しています。材料系の学生に少しでもサボってほしい！そういう記事です。

材料系の方以外で、勉強したい方は↓
[引張試験- Wikipedia](https://ja.wikipedia.org/wiki/%E5%BC%95%E5%BC%B5%E8%A9%A6%E9%A8%93#:~:text=%E5%BC%95%E5%BC%B5%E8%A9%A6%E9%A8%93%EF%BC%88%E3%81%B2%E3%81%A3%E3%81%B1%E3%82%8A%E3%81%97%E3%81%91%E3%82%93%EF%BC%89%E3%81%A8,%E8%A8%88%E7%AE%97%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82)

Anacondaダウンロードしてない方は↓
[1．Anacondaダウンロード・インストール・設定 - Qiita](https://qiita.com/PoodleMaster/items/1134acb2bd1d68bfe2ec)

## 準備するもの
- 引張試験結果(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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178818/190e22bb-5c49-b926-e849-a70a6dff80ed.png)

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

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

## コード
```Python

#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178818/fb0a05b0-b996-ceae-6d33-e8b9516678ba.png)

### 応力-ひずみ曲線(保存)
応力-ひずみ曲線に0.2%耐力直線(？)を重ね、0.2%耐力の値をプロットした図。
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178818/8c9d837b-ea59-397f-8386-677d77526bef.png)

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

```
##0.2%耐力要らない時はここを消す
```
と書いてある行を、消してくれ！(突然のキャラ変)
![Figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178818/0c2f119a-bdc2-5305-c7a6-3fc39c529449.png)


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


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

## 参考にした記事
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)