橋を渡るとき、「この橋は自分の体重で崩れないだろうか」と心配する人は少ないでしょう。しかし、橋が崩れないのはなぜでしょうか。同じ 100 kg の荷重でも、太い鉄骨と細い針金では結果がまったく異なります。また、同じ力でゴムを引っ張った場合と鉄を引っ張った場合では、変形量が桁違いに違います。この「力の伝わり方」と「変形の程度」を定量的に記述するために生まれた概念が、応力(stress)とひずみ(strain)です。
応力とひずみを正しく理解すると、以下のような幅広い分野で活用できます。
- 土木・建築設計: 橋梁やビルの構造部材が設計荷重に耐えられるかを判定する際、各部材に生じる応力が材料の許容応力以下であることを確認します
- 航空宇宙: 航空機の翼やロケットの機体は極限の軽量化が求められるため、応力とひずみの解析なしには安全な設計が成り立ちません
- 自動車産業: 衝突安全性の評価では、車体各部の応力分布とひずみの進展をシミュレーションで予測します
- 材料開発: 新しい合金や複合材料の性能評価は、引張試験で応力-ひずみ曲線を測定することから始まります
本記事では、「力を面積で割る」という応力の本質的な意味から出発し、ひずみの定義、応力-ひずみ曲線の物理的な読み方、そして3次元の応力テンソルまでを、Python による可視化を交えながら丁寧に解説します。
本記事の内容
- 応力の定義と直感的な理解(垂直応力とせん断応力)
- ひずみの定義(線ひずみとせん断ひずみ、工学ひずみと真ひずみ)
- ポアソン比の物理的意味
- 応力-ひずみ曲線の各領域と材料特性の読み方
- 応力テンソルとひずみテンソルの必要性
- Pythonによる応力-ひずみ曲線の描画、材料比較、モールの応力円
前提知識
この記事を読む前に、以下の記事に目を通しておくと理解がスムーズです。
- ニュートンの運動法則 — 力の基本的な定義と単位
- フックの法則と弾性係数 — ばねの法則から弾性体の構成則へ
応力とは — 物体内部の「力の密度」
直感的な理解
応力を理解するために、まずは身近な例から考えてみましょう。
あなたが雪の上を歩くことを想像してください。普通の靴で歩くと、足が雪に深くめり込んでしまいます。ところが、スノーシュー(かんじき)を履くと、同じ体重でも雪の上をほとんど沈まずに歩けます。体重(力)は変わらないのに、結果が異なるのはなぜでしょうか。
答えは「力が分散される面積が違う」ことにあります。普通の靴では体重が小さな面積に集中しますが、スノーシューでは広い面積に分散されます。この「単位面積あたりの力」こそが応力の本質です。
もう一つ例を挙げましょう。画鋲を指で壁に押し込むとき、画鋲の頭側(面積が大きい)を押す指はほとんど痛くありませんが、先端が刺さる壁側では小さな面積に力が集中して、壁に穴が開きます。同じ力でも、面積が小さいほど「破壊力」が大きくなります。
このように、構造物の安全性を評価するときに重要なのは、力そのものではなく、単位面積あたりの力です。この量を応力(stress)と呼びます。
ここで「圧力と何が違うのか」と疑問に思う方もいるかもしれません。圧力(pressure)は流体が面に及ぼす力を面積で割ったものであり、常に面に垂直で、かつスカラー量です。一方、応力は固体内部に生じる力であり、面に垂直な成分だけでなく面に平行な成分(せん断応力)も持ちます。さらに、応力は後述するように方向に依存するテンソル量です。圧力は応力の特殊な場合(等方的な垂直応力のみの状態)と捉えることができます。
応力ベクトルの数学的定義
応力の直感をつかんだところで、数学的な定義に進みましょう。物体内部の任意の点で仮想的な断面を考え、その微小面積 $\Delta A$ に作用する内力を $\Delta \bm{F}$ とします。このとき、応力ベクトル(traction vector)$\bm{t}$ は次のように定義されます。
$$ \begin{equation} \bm{t} = \lim_{\Delta A \to 0} \frac{\Delta \bm{F}}{\Delta A} \end{equation} $$
この式は、「面積を限りなく小さくしたときの力の密度」を求めていることを意味します。重要なのは、応力ベクトル $\bm{t}$ は切断面の向きに依存するということです。同じ点でも、切断面の法線方向を変えると、異なる応力ベクトルが得られます。この方向依存性こそが、応力を単純なスカラーやベクトルではなく、テンソルで記述しなければならない根本的な理由です(詳しくは後のセクションで解説します)。
応力ベクトルの単位は $\text{N}/\text{m}^2 = \text{Pa}$(パスカル)です。工学の現場では、パスカルは非常に小さい単位なので、以下の単位がよく使われます。
| 単位 | 換算 | 使用例 |
|---|---|---|
| kPa | $10^3$ Pa | 地盤工学での土圧 |
| MPa | $10^6$ Pa | 構造材料の応力(1 MPa = 1 N/mm²) |
| GPa | $10^9$ Pa | ヤング率(鋼:200 GPa) |
例えば、断面積 $A = 100 \, \text{mm}^2$ の鋼棒に $F = 10{,}000 \, \text{N}$(約1トンの重さ)の引張力がかかるとき、応力は $\sigma = F/A = 10{,}000 / 100 = 100 \, \text{MPa}$ となります。軟鋼の降伏応力は約 250 MPa なので、この荷重では弾性域に収まっていることがわかります。
応力ベクトルが定義できたところで、次に、このベクトルを面に対して垂直な成分と平行な成分に分解しましょう。
垂直応力(Normal stress)
断面の法線方向に作用する応力成分を垂直応力と呼び、記号 $\sigma$ で表します。面に垂直な力 $F$ が断面積 $A$ に均一に分布していると仮定すると、次のように書けます。
$$ \begin{equation} \sigma = \frac{F}{A} \end{equation} $$
垂直応力は、物体を引き伸ばす方向に作用する場合と、押しつぶす方向に作用する場合があります。
- 引張応力(tensile stress, $\sigma > 0$): ロープを引っ張るとき、ロープ内部の各断面には引き離そうとする力が働きます。これが引張応力です
- 圧縮応力(compressive stress, $\sigma < 0$): 柱がビルの荷重を支えるとき、柱内部の各断面には押しつぶそうとする力が働きます。これが圧縮応力です
符号の取り方として、引張を正、圧縮を負とするのが一般的な慣例です。ただし、土質力学など一部の分野では圧縮を正とすることがあるため、文脈に応じた注意が必要です。
垂直応力が「物体を引き伸ばすか押しつぶすか」という変形モードを記述するのに対して、もう一つ重要な変形モードがあります。それは、物体を「ずらす」ように作用する力です。
せん断応力(Shear stress)
断面に平行に作用する応力成分をせん断応力と呼び、記号 $\tau$ で表します。
$$ \begin{equation} \tau = \frac{F_s}{A} \end{equation} $$
ここで $F_s$ は面に平行な力です。
せん断応力の身近な例を挙げましょう。トランプのカードの束を想像してください。束の上面を横方向にずらすと、カードとカードの間に滑りが生じて、束全体が平行四辺形のように変形します。このとき、各カード面に平行に作用している力がせん断力であり、その力を面積で割ったものがせん断応力です。
もう一つの例として、ハサミ(英語で scissors=「せん断するもの」)で紙を切る場面を考えましょう。ハサミの2枚の刃は、紙の同一断面に対して逆方向の力を与えます。この「ずらし力」がまさにせん断力です。
工学的な場面では、ボルトの接合部にせん断応力が生じます。2枚の板をボルトで締結し、板を引っ張ると、ボルトの軸には板と板の境界面でせん断力が作用します。ボルトの設計では、このせん断応力がボルト材料のせん断強度を超えないことを確認する必要があります。
せん断応力 の記事では、梁に生じるせん断応力の分布についてさらに詳しく解説しています。
ここまでで、応力の基本概念を学びました。応力が「力の密度」であることを押さえた上で、次は「変形の程度」を定量化するひずみの概念に進みましょう。応力が「原因」だとすれば、ひずみは「結果」に相当します。
ひずみとは — 変形を「割合」で測る
直感的な理解
1 m のゴムひもを 1 cm 伸ばすのと、10 cm のゴムひもを 1 cm 伸ばすのでは、どちらが「大きな変形」でしょうか。絶対的な伸び量はどちらも 1 cm ですが、元の長さに対する割合を考えると、前者は 1%、後者は 10% です。材料の変形を評価する際には、絶対量ではなく元の寸法に対する割合が本質的に重要です。
この「元の長さに対する変形の割合」がひずみ(strain)です。ひずみを使うことで、大きさの異なる試験片のデータを公平に比較できます。長さ 100 mm の試験片が 0.5 mm 伸びた場合も、長さ 200 mm の試験片が 1.0 mm 伸びた場合も、どちらもひずみは 0.5% であり、同じ変形状態にあると判断できます。
線ひずみ(垂直ひずみ, Normal strain)
元の長さ $L_0$ の棒が外力を受けて $\Delta L$ だけ伸びた(または縮んだ)とき、線ひずみ(normal strain)$\varepsilon$ は次のように定義されます。
$$ \begin{equation} \varepsilon = \frac{\Delta L}{L_0} = \frac{L – L_0}{L_0} \end{equation} $$
ここで $L$ は変形後の長さです。ひずみは長さを長さで割った量なので無次元量(単位なし)です。値が小さいため、% やマイクロストレイン($\mu\varepsilon = 10^{-6}$)で表すこともあります。引張によるひずみは正、圧縮によるひずみは負です。
軸力と棒の伸び では、棒部材に軸力が作用したときの伸び量の計算方法を詳しく解説しています。
工学ひずみと真ひずみ
上で定義したひずみは、正確には工学ひずみ(engineering strain, 公称ひずみ)と呼ばれます。工学ひずみは元の長さ $L_0$ を基準とするため、計算が単純で広く使われます。しかし、大変形の場合にはもう一つの定義が必要になります。
変形が連続的に進行する過程を考えましょう。微小な変形ステップごとに、「その時点の長さ」を基準としてひずみの増分を計算し、それらを積分したものが真ひずみ(true strain, 対数ひずみ)です。
$$ \begin{equation} \varepsilon_t = \int_{L_0}^{L} \frac{dL’}{L’} = \ln\frac{L}{L_0} \end{equation} $$
この積分の意味を丁寧に見てみましょう。いま、棒が長さ $L’$ の状態から微小量 $dL’$ だけ伸びたとき、その瞬間のひずみ増分は $d\varepsilon = dL’ / L’$ です。これは「いまの長さ」を基準とした瞬間的なひずみです。この微小ひずみ増分を、初期状態 $L_0$ から最終状態 $L$ まで積分すると、自然対数が現れます。
工学ひずみ $\varepsilon_e$ との関係は次の通りです。
$$ \begin{equation} \varepsilon_t = \ln(1 + \varepsilon_e) \end{equation} $$
$\varepsilon_e \ll 1$(微小変形)の場合、$\ln(1 + x) \approx x$ の近似が使えるため、$\varepsilon_t \approx \varepsilon_e$ となり、両者の区別は不要です。しかし、金属の塑性加工やゴムの大変形を扱う場合には、真ひずみを用いる方が物理的に適切です。
真ひずみの利点は加法性にあります。棒をまず $L_0 \to L_1$ に伸ばし、次に $L_1 \to L_2$ に伸ばした場合、真ひずみは $\ln(L_1/L_0) + \ln(L_2/L_1) = \ln(L_2/L_0)$ と単純に足し合わせられます。工学ひずみにはこの性質がありません。
せん断ひずみ(Shear strain)
せん断応力に対応する変形を表すのがせん断ひずみです。先ほどのトランプの束の例で、束の上面が横方向にずれた量を $\delta$、束の高さを $h$ とすると、せん断ひずみ $\gamma$ は次のように定義されます。
$$ \begin{equation} \gamma = \tan\phi \approx \phi \quad (\text{微小変形の場合}) \end{equation} $$
ここで $\phi$ はもともと直角だった角が変形によって変化した量(ラジアン)です。微小変形では $\tan\phi \approx \phi$ と近似できるため、せん断ひずみは角度変化そのもので表されます。
せん断ひずみも無次元量であり、物体の形状変化(角度変化)を表す量です。これに対して、先ほどの線ひずみは物体の寸法変化(長さの変化)を表す量です。
ポアソン比 — 引っ張ると横が縮む
ゴムひもを引っ張ると、長手方向に伸びると同時に、横方向(断面方向)が細くなることに気づくでしょう。この現象はゴムだけでなく、ほぼすべての材料で観測されます。
ポアソン比(Poisson’s ratio)$\nu$ は、縦方向のひずみに対する横方向のひずみの比を表す量です。
$$ \begin{equation} \nu = -\frac{\varepsilon_{\text{横}}}{\varepsilon_{\text{縦}}} \end{equation} $$
マイナスの符号が付いている理由は、引張($\varepsilon_{\text{縦}} > 0$)のとき横方向は縮む($\varepsilon_{\text{横}} < 0$)ため、ポアソン比が正の値になるようにするためです。
代表的な材料のポアソン比を見てみましょう。
| 材料 | ポアソン比 $\nu$ | 特徴 |
|---|---|---|
| コルク | $\approx 0$ | 横方向にほとんど変形しない。ワインの栓に最適 |
| 鋼 | $\approx 0.3$ | 多くの金属の典型的な値 |
| アルミニウム | $\approx 0.33$ | |
| ゴム | $\approx 0.5$ | 非圧縮性の理論的上限値 |
ポアソン比の理論的な範囲は、等方性材料の場合 $-1 \leq \nu \leq 0.5$ です。$\nu = 0.5$ は体積が変化しない(非圧縮性)材料を意味します。負のポアソン比を持つ材料(オーセティック材料)は、引っ張ると横方向にも広がるという特異な性質を持ち、近年の材料科学で注目されています。
ヤング率・ポアソン比 の記事では、これらの弾性定数のさらに詳しい解説と、相互の関係式を扱っています。
ここまでで、応力とひずみの基本的な定義が揃いました。では、材料に荷重を加えていったとき、応力とひずみはどのような関係で変化するのでしょうか。次のセクションでは、材料試験(引張試験)で得られる応力-ひずみ曲線を詳しく読み解いていきます。
応力とひずみの関係 — フックの法則
ばねのアナロジーから弾性体へ
ばねを引っ張ると、力に比例して伸びます。これがフックの法則 $F = kx$ です。この法則は、ばねだけでなく固体材料にもそのまま拡張できます。ただし、力 $F$ の代わりに応力 $\sigma$ を、伸び $x$ の代わりにひずみ $\varepsilon$ を用います。
$$ \begin{equation} \sigma = E \varepsilon \end{equation} $$
この比例定数 $E$ がヤング率(Young’s modulus, 弾性係数, 縦弾性係数)です。ヤング率は「材料の硬さ」を表す量であり、応力-ひずみ曲線の弾性域における傾きに相当します。
ヤング率の値をいくつかの材料で比較してみましょう。
| 材料 | ヤング率 $E$ [GPa] | 降伏応力 $\sigma_y$ [MPa] | 密度 [kg/m³] |
|---|---|---|---|
| ダイヤモンド | 1,050 | — | 3,510 |
| 鋼 | 200 | 250–1,000 | 7,850 |
| チタン合金 | 110 | 800–1,200 | 4,430 |
| アルミ合金 | 70 | 100–500 | 2,700 |
| ガラス | 70 | —(脆性破壊) | 2,500 |
| CFRP | 130–200 | —(層間はく離で破壊) | 1,600 |
| ゴム | 0.01–0.1 | — | 1,100 |
鋼のヤング率 200 GPa は「1 mm² の断面積の鋼線に 200,000 N の力をかけると、ひずみが 1(つまり元の長さの 2 倍に伸びる)」ことを意味しますが、もちろん実際にはそれよりはるかに小さなひずみで降伏・破断してしまいます。ヤング率はあくまで弾性域の傾きを外挿した値です。
同様に、せん断応力とせん断ひずみの間にもフックの法則が成り立ちます。
$$ \begin{equation} \tau = G \gamma \end{equation} $$
ここで $G$ はせん断弾性係数(横弾性係数, 剛性率)です。等方性材料では、ヤング率 $E$、ポアソン比 $\nu$、せん断弾性係数 $G$ の間に以下の関係が成り立ちます。
$$ \begin{equation} G = \frac{E}{2(1 + \nu)} \end{equation} $$
この関係式の導出については フックの法則と弾性係数 で詳しく解説しています。
フックの法則が成り立つのは弾性域(応力を除くと元の形に戻る範囲)に限られます。では、弾性域を超えるとどうなるのでしょうか。次のセクションでは、材料に荷重を加え続けたときに応力とひずみがたどる全体像を、応力-ひずみ曲線として見ていきます。
応力-ひずみ曲線 — 材料の「履歴書」を読む
引張試験とは
材料の力学的性質を調べる最も基本的な試験が引張試験(tensile test)です。引張試験では、規定の形状に加工した試験片を万能試験機にセットし、一定速度で引っ張りながら、荷重と伸びを連続的に測定します。得られたデータから応力とひずみを計算し、横軸にひずみ、縦軸に応力をプロットしたものが応力-ひずみ曲線(stress-strain curve)です。
応力-ひずみ曲線は、いわば材料の「履歴書」です。この曲線一枚から、材料がどれだけ硬いか(ヤング率)、どこで壊れ始めるか(降伏応力)、どこまで耐えられるか(引張強さ)、どれだけ粘り強いか(延性)といった情報を一度に読み取ることができます。
応力-ひずみ曲線 の記事では、さまざまな材料の応力-ひずみ曲線をさらに詳しく比較しています。
典型的な軟鋼の応力-ひずみ曲線
軟鋼(低炭素鋼)の応力-ひずみ曲線は、最も典型的で教育的な例です。以下の各領域を順番に見ていきましょう。
1. 弾性域(Elastic region)
原点から比例限度までの直線領域です。この範囲では応力とひずみが線形に比例し、フックの法則 $\sigma = E\varepsilon$ が成り立ちます。荷重を取り除くと、変形は完全に元に戻ります。ばねを伸ばして手を離すと元に戻るのと同じ原理です。弾性域のひずみは非常に小さく、軟鋼の場合 0.1–0.2% 程度です。
構造設計では、通常この弾性域内で部材が使用されるように設計します。これが「安全設計」の基本思想です。
2. 比例限度(Proportional limit)と弾性限度(Elastic limit)
比例限度は、応力-ひずみ関係が直線から外れ始める点です。弾性限度は、荷重除去後に変形が完全に回復する上限です。両者は厳密には異なりますが、多くの実用的な場面ではほぼ同じ値として扱われます。
3. 降伏点(Yield point)
降伏点は、材料が塑性変形(永久変形)を始める点です。ここを超えると、荷重を除去しても変形が完全には元に戻りません。軟鋼では、上降伏点と下降伏点が観測されることがあり、降伏応力 $\sigma_y$ は下降伏点の値を採用するのが一般的です。
降伏点は構造設計における最も重要なパラメータの一つです。許容応力を降伏応力に安全率で割った値に設定することで、構造物が塑性変形を起こさないように設計します。
4. 降伏プラトー(Yield plateau)
軟鋼に特徴的な現象で、降伏点に達すると、応力がほぼ一定のまましばらくひずみだけが増加する領域が現れます。これは、結晶内部の転位が一気に動き出すことに対応しています。降伏プラトーは軟鋼に特有のもので、アルミ合金やチタン合金では観察されません。
5. 加工硬化域(Strain hardening region)
降伏プラトーを過ぎると、応力は再び上昇します。これは加工硬化(ひずみ硬化)と呼ばれる現象で、塑性変形が進むにつれて転位同士が絡まり合い、さらなる変形に対する抵抗が増すことが原因です。加工硬化域の応力-ひずみ関係は非線形であり、しばしばべき乗硬化則 $\sigma = K\varepsilon_p^n$ でモデル化されます。
6. 引張強さ(Ultimate Tensile Strength, UTS)
応力-ひずみ曲線の最大応力を引張強さ $\sigma_{\text{UTS}}$ と呼びます。この点を超えると、試験片に局所的な断面積の減少(くびれ)が発生します。
7. ネッキング(Necking)と破断(Fracture)
引張強さを超えると、試験片の一部分で断面積が急激に減少するネッキングが始まります。工学応力(元の断面積で計算した応力)は見かけ上低下しますが、真応力(実際の断面積で計算した応力)は増加し続けています。最終的に、ネッキング部で材料が破壊に至ります。
軟鋼のような材料(延性材料)は、大きなひずみを伴って破壊します。一方、ガラスやセラミックスのような脆性材料は、ほとんど塑性変形を起こさずに突然破壊します。
Pythonで軟鋼の応力-ひずみ曲線を描く
それでは、上で説明した軟鋼の応力-ひずみ曲線をPythonで描いてみましょう。弾性域、降伏プラトー、加工硬化域、ネッキング・破断までの各段階をモデル化します。
import numpy as np
import matplotlib.pyplot as plt
def mild_steel_stress_strain():
"""軟鋼の応力-ひずみ曲線をモデル化"""
E = 200e3 # ヤング率 [MPa]
sigma_y = 250 # 降伏応力 [MPa]
eps_y = sigma_y / E # 降伏ひずみ
# (1) 弾性域: フックの法則 sigma = E * epsilon
eps1 = np.linspace(0, eps_y, 100)
sig1 = E * eps1
# (2) 降伏プラトー: 応力一定のまま、ひずみが増加
eps2 = np.linspace(eps_y, 0.02, 50)
sig2 = np.ones_like(eps2) * sigma_y
# (3) 加工硬化域: べき乗硬化則でモデル化
K = 600 # 強度係数 [MPa]
n = 0.2 # 加工硬化指数
eps3 = np.linspace(0.02, 0.25, 200)
sig3 = sigma_y + K * (eps3 - 0.02) ** n
# (4) ネッキング後: 工学応力が低下し破断に至る
eps4 = np.linspace(0.25, 0.35, 50)
sig4_max = sig3[-1]
sig4 = sig4_max - 300 * (eps4 - 0.25) ** 1.5
# 全体を連結
eps = np.concatenate([eps1, eps2, eps3, eps4])
sig = np.concatenate([sig1, sig2, sig3, sig4])
return eps, sig, eps_y, sigma_y
eps, sig, eps_y, sigma_y = mild_steel_stress_strain()
fig, ax = plt.subplots(figsize=(10, 7))
ax.plot(eps * 100, sig, 'b-', linewidth=2.5, label='軟鋼')
# 特徴的な点をマーク
idx_uts = np.argmax(sig)
ax.plot(eps_y * 100, sigma_y, 'ro', markersize=10,
label=f'降伏点 ({eps_y*100:.3f}%, {sigma_y} MPa)')
ax.plot(eps[idx_uts] * 100, sig[idx_uts], 'g^', markersize=10,
label=f'引張強さ ({sig[idx_uts]:.0f} MPa)')
# 弾性域の傾き(ヤング率)を延長線で表示
ax.plot([0, eps_y * 100 * 2.5], [0, sigma_y * 2.5],
'r--', alpha=0.3, linewidth=1.5)
ax.annotate('E = 200 GPa', xy=(eps_y * 50, sigma_y * 0.5),
fontsize=12, color='red', rotation=70)
# 各領域のラベル
ax.annotate('弾性域', xy=(eps_y * 50, 100), fontsize=11,
ha='center', style='italic')
ax.annotate('降伏\nプラトー', xy=(1.1, 220), fontsize=11,
ha='center', style='italic')
ax.annotate('加工硬化域', xy=(12, 340), fontsize=11,
ha='center', style='italic')
ax.annotate('ネッキング', xy=(30, 370), fontsize=11,
ha='center', style='italic')
ax.annotate('破断', xy=(35, sig[-1] - 20), fontsize=11,
ha='center', color='red', fontweight='bold')
ax.set_xlabel('ひずみ ε [%]', fontsize=14)
ax.set_ylabel('応力 σ [MPa]', fontsize=14)
ax.set_title('軟鋼の応力-ひずみ曲線(工学応力-工学ひずみ)', fontsize=16)
ax.legend(fontsize=11, loc='upper left')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 40)
ax.set_ylim(0, 500)
plt.tight_layout()
plt.show()
このグラフからは、軟鋼の応力-ひずみ曲線に見られる4つの特徴的な領域がはっきりと確認できます。まず、原点付近の急な立ち上がり(弾性域)はヤング率 200 GPa に対応しており、非常に急勾配です。弾性域のひずみはわずか 0.125%(= 250 MPa / 200,000 MPa)であることから、金属材料の弾性変形がいかに微小かがわかります。降伏プラトーの水平部分は、応力が変化せずにひずみだけが進行する軟鋼特有の挙動を再現しています。加工硬化域ではべき乗則に従って応力が緩やかに上昇し、ネッキング後は工学応力が低下に転じて破断に至ります。
各種材料の弾性域を比較する
材料ごとにヤング率(弾性域の傾き)がどれだけ異なるかを視覚的に比較してみましょう。
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# --- 左パネル: 金属材料の弾性域比較 ---
materials_metal = {
'鋼 (E=200 GPa)': {'E': 200e3, 'eps_max': 0.003, 'color': '#1f77b4'},
'チタン合金 (E=110 GPa)': {'E': 110e3, 'eps_max': 0.005, 'color': '#2ca02c'},
'アルミ合金 (E=70 GPa)': {'E': 70e3, 'eps_max': 0.005, 'color': '#d62728'},
'銅 (E=120 GPa)': {'E': 120e3, 'eps_max': 0.004, 'color': '#ff7f0e'},
}
for name, props in materials_metal.items():
eps = np.linspace(0, props['eps_max'], 200)
sig = props['E'] * eps
axes[0].plot(eps * 100, sig, linewidth=2.5,
color=props['color'], label=name)
axes[0].set_xlabel('ひずみ ε [%]', fontsize=12)
axes[0].set_ylabel('応力 σ [MPa]', fontsize=12)
axes[0].set_title('金属材料の弾性域比較', fontsize=14)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].set_xlim(0, 0.55)
axes[0].set_ylim(0, 700)
# --- 右パネル: 金属 vs ゴムの広いひずみ範囲 ---
eps_steel = np.linspace(0, 0.002, 200)
sig_steel = 200e3 * eps_steel
axes[1].plot(eps_steel * 100, sig_steel, 'b-', linewidth=2.5,
label='鋼 (E=200 GPa)')
eps_rubber = np.linspace(0, 3.0, 200)
sig_rubber = 2.0 * eps_rubber # ゴムのヤング率 ≈ 数 MPa
axes[1].plot(eps_rubber * 100, sig_rubber, 'm-', linewidth=2.5,
label='ゴム (E≈0.002 GPa)')
axes[1].set_xlabel('ひずみ ε [%]', fontsize=12)
axes[1].set_ylabel('応力 σ [MPa]', fontsize=12)
axes[1].set_title('鋼 vs ゴム(スケールの違いに注目)', fontsize=14)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
axes[1].set_xlim(0, 320)
axes[1].set_ylim(0, 450)
plt.tight_layout()
plt.show()
左パネルのグラフからは、同じひずみ 0.5% でも、鋼では 1,000 MPa(= 200 GPa × 0.005)もの応力が発生するのに対し、アルミ合金では 350 MPa に留まることが読み取れます。傾きの違いがヤング率の違いを直接反映しています。右パネルでは鋼とゴムを同一グラフに載せています。ゴムのヤング率は鋼のおよそ 10 万分の 1 であるため、同じ応力を発生させるのに必要なひずみが桁違いに大きいことが一目でわかります。鋼が 0.2% のひずみで 400 MPa に達するのに対し、ゴムは 300% 伸ばしても数 MPa にしかなりません。この違いが、ゴムは衝撃吸収に、鋼は構造支持に適している理由です。
ポアソン効果の可視化
引張によって縦方向に伸びると同時に横方向に縮むポアソン効果を、視覚的に確認してみましょう。
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# --- 左パネル: 変形の模式図 ---
L0, W0 = 4, 2 # 元の寸法(縦, 横)
nu = 0.3 # ポアソン比(鋼)
strains = [0, 0.05, 0.10, 0.15, 0.20]
colors = plt.cm.Blues(np.linspace(0.2, 0.9, len(strains)))
for i, eps in enumerate(strains):
L = L0 * (1 + eps)
W = W0 * (1 - nu * eps)
rect = plt.Rectangle((-L/2, -W/2), L, W,
fill=True, facecolor=colors[i],
edgecolor='black', linewidth=1.5, alpha=0.7)
axes[0].add_patch(rect)
axes[0].text(L/2 + 0.1, 0, f'ε = {eps:.0%}', fontsize=10, va='center')
axes[0].set_xlim(-3.0, 4.5)
axes[0].set_ylim(-1.8, 1.8)
axes[0].set_aspect('equal')
axes[0].set_title(f'ポアソン効果の模式図(ν = {nu})', fontsize=14)
axes[0].set_xlabel('引張方向', fontsize=12)
axes[0].set_ylabel('横方向', fontsize=12)
axes[0].grid(True, alpha=0.3)
# 矢印で引張方向を示す
axes[0].annotate('', xy=(3.5, 0), xytext=(2.8, 0),
arrowprops=dict(arrowstyle='->', color='red', lw=2))
axes[0].annotate('', xy=(-3.5, 0), xytext=(-2.8, 0),
arrowprops=dict(arrowstyle='->', color='red', lw=2))
# --- 右パネル: ポアソン比の影響の比較 ---
eps_range = np.linspace(0, 0.3, 100)
nu_values = [0.0, 0.2, 0.3, 0.5]
colors_nu = ['gray', 'blue', 'green', 'red']
for nu_val, c in zip(nu_values, colors_nu):
eps_lateral = -nu_val * eps_range
axes[1].plot(eps_range * 100, eps_lateral * 100,
linewidth=2, color=c, label=f'ν = {nu_val}')
axes[1].set_xlabel('縦ひずみ ε_縦 [%]', fontsize=12)
axes[1].set_ylabel('横ひずみ ε_横 [%]', fontsize=12)
axes[1].set_title('ポアソン比と横ひずみの関係', fontsize=14)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
左パネルの模式図では、ひずみが増加するにつれて、矩形が縦方向に伸びると同時に横方向に縮んでいく様子が段階的に表現されています。ポアソン比 $\nu = 0.3$ のとき、縦ひずみ 20% に対して横ひずみは $-0.3 \times 20\% = -6\%$ となり、かなり顕著な横方向の収縮が生じます。右パネルのグラフからは、ポアソン比が大きいほど同じ縦ひずみに対する横方向の収縮が大きいことが一目でわかります。$\nu = 0.5$(ゴムや非圧縮性流体に近い材料)では、体積がほぼ一定に保たれるため、縦方向の伸びが横方向の収縮としてそのまま現れます。一方、$\nu = 0$(コルクに近い材料)では横方向の変形がゼロで、これがコルクをワインの栓に使う理由です — 瓶の口に押し込んでも横に膨らまないため、簡単に挿入・引き抜きができます。
ここまでの議論では、1方向の引張試験を前提としてきました。しかし、現実の構造物では応力が1方向だけに作用することはまれです。橋の桁には曲げによる垂直応力とせん断応力が同時に作用し、圧力容器の壁には2方向の引張応力が作用します。このような多方向の応力状態を体系的に記述するために、次のセクションでは応力テンソルの概念を導入します。
3次元の応力状態 — なぜテンソルが必要か
テンソルの必要性
スカラーは「大きさだけ」の量(温度、圧力など)、ベクトルは「大きさと方向」の量(力、速度など)です。では、応力はどちらに分類されるでしょうか。
実は、応力はスカラーでもベクトルでもありません。応力は「面の向き」と「力の向き」という2つの方向に依存する量です。例えば、$x$ 軸に垂直な面に $y$ 方向に作用するせん断応力 $\tau_{xy}$ を完全に指定するには、「どの面に」「どの方向に」の2つの情報が必要です。このように2つの方向に依存する量を2階テンソルと呼びます。
物体内部の一点における応力状態を完全に記述するには、3つの座標面($x, y, z$ 軸に垂直な面)のそれぞれについて、3方向の応力成分を指定する必要があります。したがって、合計 $3 \times 3 = 9$ 個の成分が必要です。
応力テンソルの定義
3次元空間での応力状態は、以下のコーシー応力テンソル $\bm{\sigma}$ で表されます。
$$ \begin{equation} \bm{\sigma} = \begin{pmatrix} \sigma_{xx} & \tau_{xy} & \tau_{xz} \\ \tau_{yx} & \sigma_{yy} & \tau_{yz} \\ \tau_{zx} & \tau_{zy} & \sigma_{zz} \end{pmatrix} \end{equation} $$
各成分の意味を詳しく見ましょう。
- 対角成分 $\sigma_{xx}, \sigma_{yy}, \sigma_{zz}$: 各座標軸に垂直な面に作用する垂直応力です。$\sigma_{xx}$ は $x$ 軸に垂直な面に $x$ 方向に作用する応力を意味します
- 非対角成分 $\tau_{xy}, \tau_{xz}$ など: せん断応力です。$\tau_{xy}$ は $x$ 軸に垂直な面に $y$ 方向に作用するせん断応力を意味します
添え字の規則を覚えておきましょう。第1添え字が「面の法線方向」、第2添え字が「力の方向」を表します。
応力テンソルの対称性
一見すると独立な成分は9個ですが、実は角運動量の保存則から、応力テンソルは対称であることが証明されます。
$$ \tau_{xy} = \tau_{yx}, \quad \tau_{xz} = \tau_{zx}, \quad \tau_{yz} = \tau_{zy} $$
この対称性の物理的意味を考えてみましょう。微小な立方体要素を想像してください。もし $\tau_{xy} \neq \tau_{yx}$ であれば、この立方体にはネットの回転モーメントが作用し、角加速度が無限大になってしまいます(微小体積の慣性モーメントはサイズの5乗に比例するのに対し、トルクは3乗に比例するため)。これは物理的にあり得ないので、角運動量の保存から $\tau_{xy} = \tau_{yx}$ でなければなりません。
したがって、応力テンソルの独立な成分は $9 – 3 = 6$ 個です。具体的には、3つの垂直応力 $\sigma_{xx}, \sigma_{yy}, \sigma_{zz}$ と3つの独立なせん断応力 $\tau_{xy}, \tau_{xz}, \tau_{yz}$ です。
コーシーの公式 — 任意の面の応力を求める
応力テンソルが分かれば、物体内部の任意の向きの面に作用する応力ベクトルを計算できます。これがコーシーの公式です。
法線ベクトル $\bm{n} = (n_x, n_y, n_z)^T$ を持つ面上の応力ベクトル $\bm{t}$ は次のように求まります。
$$ \begin{equation} \bm{t} = \bm{\sigma} \cdot \bm{n} \end{equation} $$
成分で書くと、以下のようになります。
$$ \begin{pmatrix} t_x \\ t_y \\ t_z \end{pmatrix} = \begin{pmatrix} \sigma_{xx} & \tau_{xy} & \tau_{xz} \\ \tau_{yx} & \sigma_{yy} & \tau_{yz} \\ \tau_{zx} & \tau_{zy} & \sigma_{zz} \end{pmatrix} \begin{pmatrix} n_x \\ n_y \\ n_z \end{pmatrix} $$
例えば、$x$ 軸に垂直な面($\bm{n} = (1, 0, 0)^T$)に対しては $\bm{t} = (\sigma_{xx}, \tau_{yx}, \tau_{zx})^T$ が得られ、直感通りの結果です。
コーシーの公式の重要な点は、応力テンソルさえ分かっていれば、任意の向きの面に作用する応力が行列とベクトルの積で求められることです。これが応力をテンソルで記述する最大の利点です。
主応力とモールの応力円
ある特別な面の向きを選ぶと、その面にはせん断応力が作用せず、垂直応力だけが作用する状態になります。この垂直応力を主応力(principal stress)、対応する面の法線方向を主応力方向と呼びます。
数学的には、主応力は応力テンソルの固有値として求められます。主応力 $\sigma_p$ と主応力方向 $\bm{n}_p$ は次の固有値問題の解です。
$$ \begin{equation} \bm{\sigma} \cdot \bm{n}_p = \sigma_p \bm{n}_p \end{equation} $$
この式は「ある方向 $\bm{n}_p$ について、応力ベクトルがその方向と同じ向きになる(つまりせん断成分がゼロ)」ことを意味しています。
2次元の応力状態の場合、主応力は以下の式で計算できます。
まず、2次元の応力状態 $\sigma_{xx}, \sigma_{yy}, \tau_{xy}$ が与えられているとします。主応力を求めるために、応力テンソルの固有値方程式を解きます。
$$ \begin{equation} \det(\bm{\sigma} – \sigma_p \bm{I}) = 0 \end{equation} $$
2次元の場合、この行列式を展開すると次のようになります。
$$ (\sigma_{xx} – \sigma_p)(\sigma_{yy} – \sigma_p) – \tau_{xy}^2 = 0 $$
展開して $\sigma_p$ について整理すると、2次方程式が得られます。
$$ \sigma_p^2 – (\sigma_{xx} + \sigma_{yy})\sigma_p + (\sigma_{xx}\sigma_{yy} – \tau_{xy}^2) = 0 $$
これを解の公式で解くと、2つの主応力が求まります。
$$ \begin{equation} \sigma_{1,2} = \frac{\sigma_{xx} + \sigma_{yy}}{2} \pm \sqrt{\left(\frac{\sigma_{xx} – \sigma_{yy}}{2}\right)^2 + \tau_{xy}^2} \end{equation} $$
この式の第1項 $(\sigma_{xx} + \sigma_{yy})/2$ は応力の平均値(応力円の中心)に対応し、第2項の平方根は応力円の半径に対応します。
モールの応力円(Mohr’s circle)は、2次元の応力変換を幾何学的に表現したものです。横軸に垂直応力 $\sigma$、縦軸にせん断応力 $\tau$ をとった平面上に円を描くことで、面の角度を変えたときの応力の変化を視覚的に把握できます。
主応力とモールの応力円 の記事では、モールの応力円の幾何学的な意味と具体的な計算方法をさらに詳しく解説しています。
応力テンソルの理解が深まったところで、次はひずみにも同様のテンソル表現があることを見ていきましょう。
ひずみテンソル
3次元のひずみ状態
応力と同様に、3次元のひずみ状態もテンソルで表されます。ひずみテンソル $\bm{\varepsilon}$ は次の形です。
$$ \begin{equation} \bm{\varepsilon} = \begin{pmatrix} \varepsilon_{xx} & \varepsilon_{xy} & \varepsilon_{xz} \\ \varepsilon_{yx} & \varepsilon_{yy} & \varepsilon_{yz} \\ \varepsilon_{zx} & \varepsilon_{zy} & \varepsilon_{zz} \end{pmatrix} \end{equation} $$
ここで、対角成分 $\varepsilon_{xx}, \varepsilon_{yy}, \varepsilon_{zz}$ は各方向の線ひずみ、非対角成分はせん断ひずみの半分に相当します。
変位ベクトル $\bm{u} = (u, v, w)^T$(各点の変形前後の位置の差)が分かっていれば、ひずみテンソルの各成分は変位の偏微分から求められます。
線ひずみ成分は次の通りです。
$$ \varepsilon_{xx} = \frac{\partial u}{\partial x}, \quad \varepsilon_{yy} = \frac{\partial v}{\partial y}, \quad \varepsilon_{zz} = \frac{\partial w}{\partial z} $$
せん断ひずみ成分は、対称性を保つために係数 $1/2$ を付けて次のように定義します。
$$ \varepsilon_{xy} = \frac{1}{2}\left(\frac{\partial u}{\partial y} + \frac{\partial v}{\partial x}\right), \quad \varepsilon_{xz} = \frac{1}{2}\left(\frac{\partial u}{\partial z} + \frac{\partial w}{\partial x}\right), \quad \varepsilon_{yz} = \frac{1}{2}\left(\frac{\partial v}{\partial z} + \frac{\partial w}{\partial y}\right) $$
ここで注意すべき点があります。工学で用いるせん断ひずみ $\gamma_{xy}$ と、テンソルのせん断成分 $\varepsilon_{xy}$ には $\gamma_{xy} = 2\varepsilon_{xy}$ の関係があります。これは、テンソルとしての対称性・変換則を保つために必要な係数です。
一般化フックの法則
等方性の弾性体では、応力テンソルとひずみテンソルの関係は一般化フックの法則で記述されます。
$$ \begin{equation} \varepsilon_{xx} = \frac{1}{E}\left[\sigma_{xx} – \nu(\sigma_{yy} + \sigma_{zz})\right] \end{equation} $$
$$ \begin{equation} \varepsilon_{yy} = \frac{1}{E}\left[\sigma_{yy} – \nu(\sigma_{xx} + \sigma_{zz})\right] \end{equation} $$
$$ \begin{equation} \varepsilon_{zz} = \frac{1}{E}\left[\sigma_{zz} – \nu(\sigma_{xx} + \sigma_{yy})\right] \end{equation} $$
$$ \begin{equation} \gamma_{xy} = \frac{\tau_{xy}}{G}, \quad \gamma_{xz} = \frac{\tau_{xz}}{G}, \quad \gamma_{yz} = \frac{\tau_{yz}}{G} \end{equation} $$
最初の3式は、$x$ 方向のひずみが $x$ 方向の応力 $\sigma_{xx}$ で直接生じるだけでなく、ポアソン効果により $y, z$ 方向の応力からも影響を受けることを表しています。$\nu$ が付いた項がポアソン効果による横方向からの寄与です。
この一般化フックの法則は、等方性弾性体の力学を扱う上での基礎方程式であり、有限要素法(FEM)などの数値解析でも中核的な役割を果たしています。
ここまでの理論をPythonで可視化し、より深い理解を目指しましょう。
Pythonによる応用的な可視化
モールの応力円の描画
2次元の応力変換をモールの応力円として可視化します。任意の2次元応力状態を入力すると、モールの応力円、主応力、最大せん断応力を自動計算・描画するコードを作成します。
import numpy as np
import matplotlib.pyplot as plt
def mohr_circle(sigma_xx, sigma_yy, tau_xy):
"""モールの応力円を描画する"""
# 応力円の中心と半径を計算
center = (sigma_xx + sigma_yy) / 2
radius = np.sqrt(((sigma_xx - sigma_yy) / 2) ** 2 + tau_xy ** 2)
# 主応力
sigma_1 = center + radius
sigma_2 = center - radius
# 主応力方向(反時計回りの角度)
theta_p = 0.5 * np.arctan2(2 * tau_xy, sigma_xx - sigma_yy)
# 最大せん断応力
tau_max = radius
# --- 描画 ---
fig, ax = plt.subplots(figsize=(9, 9))
# 応力円
theta = np.linspace(0, 2 * np.pi, 300)
circle_sigma = center + radius * np.cos(theta)
circle_tau = radius * np.sin(theta)
ax.plot(circle_sigma, circle_tau, 'b-', linewidth=2)
# 中心
ax.plot(center, 0, 'k+', markersize=15, markeredgewidth=2)
ax.annotate(f'C = ({center:.1f}, 0)',
xy=(center, 0), xytext=(center + radius * 0.2, -radius * 0.3),
fontsize=11, ha='left')
# 現在の応力状態(x面とy面)
ax.plot(sigma_xx, tau_xy, 'ro', markersize=10,
label=f'X面: (σ={sigma_xx:.1f}, τ={tau_xy:.1f})')
ax.plot(sigma_yy, -tau_xy, 'gs', markersize=10,
label=f'Y面: (σ={sigma_yy:.1f}, τ={-tau_xy:.1f})')
# X面とY面を結ぶ直線(極線)
ax.plot([sigma_xx, sigma_yy], [tau_xy, -tau_xy],
'k--', alpha=0.5, linewidth=1)
# 主応力をマーク
ax.plot(sigma_1, 0, 'r^', markersize=12,
label=f'σ₁ = {sigma_1:.1f} MPa')
ax.plot(sigma_2, 0, 'bv', markersize=12,
label=f'σ₂ = {sigma_2:.1f} MPa')
# 最大せん断応力をマーク
ax.plot(center, tau_max, 'mD', markersize=10,
label=f'τ_max = {tau_max:.1f} MPa')
ax.plot(center, -tau_max, 'mD', markersize=10)
# 軸と装飾
ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)
ax.set_xlabel('垂直応力 σ [MPa]', fontsize=13)
ax.set_ylabel('せん断応力 τ [MPa]', fontsize=13)
ax.set_title(f'モールの応力円\n'
f'(σ_xx={sigma_xx}, σ_yy={sigma_yy}, '
f'τ_xy={tau_xy} MPa)', fontsize=14)
ax.legend(fontsize=10, loc='upper left')
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
margin = radius * 0.5
ax.set_xlim(sigma_2 - margin, sigma_1 + margin)
ax.set_ylim(-radius - margin, radius + margin)
plt.tight_layout()
plt.show()
# 結果を表示
print(f"主応力: σ₁ = {sigma_1:.2f} MPa, σ₂ = {sigma_2:.2f} MPa")
print(f"主応力方向: θ_p = {np.degrees(theta_p):.2f}°")
print(f"最大せん断応力: τ_max = {tau_max:.2f} MPa")
# 具体例: 2軸応力状態
mohr_circle(sigma_xx=80, sigma_yy=40, tau_xy=30)
このモールの応力円のグラフからは、いくつかの重要な情報が読み取れます。円の中心 $C = (60, 0)$ は $(\sigma_{xx} + \sigma_{yy})/2 = (80 + 40)/2 = 60$ MPa に位置しています。赤い三角マーク($\sigma_1$)と青い逆三角マーク($\sigma_2$)が主応力で、円と横軸の交点に対応しています。紫色のダイヤモンドマークが最大せん断応力で、円の頂点に対応しています。また、赤丸(X面の応力状態)と緑の四角(Y面の応力状態)を結ぶ直線(極線)が円の中心を通ることが確認でき、これはモールの応力円の幾何学的性質に合致しています。
工学ひずみと真ひずみの比較
工学ひずみと真ひずみの違いを定量的に確認するコードを作成します。
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# --- 左パネル: 工学ひずみ vs 真ひずみ ---
eps_eng = np.linspace(0, 1.0, 500) # 工学ひずみ 0〜100%
eps_true = np.log(1 + eps_eng) # 真ひずみ
axes[0].plot(eps_eng * 100, eps_eng * 100, 'b-', linewidth=2,
label='工学ひずみ ε_e')
axes[0].plot(eps_eng * 100, eps_true * 100, 'r--', linewidth=2,
label='真ひずみ ε_t = ln(1 + ε_e)')
axes[0].fill_between(eps_eng * 100, eps_eng * 100, eps_true * 100,
alpha=0.15, color='purple', label='差分')
axes[0].set_xlabel('工学ひずみ ε_e [%]', fontsize=12)
axes[0].set_ylabel('ひずみ [%]', fontsize=12)
axes[0].set_title('工学ひずみと真ひずみの比較', fontsize=14)
axes[0].legend(fontsize=11)
axes[0].grid(True, alpha=0.3)
axes[0].set_xlim(0, 100)
axes[0].set_ylim(0, 100)
# --- 右パネル: 工学応力-ひずみ vs 真応力-ひずみ ---
# 軟鋼のモデル(簡略化)
E = 200e3
sigma_y = 250
eps_y = sigma_y / E
# 弾性域 + べき乗硬化で簡略モデル化
eps_e_model = np.linspace(0.001, 0.30, 500)
sig_e_model = np.where(
eps_e_model < eps_y,
E * eps_e_model,
sigma_y + 500 * (eps_e_model - eps_y) ** 0.25
)
# 真応力・真ひずみへの変換
eps_t_model = np.log(1 + eps_e_model)
sig_t_model = sig_e_model * (1 + eps_e_model)
axes[1].plot(eps_e_model * 100, sig_e_model, 'b-', linewidth=2,
label='工学応力-工学ひずみ')
axes[1].plot(eps_t_model * 100, sig_t_model, 'r--', linewidth=2,
label='真応力-真ひずみ')
axes[1].set_xlabel('ひずみ [%]', fontsize=12)
axes[1].set_ylabel('応力 [MPa]', fontsize=12)
axes[1].set_title('工学応力-ひずみ vs 真応力-ひずみ', fontsize=14)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
左パネルからは、工学ひずみが小さい(10% 以下)うちは両者の差がほとんどないことがわかります。しかし、工学ひずみが 50% を超えると差は顕著になり、100% の工学ひずみ(元の長さの2倍に伸びた状態)に対して真ひずみは $\ln 2 \approx 69.3\%$ にとどまります。紫色の塗り潰し領域が両者の差を視覚化しています。右パネルの応力-ひずみ曲線の比較では、真応力は工学応力に $(1 + \varepsilon_e)$ の補正がかかるため、大変形域では工学応力よりも常に大きな値を示しています。ネッキングが始まると工学応力は低下しますが、真応力は実際の断面積を基準としているため、破断直前まで上昇し続けます。この違いは、金属の塑性加工のシミュレーションにおいて重要です。
応力テンソルの固有値と主応力方向の可視化
3次元の応力テンソルに対して、主応力と主応力方向をNumPyの固有値計算で求めてみましょう。
import numpy as np
def analyze_stress_tensor(sigma_tensor):
"""応力テンソルの主応力と主応力方向を計算"""
# 固有値(主応力)と固有ベクトル(主応力方向)を計算
eigenvalues, eigenvectors = np.linalg.eigh(sigma_tensor)
# 主応力を大きい順にソート
idx = np.argsort(eigenvalues)[::-1]
principal_stresses = eigenvalues[idx]
principal_directions = eigenvectors[:, idx]
# 不変量の計算
I1 = np.trace(sigma_tensor)
I2 = (np.trace(sigma_tensor)**2
- np.trace(sigma_tensor @ sigma_tensor)) / 2
I3 = np.linalg.det(sigma_tensor)
# ミーゼス相当応力(降伏判定に使用)
s1, s2, s3 = principal_stresses
von_mises = np.sqrt(0.5 * ((s1 - s2)**2
+ (s2 - s3)**2
+ (s3 - s1)**2))
print("=" * 50)
print("応力テンソル解析結果")
print("=" * 50)
print(f"\n入力応力テンソル [MPa]:")
print(sigma_tensor)
print(f"\n主応力:")
print(f" σ₁ = {s1:.2f} MPa")
print(f" σ₂ = {s2:.2f} MPa")
print(f" σ₃ = {s3:.2f} MPa")
print(f"\n主応力方向(固有ベクトル):")
for i in range(3):
d = principal_directions[:, i]
print(f" n_{i+1} = ({d[0]:.4f}, {d[1]:.4f}, {d[2]:.4f})")
print(f"\n応力不変量:")
print(f" I₁ = {I1:.2f} MPa(トレース)")
print(f" I₂ = {I2:.2f} MPa²")
print(f" I₃ = {I3:.2f} MPa³(行列式)")
print(f"\nフォン・ミーゼス相当応力:")
print(f" σ_VM = {von_mises:.2f} MPa")
return principal_stresses, principal_directions, von_mises
# 具体例: ある点での応力テンソル
sigma = np.array([
[100, 40, 0],
[ 40, -50, 30],
[ 0, 30, 20]
], dtype=float)
stresses, directions, vm = analyze_stress_tensor(sigma)
このコードでは、NumPyの linalg.eigh(対称行列用の固有値ソルバー)を用いて、応力テンソルの主応力と主応力方向を計算しています。さらに、応力の不変量($I_1, I_2, I_3$)とフォン・ミーゼス相当応力も計算しています。応力不変量は座標系の取り方によらず一定の値をとる量であり、材料の降伏判定などで重要な役割を果たします。特にフォン・ミーゼス相当応力は、金属材料の降伏判定で最も広く使われている基準であり、この値が降伏応力を超えると材料が塑性変形を開始すると判断します。出力結果から、主応力の最大値と最小値の差が材料の破壊を支配する要因であることが読み取れます。
延性材料と脆性材料の応力-ひずみ曲線比較
最後に、延性材料(軟鋼、アルミ合金)と脆性材料(鋳鉄、セラミックス)の応力-ひずみ曲線を比較するコードを作成します。材料によって破壊挙動がまったく異なることを視覚的に確認しましょう。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(11, 7))
# --- 軟鋼: 延性材料の代表 ---
E_steel = 200e3
sy_steel = 250
eps_y_steel = sy_steel / E_steel
eps_steel_e = np.linspace(0, eps_y_steel, 80)
sig_steel_e = E_steel * eps_steel_e
eps_steel_p = np.linspace(eps_y_steel, 0.02, 40)
sig_steel_p = sy_steel * np.ones_like(eps_steel_p)
eps_steel_h = np.linspace(0.02, 0.28, 150)
sig_steel_h = sy_steel + 550 * (eps_steel_h - 0.02) ** 0.22
eps_steel_n = np.linspace(0.28, 0.38, 40)
sig_steel_n = sig_steel_h[-1] - 250 * (eps_steel_n - 0.28) ** 1.3
eps_steel = np.concatenate([eps_steel_e, eps_steel_p,
eps_steel_h, eps_steel_n])
sig_steel = np.concatenate([sig_steel_e, sig_steel_p,
sig_steel_h, sig_steel_n])
ax.plot(eps_steel * 100, sig_steel, 'b-', linewidth=2.5,
label='軟鋼(延性)')
# --- アルミ合金: 明確な降伏点なし ---
E_al = 70e3
eps_al = np.linspace(0, 0.15, 300)
sig_al = 300 * (1 - np.exp(-E_al / 300 * eps_al))
ax.plot(eps_al * 100, sig_al, 'g-', linewidth=2.5,
label='アルミ合金(延性)')
# --- 鋳鉄: 脆性材料 ---
E_ci = 170e3
eps_ci = np.linspace(0, 0.005, 200)
sig_ci = E_ci * eps_ci * (1 - eps_ci / 0.005 * 0.15)
ax.plot(eps_ci * 100, sig_ci, 'r-', linewidth=2.5,
label='鋳鉄(脆性)')
ax.plot(eps_ci[-1] * 100, sig_ci[-1], 'rx', markersize=15,
markeredgewidth=3)
# --- セラミックス: 超脆性 ---
E_cer = 300e3
eps_cer = np.linspace(0, 0.001, 200)
sig_cer = E_cer * eps_cer
ax.plot(eps_cer * 100, sig_cer, 'm-', linewidth=2.5,
label='セラミックス(超脆性)')
ax.plot(eps_cer[-1] * 100, sig_cer[-1], 'mx', markersize=15,
markeredgewidth=3)
# 破断点の注記
ax.annotate('破断', xy=(eps_ci[-1] * 100, sig_ci[-1]),
xytext=(1.0, 600), fontsize=11, color='red',
arrowprops=dict(arrowstyle='->', color='red'))
ax.annotate('破断', xy=(eps_cer[-1] * 100, sig_cer[-1]),
xytext=(0.3, 400), fontsize=11, color='purple',
arrowprops=dict(arrowstyle='->', color='purple'))
ax.set_xlabel('ひずみ ε [%]', fontsize=14)
ax.set_ylabel('応力 σ [MPa]', fontsize=14)
ax.set_title('延性材料と脆性材料の応力-ひずみ曲線比較', fontsize=16)
ax.legend(fontsize=11, loc='right')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 42)
ax.set_ylim(0, 520)
plt.tight_layout()
plt.show()
このグラフからは、延性材料と脆性材料の根本的な違いが明瞭に読み取れます。軟鋼とアルミ合金は大きなひずみ(10% 以上)を伴って緩やかに破壊するのに対し、鋳鉄は 0.5% 程度、セラミックスは 0.1% 程度のわずかなひずみで突然破断しています(×印)。脆性材料は高い応力に耐えられるものの、「予告なく」破壊するため、構造設計では安全率を大きく取る必要があります。一方、延性材料は破壊前に大きな変形が生じるため、事前に異常を察知できるという安全上の利点があります。この違いは、材料選定において非常に重要な判断基準の一つです。
応力とひずみの応用 — どこで使われるか
ここまで学んだ応力とひずみの概念は、材料力学のほぼすべてのトピックの基礎となります。具体的な応用場面をいくつか紹介します。
梁の曲げ問題では、梁の断面に垂直応力の分布が生じます。中立面(応力がゼロの面)より上側と下側で引張と圧縮が交互に現れ、その大きさは中立面からの距離に比例します。このとき登場する重要な量が断面二次モーメントであり、曲げ応力と断面二次モーメント で詳しく解説しています。
ねじり問題では、円形断面の軸にトルクが作用すると、断面にせん断応力が分布します。せん断応力の大きさは中心からの距離に比例し、断面の外縁で最大となります。詳しくは ねじり を参照してください。
座屈問題では、長い柱に圧縮応力が作用すると、ある限界値で急に横方向に曲がる不安定現象(座屈)が生じます。座屈を理解するには応力の概念が前提となります。座屈 で詳細を解説しています。
これらの応用では、すべて今回学んだ応力とひずみの基本定義が出発点となっています。
まとめ
本記事では、材料力学の最も基本的な概念である応力とひずみについて、直感的な理解から数学的な定義、そしてPythonによる可視化まで一貫して解説しました。
- 応力 $\sigma = F/A$ は「単位面積あたりの内力」であり、面に垂直な垂直応力と面に平行なせん断応力に分類されます。力そのものではなく、力の密度が構造設計の判断基準となります
- ひずみ $\varepsilon = \Delta L / L_0$ は「元の長さに対する変形の割合」であり、無次元量です。工学ひずみと真ひずみの使い分けは、変形量の大きさに応じて判断します
- フックの法則 $\sigma = E\varepsilon$ は弾性域でのみ成り立つ線形関係であり、比例定数のヤング率 $E$ が材料の「硬さ」を表します
- ポアソン比 $\nu$ は、引張による横方向の収縮を表す材料定数で、多くの金属で約 0.3 です
- 応力-ひずみ曲線は材料の力学的特性の「履歴書」であり、弾性域、降伏点、加工硬化域、引張強さ、ネッキング、破断の各段階を読み取ることができます
- 応力テンソルは、物体内部の応力状態を座標系によらず統一的に記述する2階テンソルであり、対称性から独立な成分は6個です。主応力はテンソルの固有値として求められます
応力とひずみの理解は、材料力学のすべてのトピック — 梁の曲げ、軸の ねじり、柱の座屈、応力集中、疲労破壊 — の前提知識です。本記事を起点にして、以下の記事で理解をさらに深めてください。
次のステップとして、以下の記事も参考にしてください。
- フックの法則と弾性係数 — 弾性体の構成則の詳細と導出
- ヤング率・ポアソン比 — 弾性定数の相互関係と測定法
- 応力-ひずみ曲線 — さまざまな材料の応力-ひずみ曲線の詳細な読み方
- 軸力と棒の伸び — 1次元問題の具体的な計算方法
- 曲げ応力と断面二次モーメント — 梁の応力解析への発展
- 主応力とモールの応力円 — 2次元応力変換の幾何学的理解