Principles and Classification of AM Technologies - 3D Printing Technical Framework
Upon completing this chapter, you will be able to explain:
Additive Manufacturing (AM) is defined by ISO/ASTM 52900:2021 standard as "the process of manufacturing objects by adding material layer by layer from 3D CAD data".In contrast to traditional subtractive machining (material removal), AM adds material only where needed, providing the following innovative characteristics:
The AM market is growing rapidly. According to Wohlers Report 2023:
Additive manufacturing technology has approximately 40 years of history, evolving through the following milestones:
flowchart LR
A[1986
SLA Invented
Chuck Hull] --> B[1988
SLS Introduced
Carl Deckard]
B --> C[1992
FDM Patent
Stratasys Inc.]
C --> D[2005
RepRap
Open Source]
D --> E[2012
Metal AM Adoption
EBM/SLM]
E --> F[2023
Industrial Acceleration
Large-scale & High-speed]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e9
style D fill:#f3e5f5
style E fill:#fce4ec
style F fill:#fff9c4
The first major application of AM, for rapid manufacturing of prototypes for design verification, functional testing, and market evaluation:
Application of manufacturing jigs, tools, and molds used in production facilities with AM:
Direct manufacturing of end-use products with AM has been rapidly increasing in recent years:
AM is not universal and has the following constraints:
ISO/ASTM 52900:2021規格at/in/with、すべてAM技術エネルギー源材料供給方法基づて7つprocessカテゴリCategoryしてます。各process固有長所・短所あり、用途応じて最適な技術選択する必要あります。
flowchart TD
AM[productlayersbuild
7つprocess] --> MEX[Material Extrusion
Material Extrusion]
AM --> VPP[Vat Photopolymerization
液槽光重合]
AM --> PBF[Powder Bed Fusion
粉末床溶融結合]
AM --> MJ[Material Jetting
材料噴射]
AM --> BJ[Binder Jetting
結合剤噴射]
AM --> SL[Sheet Lamination
シートproductlayers]
AM --> DED[Directed Energy Deposition
指向性エネルギー堆product]
MEX --> MEX_EX[FDM/FFF
Low Cost& Widespread]
VPP --> VPP_EX[SLA/DLP
HighAccuracy・HighSurface Quality]
PBF --> PBF_EX[SLS/SLM/EBM
High Strength・metal対応]
style AM fill:#f093fb
style MEX fill:#e3f2fd
style VPP fill:#fff3e0
style PBF fill:#e8f5e9
style MJ fill:#f3e5f5
style BJ fill:#fce4ec
style SL fill:#fff9c4
style DED fill:#fce4ec
Principle: Thermoplastic filament is heated and melted, then extruded through a nozzle for layer-by-layer deposition. The most widespread technology (also called FDM/FFF).
Characteristics:
Applications:
Principle: Liquid photopolymer resin is selectively cured layer by layer using ultraviolet (UV) laser or projector light.
Two main VPP methods:
Characteristics:
Applications:
Principle: Powder material is spread in thin layers, selectively melted or sintered with laser or electron beam, then cooled and solidified. Compatible with metals, polymers, and ceramics.
Three main PBF methods:
Characteristics:
Applications:
Principle: Similar to inkjet printers, droplets of material (photopolymer resin or wax) are jetted from heads and immediately cured with UV exposure for layer-by-layer build.
Characteristics:
Applications:: Medical anatomical models (soft/hard tissue reproduced with different materials), full-color architectural models, design verification models
Principle: Liquid binder (adhesive) is jetted inkjet-style onto powder bed to bond powder particles. Strength improved through sintering or infiltration after build.
Characteristics:
Applications:: Sand molds for casting (large castings like engine blocks), metal parts (Desktop Metal, HP Metal Jet), full-color figures (souvenirs, educational models)
Principle: Sheet materials (paper, metal foil, plastic film) are laminated and bonded by adhesive or welding. Each layer contour-cut with laser or blade.
Representative Technologies:
Characteristics: 大型build可能、材料費安価、AccuracyMedium程度、用途限定的(主視覚モデル、metalat/in/with埋込センサー等)
Principle: Metal powder or wire fed and melted with laser, electron beam, or arc, then deposited on substrate. Used for large parts and repair of existing parts.
Characteristics:
Applications:: タービンブレード補修、大型Aerospace Components、工具耐摩耗コーティング
The optimal AM process varies by application requirements:
STL (STereoLithography) is the most widely used 3D model file format in AM, developed by 3D Systems in 1987.STL files represent object surfaces as a collection of triangle meshes.
ASCII STL形equation/formulaExample:
solid cube
facet normal 0 0 1
outer loop
vertex 0 0 10
vertex 10 0 10
vertex 10 10 10
endloop
endfacet
facet normal 0 0 1
outer loop
vertex 0 0 10
vertex 10 10 10
vertex 0 10 10
endloop
endfacet
...
endsolid cube
Two types of STL format:
Each triangular face has a normal vector (outward direction) defined to distinguish between "inside" and "outside" of the object.Normal direction is determined by the right-hand rule:
Vertex Ordering Rule: Vertices v1, v2, v3 are arranged counter-clockwise (CCW), so that the normal points outward when viewed from outside.
For an STL mesh to be 3D printable, it must be manifold:
Non-manifold meshes are not 3D printable. Typical problems:
These problems cause errors in slicer software and lead to build failures.
STL mesh quality is evaluated by the following metrics:
STLメッシュresolution(triangle数)Accuracyファイルサイズトレードオフat/in/withす:
CADソフトat/in/withSTLエクスポート時、Chordal Tolerance(chordal tolerance)またAngle Tolerance(angular tolerance)at/in/withresolution制御します。recommended value:chordal tolerance0.01-0.1 mm、angular tolerance5-15度。
Major Python libraries for handling STL files:
numpy-stl基number of的な使用法:
# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0
"""
Example: numpy-stl基number of的な使用法:
Purpose: Demonstrate core concepts and implementation patterns
Target: Beginner to Intermediate
Execution time: ~5 seconds
Dependencies: None
"""
from stl import mesh
import numpy as np
# STL File読み込み
your_mesh = mesh.Mesh.from_file('model.stl')
# 基number of的な幾何情報
volume, cog, inertia = your_mesh.get_mass_properties()
print(f"Volume: {volume:.2f} mm³")
print(f"Center of Gravity: {cog}")
print(f"Surface Area: {your_mesh.areas.sum():.2f} mm²")
# triangle数
print(f"Number of Triangles: {len(your_mesh.vectors)}")
The process of converting STL files into commands (G-code) that 3D printers can understand is called slicing.こセクションat/in/with、スライシング基number ofPrinciple、ツールパス戦略、そしてG-code基礎学びます。
Slicing is the process of horizontally cutting a 3D model at constant height (layer height) and extracting the contour of each layer:
flowchart TD
A[3D Model
STL File] --> B[In Z-axis direction
Layer-wise slicing]
B --> C[Contour extraction for each layer
Contour Detection]
C --> D[Shell generation
Perimeter Path]
D --> E[Infill generation
Infill Path]
E --> F[Add support
Support Structure]
F --> G[Toolpath optimization
Retraction/Travel]
G --> H[G-code output]
style A fill:#e3f2fd
style H fill:#e8f5e9
Layer height is the most important parameter determining the tradeoff between build quality and build time:
| Layer Height | Build Quality | Build Time | Typical Applications |
|---|---|---|---|
| 0.1 mm (Ultra-fine) | Very high (layer lines nearly invisible) | Very long (×2-3 times) | Figurines, medical models, end-use parts |
| 0.2 mm (Standard) | Good (layer lines visible but acceptable) | Standard | General prototypes, functional parts |
| 0.3 mm (Coarse) | Low (layer lines obvious) | Short (×0.5 times) | Initial prototypes, internal structure parts |
Layer Heightnozzle径25-80%settingする必要あります。Exampleえば0.4mmnozzle場合、Layer Height0.1-0.32mm推奨範囲at/in/withす。Exceeding this causes insufficient resin extrusion or the nozzle dragging previous layers.
Shell/Perimeter is the path forming the outer periphery of each layer:
Infill forms internal structure and controls strength and material usage:
| Pattern | Strength | Print Speed | Material Usage | Characteristics |
|---|---|---|---|---|
| Grid | Medium | Fast | Medium | シンプル、等方性、Standard的な選択 |
| Honeycomb | High | Slow | Medium | High Strength、重量比優秀、航空宇宙用途 |
| Gyroid | 非常High | Medium | Medium | 3D isotropic, curved, latest recommendation |
| Concentric | Low | Fast | Low | Flexibility focused, follows shell |
| Lines | Low(異方性) | 非常Fast | Low | Highspeed印刷、方向性Strength |
Parts with overhang angles exceeding 45 degrees require support structures:
| パラメータ | recommended value | 効果 |
|---|---|---|
| Overhang Angle | 45-60° | Generate support above this angle |
| Support Density | 10-20% | 密度Highほど安定だ除去困難 |
| Support Z Distance | 0.2-0.3 mm | Gap between support and part (ease of removal) |
| Interface Layers | 2-4 layers | 接合layers数(Surface Quality除去性バランス) |
G-code、3DプリンタandCNCマシン制御するStandard的な数値制御言語at/in/withす。各行1つCommand表します:
| Command | Category | Function | Example |
|---|---|---|---|
| G0 | Movement | HighspeedMovement(非押出) | G0 X100 Y50 Z10 F6000 |
| G1 | Movement | 直線Movement(押出あり) | G1 X120 Y60 E0.5 F1200 |
| G28 | Initialization | Return to home position | G28 (all axes), G28 Z (Z-axis only) |
| M104 | Temperature | nozzleTemperaturesetting(非wait) | M104 S200 |
| M109 | Temperature | nozzleTemperaturesetting(wait) | M109 S210 |
| M140 | Temperature | bedTemperaturesetting(非wait) | M140 S60 |
| M190 | Temperature | bedTemperaturesetting(wait) | M190 S60 |
; === Start G-code ===
M140 S60 ; Start bed heating to 60°C (non-blocking)
M104 S210 ; Start nozzle heating to 210°C (non-blocking)
G28 ; Home all axes
G29 ; Auto-leveling (bed mesh measurement)
M190 S60 ; bedTemperature到達wait
M109 S210 ; nozzleTemperature到達wait
G92 E0 ; Reset extrusion to zero
G1 Z2.0 F3000 ; Raise Z-axis 2mm (safety)
G1 X10 Y10 F5000 ; プライム位置へMovement
G1 Z0.3 F3000 ; Z軸0.3mmへ降下(初layersHigh)
G1 X100 E10 F1500 ; Draw prime line (clear nozzle)
G92 E0 ; Reset extrusion again to zero
; === Build start ===
| Software | License | Characteristics | Recommended Use |
|---|---|---|---|
| Cura | Open Source | 使andす、豊富なプリセット、Tree SupportStandard搭載 | 初心者〜Mediumlevel users、FDM汎用 |
| PrusaSlicer | Open Source | High度なsetting、variableLayer Height、カスタムsupport | Mediumlevel users〜上level users、最適化重視 |
| Slic3r | Open Source | Original PrusaSlicer, lightweight | Legacy systems, research applications |
| Simplify3D | Commercial ($150) | Highspeedスライシング、マルチprocess、詳細制御 | Professional, industrial applications |
| IdeaMaker | Free | Raise3D専用だ汎用性High、直感的UI | Raise3D users, beginners |
効率的なツールパス、Build Time・品質・Material Usage改善します:
# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0
"""
Example: Example 1: STL File読み込み基number of情報取得
Purpose: Demonstrate neural network implementation
Target: Beginner to Intermediate
Execution time: 5-10 seconds
Dependencies: None
"""
# ===================================
# Example 1: STL File読み込み基number of情報取得
# ===================================
import numpy as np
from stl import mesh
# STL File読み込む
your_mesh = mesh.Mesh.from_file('model.stl')
# Get basic geometric information
volume, cog, inertia = your_mesh.get_mass_properties()
print("=== STL File基number of情報 ===")
print(f"Volume: {volume:.2f} mm³")
print(f"Surface Area: {your_mesh.areas.sum():.2f} mm²")
print(f"Center of Gravity: [{cog[0]:.2f}, {cog[1]:.2f}, {cog[2]:.2f}] mm")
print(f"Number of Triangles: {len(your_mesh.vectors)}")
# Calculate bounding box (minimum enclosing box)
min_coords = your_mesh.vectors.min(axis=(0, 1))
max_coords = your_mesh.vectors.max(axis=(0, 1))
dimensions = max_coords - min_coords
print(f"\n=== Bounding Box ===")
print(f"X: {min_coords[0]:.2f} to {max_coords[0]:.2f} mm (Width: {dimensions[0]:.2f} mm)")
print(f"Y: {min_coords[1]:.2f} to {max_coords[1]:.2f} mm (Depth: {dimensions[1]:.2f} mm)")
print(f"Z: {min_coords[2]:.2f} to {max_coords[2]:.2f} mm (High: {dimensions[2]:.2f} mm)")
# Build Time簡易estimation(Layer Height0.2mm、speed度50mm/s仮定)
layer_height = 0.2 # mm
print_speed = 50 # mm/s
num_layers = int(dimensions[2] / layer_height)
# Simple calculation: estimate based on surface area
estimated_path_length = your_mesh.areas.sum() / layer_height # mm
estimated_time_seconds = estimated_path_length / print_speed
estimated_time_minutes = estimated_time_seconds / 60
print(f"\n=== Build Estimation ===")
print(f"Number of layers (0.2mm/layer): {num_layers} layers")
print(f"estimationBuild Time: {estimated_time_minutes:.1f} minutes ({estimated_time_minutes/60:.2f} hours)")
# outputExample:
# === STL File基number of情報 ===
# Volume: 12450.75 mm³
# Surface Area: 5832.42 mm²
# Center of Gravity: [25.34, 18.92, 15.67] mm
# Number of Triangles: 2456
#
# === Bounding Box ===
# X: 0.00 to 50.00 mm (Width: 50.00 mm)
# Y: 0.00 to 40.00 mm (Depth: 40.00 mm)
# Z: 0.00 to 30.00 mm (High: 30.00 mm)
#
# === Build Estimation ===
# Number of layers (0.2mm/layer): 150 layers
# estimationBuild Time: 97.2 minutes (1.62 hours)
# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0
# ===================================
# Example 2: Mesh Normal Vector Verification
# ===================================
import numpy as np
from stl import mesh
def check_normals(mesh_data):
"""Check consistency of normal vectors in STL mesh
Args:
mesh_data: numpy-stl Mesh object
Returns:
tuple: (flipped_count, total_count, percentage)
"""
# Check normal direction with right-hand rule
flipped_count = 0
total_count = len(mesh_data.vectors)
for i, facet in enumerate(mesh_data.vectors):
v0, v1, v2 = facet
# Calculate edge vectors
edge1 = v1 - v0
edge2 = v2 - v0
# Calculate normal with cross product (right-hand)
calculated_normal = np.cross(edge1, edge2)
# Normalize
norm = np.linalg.norm(calculated_normal)
if norm > 1e-10: # Confirm not zero vector
calculated_normal = calculated_normal / norm
else:
continue # Skip degenerate triangles
# Compare with stored normal in file
stored_normal = mesh_data.normals[i]
stored_norm = np.linalg.norm(stored_normal)
if stored_norm > 1e-10:
stored_normal = stored_normal / stored_norm
# Check direction match with dot product
dot_product = np.dot(calculated_normal, stored_normal)
# If dot product negative, opposite direction
if dot_product < 0:
flipped_count += 1
percentage = (flipped_count / total_count) * 100 if total_count > 0 else 0
return flipped_count, total_count, percentage
# STL File読み込み
your_mesh = mesh.Mesh.from_file('model.stl')
# Execute normal check
flipped, total, percent = check_normals(your_mesh)
print("=== Normal Vector Verification Results ===")
print(f"Total triangles: {total}")
print(f"Flipped normals: {flipped}")
print(f"Flip rate: {percent:.2f}%")
if flipped == 0:
print("\n✅ All normals point in correct direction")
print(" This mesh is 3D printable")
elif percent < 5:
print("\n⚠️ Some normals are flipped (minor)")
print(" スライサー自動修正するpossibilityHigh")
else:
print("\n❌ Many normals are flipped (critical)")
print(" Recommend repair with mesh repair tools (Meshmixer, netfabb)")
# outputExample:
# === Normal Vector Verification Results ===
# Total triangles: 2456
# Flipped normals: 0
# Flip rate: 0.00%
#
# ✅ All normals point in correct direction
# This mesh is 3D printable
# ===================================
# Example 3: Manifold (Watertight) Check
# ===================================
import trimesh
# STL File読み込み(trimesh自動at/in/with修復試みる)
mesh = trimesh.load('model.stl')
print("=== Mesh Quality Diagnosis ===")
# Basic information
print(f"Vertex count: {len(mesh.vertices)}")
print(f"Face count: {len(mesh.faces)}")
print(f"Volume: {mesh.volume:.2f} mm³")
# Check manifold property
print(f"\n=== 3D Print Suitability Check ===")
print(f"Is watertight: {mesh.is_watertight}")
print(f"Is winding consistent: {mesh.is_winding_consistent}")
print(f"Is valid: {mesh.is_valid}")
# Diagnose problem details
if not mesh.is_watertight:
# Detect number of holes
try:
edges = mesh.edges_unique
edges_sorted = mesh.edges_sorted
duplicate_edges = len(edges_sorted) - len(edges)
print(f"\n⚠️ Problem detected:")
print(f" - Mesh has holes")
print(f" - Duplicate edges: {duplicate_edges}")
except:
print(f"\n⚠️ Mesh structure has problems")
# Attempt repair
if not mesh.is_watertight or not mesh.is_winding_consistent:
print(f"\n🔧 自動修復actual行Medium...")
# Fix normals
trimesh.repair.fix_normals(mesh)
print(" ✓ Fixed normal vectors")
# Fill holes
trimesh.repair.fill_holes(mesh)
print(" ✓ Filled holes")
# Remove degenerate faces
mesh.remove_degenerate_faces()
print(" ✓ Removed degenerate faces")
# Merge duplicate vertices
mesh.merge_vertices()
print(" ✓ Merged duplicate vertices")
# Check post-repair status
print(f"\n=== Post-repair Status ===")
print(f"Is watertight: {mesh.is_watertight}")
print(f"Is winding consistent: {mesh.is_winding_consistent}")
# Save repaired mesh
if mesh.is_watertight:
mesh.export('model_repaired.stl')
print(f"\n✅ Repair complete! Saved as model_repaired.stl")
else:
print(f"\n❌ Automatic repair failed. Recommend dedicated tools like Meshmixer")
else:
print(f"\n✅ This mesh is 3D printable")
# outputExample:
# === Mesh Quality Diagnosis ===
# Vertex count: 1534
# Face count: 2456
# Volume: 12450.75 mm³
#
# === 3D Print Suitability Check ===
# Is watertight: True
# Is winding consistent: True
# Is valid: True
#
# ✅ This mesh is 3D printable
# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0
# ===================================
# Example 4: Basic Slicing Algorithm
# ===================================
import numpy as np
from stl import mesh
def slice_mesh_at_height(mesh_data, z_height):
"""Temperatureprofile生成
Args:
t (array): hoursarray [min]
T_target (float): holdingTemperature [°C]
heating_rate (float): heating rate [°C/min]
hold_time (float): holdinghours [min]
cooling_rate (float): cooling rate [°C/min]
Returns:
array: Temperatureprofile [°C]
"""
T_room = 25 # room temperature
T = np.zeros_like(t)
# heatinghours
t_heat = (T_target - T_room) / heating_rate
# 冷却開始時刻
t_cool_start = t_heat + hold_time
for i, time in enumerate(t):
if time <= t_heat:
# heatingフェーズ
T[i] = T_room + heating_rate * time
elif time <= t_cool_start:
# holdingフェーズ
T[i] = T_target
else:
# 冷却フェーズ
T[i] = T_target - cooling_rate * (time - t_cool_start)
T[i] = max(T[i], T_room) # room temperature以下ならな
return T
def simulate_reaction_progress(T, t, Ea, D0, r0):
"""Temperatureprofile基づくreaction progress計算
Args:
T (array): Temperatureprofile [°C]
t (array): hoursarray [min]
Ea (float): activation energy [J/mol]
D0 (float): frequency factor [m²/s]
r0 (float): particle radius [m]
Returns:
array: conversion rate
"""
R = 8.314
C0 = 10000
alpha = np.zeros_like(t)
for i in range(1, len(t)):
T_k = T[i] + 273.15
D = D0 * np.exp(-Ea / (R * T_k))
k = D * C0 / r0**2
dt = (t[i] - t[i-1]) * 60 # min → s
# 簡易productminutes(微小hoursat/in/withreaction progress)
if alpha[i-1] < 0.99:
dalpha = k * dt / (2 * (1 - (1-alpha[i-1])**(1/3)))
alpha[i] = min(alpha[i-1] + dalpha, 1.0)
else:
alpha[i] = alpha[i-1]
return alpha
# パラメータsetting
T_target = 1200 # °C
hold_time = 240 # min (4 hours)
Ea = 300e3 # J/mol
D0 = 5e-4 # m²/s
r0 = 5e-6 # m
# 異なるheating rateat/in/withcomparison
heating_rates = [2, 5, 10, 20] # °C/min
cooling_rate = 3 # °C/min
# hoursarray
t_max = 800 # min
t = np.linspace(0, t_max, 2000)
# plot
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
# Temperatureprofile
for hr in heating_rates:
T_profile = temperature_profile(t, T_target, hr, hold_time, cooling_rate)
ax1.plot(t/60, T_profile, linewidth=2, label=f'{hr}°C/min')
ax1.set_xlabel('Time (hours)', fontsize=12)
ax1.set_ylabel('Temperature (°C)', fontsize=12)
ax1.set_title('Temperature Profiles', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_xlim([0, t_max/60])
# reaction progress
for hr in heating_rates:
T_profile = temperature_profile(t, T_target, hr, hold_time, cooling_rate)
alpha = simulate_reaction_progress(T_profile, t, Ea, D0, r0)
ax2.plot(t/60, alpha, linewidth=2, label=f'{hr}°C/min')
ax2.axhline(y=0.95, color='red', linestyle='--', linewidth=1, label='Target (95%)')
ax2.set_xlabel('Time (hours)', fontsize=12)
ax2.set_ylabel('Conversion', fontsize=12)
ax2.set_title('Reaction Progress', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)
ax2.set_xlim([0, t_max/60])
ax2.set_ylim([0, 1])
plt.tight_layout()
plt.savefig('temperature_profile_optimization.png', dpi=300, bbox_inches='tight')
plt.show()
# 各heating rateat/in/with95%reaction attainmenthours計算
print("\n95%reaction attainmenthourscomparison:")
print("=" * 60)
for hr in heating_rates:
T_profile = temperature_profile(t, T_target, hr, hold_time, cooling_rate)
alpha = simulate_reaction_progress(T_profile, t, Ea, D0, r0)
# 95%到達時刻
idx_95 = np.where(alpha >= 0.95)[0]
if len(idx_95) > 0:
t_95 = t[idx_95[0]] / 60
print(f"heating rate {hr:2d}°C/min: t₉₅ = {t_95:.1f} hours")
else:
print(f"heating rate {hr:2d}°C/min: 反応不完全")
# outputExample:
# 95%reaction attainmenthourscomparison:
# ============================================================
# heating rate 2°C/min: t₉₅ = 7.8 hours
# heating rate 5°C/min: t₉₅ = 7.2 hours
# heating rate 10°C/min: t₉₅ = 6.9 hours
# heating rate 20°C/min: t₉₅ = 6.7 hours
pycalphad、CALPHAD(CALculation of PHAse Diagrams)法基づく相図計算ためPythonライブラリat/in/withす。熱力学データベースから平衡相計算し、反応経路設計有用at/in/withす。
# ===================================
# Example 5: pycalphadat/in/with相図計算
# ===================================
# 注意: pycalphadインストール必要
# pip install pycalphad
from pycalphad import Database, equilibrium, variables as v
import matplotlib.pyplot as plt
import numpy as np
# TDBデータベース読み込み(ここat/in/with簡易的なExample)
# actual際適切なTDBファイル必要
# Example: BaO-TiO2system
# 簡易的なTDB文字列(actual際より複雑)
tdb_string = """
$ BaO-TiO2 system (simplified)
ELEMENT BA BCC_A2 137.327 !
ELEMENT TI HCP_A3 47.867 !
ELEMENT O GAS 15.999 !
FUNCTION GBCCBA 298.15 +GHSERBA; 6000 N !
FUNCTION GHCPTI 298.15 +GHSERTI; 6000 N !
FUNCTION GGASO 298.15 +GHSERO; 6000 N !
PHASE LIQUID:L % 1 1.0 !
PHASE BAO_CUBIC % 2 1 1 !
PHASE TIO2_RUTILE % 2 1 2 !
PHASE BATIO3 % 3 1 1 3 !
"""
# 注: actual際計算正equation/formulaなTDBファイル必要
# ここat/in/with概念的な説明留める
print("pycalphadよる相図計算概念:")
print("=" * 60)
print("1. TDBデータベース(熱力学データ)読み込む")
print("2. Temperature・組成範囲setting")
print("3. 平衡計算actual行")
print("4. 安定相可視化")
print()
print("actual際適用Example:")
print("- BaO-TiO2system: BaTiO3形成Temperature・組成範囲")
print("- Si-Nsystem: Si3N4安定領域")
print("- 多元systemセラミックス相関係")
# 概念的なplot(actualデータ基づくイメージ)
fig, ax = plt.subplots(figsize=(10, 7))
# Temperature範囲
T = np.linspace(800, 1600, 100)
# 各相安定領域(概念図)
# BaO + TiO2 → BaTiO3 反応
BaO_region = np.ones_like(T) * 0.3
TiO2_region = np.ones_like(T) * 0.7
BaTiO3_region = np.where((T > 1100) & (T < 1400), 0.5, np.nan)
ax.fill_between(T, 0, BaO_region, alpha=0.3, color='blue', label='BaO + TiO2')
ax.fill_between(T, BaO_region, TiO2_region, alpha=0.3, color='green',
label='BaTiO3 stable')
ax.fill_between(T, TiO2_region, 1, alpha=0.3, color='red', label='Liquid')
ax.axhline(y=0.5, color='black', linestyle='--', linewidth=2,
label='BaTiO3 composition')
ax.axvline(x=1100, color='gray', linestyle=':', linewidth=1, alpha=0.5)
ax.axvline(x=1400, color='gray', linestyle=':', linewidth=1, alpha=0.5)
ax.set_xlabel('Temperature (°C)', fontsize=12)
ax.set_ylabel('Composition (BaO mole fraction)', fontsize=12)
ax.set_title('Conceptual Phase Diagram: BaO-TiO2', fontsize=14, fontweight='bold')
ax.legend(fontsize=10, loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim([800, 1600])
ax.set_ylim([0, 1])
# テキスト注釈
ax.text(1250, 0.5, 'BaTiO₃\nformation\nregion',
fontsize=11, ha='center', va='center',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.7))
plt.tight_layout()
plt.savefig('phase_diagram_concept.png', dpi=300, bbox_inches='tight')
plt.show()
# actual際使用Example(コメントアウト)
"""
# actual際pycalphad使用Example
db = Database('BaO-TiO2.tdb') # TDBファイル読み込み
# 平衡計算
eq = equilibrium(db, ['BA', 'TI', 'O'], ['LIQUID', 'BATIO3'],
{v.X('BA'): (0, 1, 0.01),
v.T: (1000, 1600, 50),
v.P: 101325})
# 結果plot
eq.plot()
"""
Design of Experiments(Design of Experiments, DOE)、複数パラメータ相互作用するsystemat/in/with、最小actual験times/iterations数at/in/with最適条件見つける統計手法at/in/withす。
固相反応at/in/with最適化すべき主要パラメータ:
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
# ===================================
# Example 6: DOEよる条件最適化
# ===================================
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.optimize import minimize
# 仮想的なconversion rateモデル(Temperaturehours関数)
def reaction_yield(T, t, noise=0):
"""Temperaturehoursからconversion rate計算(仮想モデル)
Args:
T (float): Temperature [°C]
t (float): hours [hours]
noise (float): ノイズレベル
Returns:
float: conversion rate [%]
"""
# 最適値: T=1200°C, t=6 hours
T_opt = 1200
t_opt = 6
# 二next/orderモデル(ガウス型)
yield_val = 100 * np.exp(-((T-T_opt)/150)**2 - ((t-t_opt)/3)**2)
# ノイズ追加
if noise > 0:
yield_val += np.random.normal(0, noise)
return np.clip(yield_val, 0, 100)
# actual験点配置(Medium心複合計画法)
T_levels = [1000, 1100, 1200, 1300, 1400] # °C
t_levels = [2, 4, 6, 8, 10] # hours
# グリッドat/in/withactual験点配置
T_grid, t_grid = np.meshgrid(T_levels, t_levels)
yield_grid = np.zeros_like(T_grid, dtype=float)
# 各actual験点at/in/withconversion rate測定(シミュレーション)
for i in range(len(t_levels)):
for j in range(len(T_levels)):
yield_grid[i, j] = reaction_yield(T_grid[i, j], t_grid[i, j], noise=2)
# 結果表示
print("Design of Experimentsよる反応条件最適化")
print("=" * 70)
print(f"{'Temperature (°C)':<20} {'Time (hours)':<20} {'Yield (%)':<20}")
print("-" * 70)
for i in range(len(t_levels)):
for j in range(len(T_levels)):
print(f"{T_grid[i, j]:<20} {t_grid[i, j]:<20} {yield_grid[i, j]:<20.1f}")
# 最大conversion rate条件探す
max_idx = np.unravel_index(np.argmax(yield_grid), yield_grid.shape)
T_best = T_grid[max_idx]
t_best = t_grid[max_idx]
yield_best = yield_grid[max_idx]
print("-" * 70)
print(f"最適条件: T = {T_best}°C, t = {t_best} hours")
print(f"最大conversion rate: {yield_best:.1f}%")
# 3Dplot
fig = plt.figure(figsize=(14, 6))
# 3D表面plot
ax1 = fig.add_subplot(121, projection='3d')
T_fine = np.linspace(1000, 1400, 50)
t_fine = np.linspace(2, 10, 50)
T_mesh, t_mesh = np.meshgrid(T_fine, t_fine)
yield_mesh = np.zeros_like(T_mesh)
for i in range(len(t_fine)):
for j in range(len(T_fine)):
yield_mesh[i, j] = reaction_yield(T_mesh[i, j], t_mesh[i, j])
surf = ax1.plot_surface(T_mesh, t_mesh, yield_mesh, cmap='viridis',
alpha=0.8, edgecolor='none')
ax1.scatter(T_grid, t_grid, yield_grid, color='red', s=50,
label='Experimental points')
ax1.set_xlabel('Temperature (°C)', fontsize=10)
ax1.set_ylabel('Time (hours)', fontsize=10)
ax1.set_zlabel('Yield (%)', fontsize=10)
ax1.set_title('Response Surface', fontsize=12, fontweight='bold')
ax1.view_init(elev=25, azim=45)
fig.colorbar(surf, ax=ax1, shrink=0.5, aspect=5)
# 等High線plot
ax2 = fig.add_subplot(122)
contour = ax2.contourf(T_mesh, t_mesh, yield_mesh, levels=20, cmap='viridis')
ax2.contour(T_mesh, t_mesh, yield_mesh, levels=10, colors='black',
alpha=0.3, linewidths=0.5)
ax2.scatter(T_grid, t_grid, c=yield_grid, s=100, edgecolors='red',
linewidths=2, cmap='viridis')
ax2.scatter(T_best, t_best, color='red', s=300, marker='*',
edgecolors='white', linewidths=2, label='Optimum')
ax2.set_xlabel('Temperature (°C)', fontsize=11)
ax2.set_ylabel('Time (hours)', fontsize=11)
ax2.set_title('Contour Map', fontsize=12, fontweight='bold')
ax2.legend(fontsize=10)
fig.colorbar(contour, ax=ax2, label='Yield (%)')
plt.tight_layout()
plt.savefig('doe_optimization.png', dpi=300, bbox_inches='tight')
plt.show()
actual際固相反応at/in/with、以下手順at/in/withDOE適用します:
ある研究グループDOE用てLiCoO₂合成条件最適化した結果:
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
"""
Example: 1.7.1 actual験データからrate constant決定
Purpose: Demonstrate data visualization techniques
Target: Intermediate
Execution time: 10-30 seconds
Dependencies: None
"""
# ===================================
# Example 7: 反応speed度曲線フィッティング
# ===================================
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# actual験データ(hours vs conversion rate)
# Example: BaTiO3合成 @ 1200°C
time_exp = np.array([0, 1, 2, 3, 4, 6, 8, 10, 12, 15, 20]) # hours
conversion_exp = np.array([0, 0.15, 0.28, 0.38, 0.47, 0.60,
0.70, 0.78, 0.84, 0.90, 0.95])
# Janderequation/formulaモデル
def jander_model(t, k):
"""Janderequation/formulaよるconversion rate計算
Args:
t (array): hours [hours]
k (float): rate constant
Returns:
array: conversion rate
"""
# [1 - (1-α)^(1/3)]² = kt α つて解く
kt = k * t
alpha = 1 - (1 - np.sqrt(kt))**3
alpha = np.clip(alpha, 0, 1) # 0-1範囲制限
return alpha
# Ginstling-Brounshteinequation/formula(別拡散モデル)
def gb_model(t, k):
"""Ginstling-Brounshteinequation/formula
Args:
t (array): hours
k (float): rate constant
Returns:
array: conversion rate
"""
# 1 - 2α/3 - (1-α)^(2/3) = kt
# 数値的解く必要ある、ここat/in/with近似equation/formula使用
kt = k * t
alpha = 1 - (1 - kt/2)**(3/2)
alpha = np.clip(alpha, 0, 1)
return alpha
# Power law (経験equation/formula)
def power_law_model(t, k, n):
"""べき乗則モデル
Args:
t (array): hours
k (float): rate constant
n (float): 指数
Returns:
array: conversion rate
"""
alpha = k * t**n
alpha = np.clip(alpha, 0, 1)
return alpha
# 各モデルat/in/withフィッティング
# Janderequation/formula
popt_jander, _ = curve_fit(jander_model, time_exp, conversion_exp, p0=[0.01])
k_jander = popt_jander[0]
# Ginstling-Brounshteinequation/formula
popt_gb, _ = curve_fit(gb_model, time_exp, conversion_exp, p0=[0.01])
k_gb = popt_gb[0]
# Power law
popt_power, _ = curve_fit(power_law_model, time_exp, conversion_exp, p0=[0.1, 0.5])
k_power, n_power = popt_power
# 予測曲線生成
t_fit = np.linspace(0, 20, 200)
alpha_jander = jander_model(t_fit, k_jander)
alpha_gb = gb_model(t_fit, k_gb)
alpha_power = power_law_model(t_fit, k_power, n_power)
# 残差計算
residuals_jander = conversion_exp - jander_model(time_exp, k_jander)
residuals_gb = conversion_exp - gb_model(time_exp, k_gb)
residuals_power = conversion_exp - power_law_model(time_exp, k_power, n_power)
# R²計算
def r_squared(y_true, y_pred):
ss_res = np.sum((y_true - y_pred)**2)
ss_tot = np.sum((y_true - np.mean(y_true))**2)
return 1 - (ss_res / ss_tot)
r2_jander = r_squared(conversion_exp, jander_model(time_exp, k_jander))
r2_gb = r_squared(conversion_exp, gb_model(time_exp, k_gb))
r2_power = r_squared(conversion_exp, power_law_model(time_exp, k_power, n_power))
# plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# フィッティング結果
ax1.plot(time_exp, conversion_exp, 'ko', markersize=8, label='Experimental data')
ax1.plot(t_fit, alpha_jander, 'b-', linewidth=2,
label=f'Jander (R²={r2_jander:.4f})')
ax1.plot(t_fit, alpha_gb, 'r-', linewidth=2,
label=f'Ginstling-Brounshtein (R²={r2_gb:.4f})')
ax1.plot(t_fit, alpha_power, 'g-', linewidth=2,
label=f'Power law (R²={r2_power:.4f})')
ax1.set_xlabel('Time (hours)', fontsize=12)
ax1.set_ylabel('Conversion', fontsize=12)
ax1.set_title('Kinetic Model Fitting', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_xlim([0, 20])
ax1.set_ylim([0, 1])
# 残差plot
ax2.plot(time_exp, residuals_jander, 'bo-', label='Jander')
ax2.plot(time_exp, residuals_gb, 'ro-', label='Ginstling-Brounshtein')
ax2.plot(time_exp, residuals_power, 'go-', label='Power law')
ax2.axhline(y=0, color='black', linestyle='--', linewidth=1)
ax2.set_xlabel('Time (hours)', fontsize=12)
ax2.set_ylabel('Residuals', fontsize=12)
ax2.set_title('Residual Plot', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('kinetic_fitting.png', dpi=300, bbox_inches='tight')
plt.show()
# 結果サマリー
print("\n反応speed度モデルフィッティング結果:")
print("=" * 70)
print(f"{'Model':<25} {'Parameter':<30} {'R²':<10}")
print("-" * 70)
print(f"{'Jander':<25} {'k = ' + f'{k_jander:.4f} h⁻¹':<30} {r2_jander:.4f}")
print(f"{'Ginstling-Brounshtein':<25} {'k = ' + f'{k_gb:.4f} h⁻¹':<30} {r2_gb:.4f}")
print(f"{'Power law':<25} {'k = ' + f'{k_power:.4f}, n = {n_power:.4f}':<30} {r2_power:.4f}")
print("=" * 70)
print(f"\n最適モデル: {'Jander' if r2_jander == max(r2_jander, r2_gb, r2_power) else 'GB' if r2_gb == max(r2_jander, r2_gb, r2_power) else 'Power law'}")
# outputExample:
# 反応speed度モデルフィッティング結果:
# ======================================================================
# Model Parameter R²
# ----------------------------------------------------------------------
# Jander k = 0.0289 h⁻¹ 0.9953
# Ginstling-Brounshtein k = 0.0412 h⁻¹ 0.9867
# Power law k = 0.2156, n = 0.5234 0.9982
# ======================================================================
#
# 最適モデル: Power law
固相反応at/in/with、Hightemperature・長hoursholdingより望ましくな粒成長起こります。これ抑制する戦略:
メカノケミカル法(Highエネルギーボールミル)より、固相反応room temperature付近at/in/with進行せるこも可能at/in/withす:
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
# ===================================
# Example 8: 粒成長シミュレーション
# ===================================
import numpy as np
import matplotlib.pyplot as plt
def grain_growth(t, T, D0, Ea, G0, n):
"""粒成長hours発展
Burke-Turnbullequation/formula: G^n - G0^n = k*t
Args:
t (array): hours [hours]
T (float): Temperature [K]
D0 (float): frequency factor
Ea (float): activation energy [J/mol]
G0 (float): 初期粒径 [μm]
n (float): 粒成長指数(typically2-4)
Returns:
array: 粒径 [μm]
"""
R = 8.314
k = D0 * np.exp(-Ea / (R * T))
G = (G0**n + k * t * 3600)**(1/n) # hours → seconds
return G
# パラメータsetting
D0_grain = 1e8 # μm^n/s
Ea_grain = 400e3 # J/mol
G0 = 0.5 # μm
n = 3
# Temperature影響
temps_celsius = [1100, 1200, 1300]
t_range = np.linspace(0, 12, 100) # 0-12 hours
plt.figure(figsize=(12, 5))
# Temperature依存性
plt.subplot(1, 2, 1)
for T_c in temps_celsius:
T_k = T_c + 273.15
G = grain_growth(t_range, T_k, D0_grain, Ea_grain, G0, n)
plt.plot(t_range, G, linewidth=2, label=f'{T_c}°C')
plt.axhline(y=1.0, color='red', linestyle='--', linewidth=1,
label='Target grain size')
plt.xlabel('Time (hours)', fontsize=12)
plt.ylabel('Grain Size (μm)', fontsize=12)
plt.title('Grain Growth at Different Temperatures', fontsize=14, fontweight='bold')
plt.legend(fontsize=10)
plt.grid(True, alpha=0.3)
plt.ylim([0, 5])
# Two-step sintering効果
plt.subplot(1, 2, 2)
# Conventional sintering: 1300°C, 6 hours
t_conv = np.linspace(0, 6, 100)
T_conv = 1300 + 273.15
G_conv = grain_growth(t_conv, T_conv, D0_grain, Ea_grain, G0, n)
# Two-step: 1300°C 1h → 1200°C 5h
t1 = np.linspace(0, 1, 20)
G1 = grain_growth(t1, 1300+273.15, D0_grain, Ea_grain, G0, n)
G_intermediate = G1[-1]
t2 = np.linspace(0, 5, 80)
G2 = grain_growth(t2, 1200+273.15, D0_grain, Ea_grain, G_intermediate, n)
t_two_step = np.concatenate([t1, t2 + 1])
G_two_step = np.concatenate([G1, G2])
plt.plot(t_conv, G_conv, 'r-', linewidth=2, label='Conventional (1300°C)')
plt.plot(t_two_step, G_two_step, 'b-', linewidth=2, label='Two-step (1300°C→1200°C)')
plt.axvline(x=1, color='gray', linestyle=':', linewidth=1, alpha=0.5)
plt.xlabel('Time (hours)', fontsize=12)
plt.ylabel('Grain Size (μm)', fontsize=12)
plt.title('Two-Step Sintering Strategy', fontsize=14, fontweight='bold')
plt.legend(fontsize=10)
plt.grid(True, alpha=0.3)
plt.ylim([0, 5])
plt.tight_layout()
plt.savefig('grain_growth_control.png', dpi=300, bbox_inches='tight')
plt.show()
# 最終粒径comparison
G_final_conv = grain_growth(6, 1300+273.15, D0_grain, Ea_grain, G0, n)
G_final_two_step = G_two_step[-1]
print("\n粒成長comparison:")
print("=" * 50)
print(f"Conventional (1300°C, 6h): {G_final_conv:.2f} μm")
print(f"Two-step (1300°C 1h + 1200°C 5h): {G_final_two_step:.2f} μm")
print(f"粒径抑制効果: {(1 - G_final_two_step/G_final_conv)*100:.1f}%")
# outputExample:
# 粒成長comparison:
# ==================================================
# Conventional (1300°C, 6h): 4.23 μm
# Two-step (1300°C 1h + 1200°C 5h): 2.87 μm
# 粒径抑制効果: 32.2%
Upon completing this chapter, you will be able to explain:
STL FileASCII形equation/formulaBinary形equation/formulaつて、正し説明どれat/in/withすか?
a) ASCII形equation/formula方ファイルサイズ小
b) Binary形equation/formula人間直接読めるテキスト形equation/formula
c) Binary形equation/formulatypicallyASCII形equation/formula5-10times小ファイルサイズ
d) Binary形equation/formulaASCII形equation/formulaよりAccuracyLow
correct answer: c) Binary形equation/formulatypicallyASCII形equation/formula5-10times小ファイルサイズ
解説:
actualExample: 10,000triangleモデル → ASCII: approximately7MB、Binary: approximately0.5MB
体product12,000 mm³、High30 mmbuild物、Layer Height0.2 mm、Print Speed50 mm/sat/in/withbuildします。おおよそBuild Timeどれat/in/withすか?(インフィル20%、壁2layers仮定)
a) 30minutes
b) 60minutes
c) 90minutes
d) 120minutes
correct answer: c) 90minutes(approximately1.5hours)
計算手順:
ポイント: スライサーソフト提供するestimationhours、加reductionspeed・Movement・Temperature安定化含むため、単純計算4-6times程度なります。
next/order用途最適なAMprocess選んat/in/withくだ:「航空機エンジンpartsチタン合金製燃料噴射nozzle、複雑な内部流路、High Strength・High耐熱性要求」
a) FDM (Fused Deposition Modeling)
b) SLA (Stereolithography)
c) SLM (Selective Laser Melting)
d) Binder Jetting
correct answer: c) SLM (Selective Laser Melting / Powder Bed Fusion for Metal)
reason:
actualExample: GE AviationLEAP燃料nozzle(SLM製)、従来20parts溶接してたも1parts統合、重量25%reduction、耐久性5timesimprovement達成。
以下Pythonコード完成せて、STL Fileマニフォールド性(watertight)検証してくだ。
import trimesh
mesh = trimesh.load('model.stl')
# ここコード追加: マニフォールド性チェックし、
# 問題あれば自動修復行、修復後メッシュ
# 'model_fixed.stl'して保存してくだ
answerExample:
import trimesh
mesh = trimesh.load('model.stl')
# Check manifold property
print(f"Is watertight: {mesh.is_watertight}")
print(f"Is winding consistent: {mesh.is_winding_consistent}")
# 問題ある場合修復
if not mesh.is_watertight or not mesh.is_winding_consistent:
print("メッシュ修復actual行Medium...")
# Fix normals
trimesh.repair.fix_normals(mesh)
# Fill holes
trimesh.repair.fill_holes(mesh)
# Remove degenerate faces
mesh.remove_degenerate_faces()
# Merge duplicate vertices
mesh.merge_vertices()
# 修復結果確認
print(f"修復後 watertight: {mesh.is_watertight}")
# Save repaired mesh
if mesh.is_watertight:
mesh.export('model_fixed.stl')
print("修復完了: model_fixed.stl して保存")
else:
print("⚠️ 自動修復失敗。Meshmixer等使用してくだ")
else:
print("✓ メッシュ3Dプリント可能at/in/withす")
解説:
trimesh.repair.fix_normals(): 法線ベクトル向き統一trimesh.repair.fill_holes(): メッシュ穴充填remove_degenerate_faces(): 面productゼロ縮退triangle削除merge_vertices(): 重複した頂点結合actual践ポイント: trimeshat/in/withも修復at/in/withきな複雑な問題、Meshmixer、Netfabb、MeshLabなど専用ツール必要at/in/withす。
直径40mm、High30mm円柱、底面から45度角度at/in/with傾けてbuildします。support密度15%、Layer Height0.2mm仮定して、おおよそsupport材料体productestimationしてくだ。
answerprocess:
答え: approximately1,000 mm³ (990 mm³)
actual践的考察:
High60mmbuild物、品質hoursバランス考慮してbuildします。Layer Height0.1mm、0.2mm、0.3mm3つ選択肢ある場合、それぞれBuild Time比Recommended Use説明してくだ。
answer:
| Layer Height | レイヤー数 | hours比 | 品質 | Recommended Use |
|---|---|---|---|---|
| 0.1 mm | 600layers | ×3.0 | 非常High | 展示用Figurines, medical models, end-use parts |
| 0.2 mm | 300layers | ×1.0(基準) | 良好 | General prototypes, functional parts |
| 0.3 mm | 200layers | ×0.67 | Low | 初期プロトタイプ、Strength優先内部parts |
hours比計算根拠:
actual践的な選択基準:
variableLayer Height(Advanced):
PrusaSlicerandCuravariableLayer HeightFunction使えば、平坦部0.3mm、曲面部0.1mm混在せて、品質hours両立可能。
航空宇宙用軽量ブラケット(アルミニウム合金、トポロジー最適化済み複雑形状、High Strength・軽量要求)製造最適なAMprocess選択し、そreason3つ挙げてくだ。また、考慮すべきPost-processing2つ挙げてくだ。
最適process: LPBF (Laser Powder Bed Fusion) - SLM for Aluminum
選択reason(3つ):
必要なPost-processing(2つ):
追加考慮事項:
actualExample: Airbus A350チタンブラケット
従来32parts組立ててたブラケット1parts統合、重量55%reduction、リードタイム65%短縮、コスト35%reduction達成。
DOE利点(conventional methodcomparison):
追加利点:
next/order条件at/in/withLi₁.₂Ni₀.₂Mn₀.₆O₂(リチウムリッチ正極材料)合成するTemperatureprofile設計してくだ:
Temperatureprofile(heating rate、holdingTemperature・hours、cooling rate)、そ設計reason説明してくだ。
推奨Temperatureprofile:
Phase 1: 予備heating(Li₂CO₃minutes解)
Phase 2: Medium間heating(前駆体形成)
Phase 3: number of焼成(目的相合成)
Phase 4: 冷却
設計重要ポイント:
全体所要hours: approximately30hours(heating12h + holding18h)
代替手法検討:
以下データから、反応機構estimationし、activation energy計算してくだ。
actual験データ:
| Temperature (°C) | 50%reaction attainmenthours t₅₀ (hours) |
|---|---|
| 1000 | 18.5 |
| 1100 | 6.2 |
| 1200 | 2.5 |
| 1300 | 1.2 |
Janderequation/formula仮定した場合: [1-(1-0.5)^(1/3)]² = k·t₅₀
answer:
step1: rate constantk計算
Janderequation/formulaat/in/with α=0.5 き:
[1-(1-0.5)^(1/3)]² = [1-0.794]² = 0.206² = 0.0424
したって k = 0.0424 / t₅₀
| T (°C) | T (K) | t₅₀ (h) | k (h⁻¹) | ln(k) | 1000/T (K⁻¹) |
|---|---|---|---|---|---|
| 1000 | 1273 | 18.5 | 0.00229 | -6.080 | 0.7855 |
| 1100 | 1373 | 6.2 | 0.00684 | -4.985 | 0.7284 |
| 1200 | 1473 | 2.5 | 0.01696 | -4.077 | 0.6788 |
| 1300 | 1573 | 1.2 | 0.03533 | -3.343 | 0.6357 |
step2: Arrheniusplot
ln(k) vs 1/T plot(線形times/iterations帰)
線形フィット: ln(k) = A - Eₐ/(R·T)
傾き = -Eₐ/R
線形times/iterations帰計算:
slope = Δ(ln k) / Δ(1000/T)
= (-3.343 - (-6.080)) / (0.6357 - 0.7855)
= 2.737 / (-0.1498)
= -18.27
step3: activation energy計算
slope = -Eₐ / (R × 1000)
Eₐ = -slope × R × 1000
Eₐ = 18.27 × 8.314 × 1000
Eₐ = 151,899 J/mol ≈ 152 kJ/mol
step4: 反応機構考察
step5: 検証方法提案
最終結論:
activation energy Eₐ = 152 kJ/mol
estimation機構: 界面反応律speed、また微細粒子systemat/in/with拡散律speed
追加actual験推奨れる。
第4章at/in/withproductlayersbuild(AM)基礎して、ISO/ASTM 52900よる7つprocessCategory、STL File形equation/formula構造、スライシングG-code基number of学びました。next/order第2章at/in/with、Material Extrusion(FDM/FFF)詳細なbuildprocess、材料特性、processパラメータ最適化つて学びます。