Assalamualaikum Warrohmatullahi Wabarokatuh
Selamat pagi, siang, sore, atau malam Pak DAI dan teman-teman semua. Pada blog ini saya ingin menceritakan pengalaman saya belajar Physics Informed Neural Network (PINN) dengan menggunakan DAI5. Namun, sebelum memulai pembahasan di blog ini, saya mengajak kepada seluruh pembaca ini untuk senantiasa bersyukur kepada Sang Pencipta yang telah memberikan kita kenikmatan dan kekuatan untuk terus menuntut ilmu dan mempelajari segala ciptaan-Nya.
Sebagai mahasiswa teknik mesin, saya cukup sering melakukan simulasi untuk keperluan studi saya. Untuk melakukan simulasi, tentunya saya harus melakukan pemodelan dari suatu kondisi yang ingin kita analisis. Pemodelan fenomena fisik sering kali dilakukan dengan metode numerik seperti Metode Elemen Hingga (FEM) atau Computational Fluid Dynamics (CFD). Physics-Informed Neural Network (PINN) hadir sebagai pendekatan alternatif untuk menerapkan prinsip-prinsip fisika ke dalam jaringan saraf tiruan.
Untuk memahami dan mempelajari PINN secara lebih sistematis, saya menggunakan framework DAI5, yang terdiri dari lima langkah inti, yakni Deep Awareness of I, Intention, Initial Thinking, Idealization, dan Instruction Set. Framework ini tidak hanya membantu dalam pendekatan teknis terhadap suatu masalah, tetapi juga menekankan kesadaran diri, niat, dan keterhubungan dengan prinsip-prinsip mendasar dalam pemecahan masalah.
1. Deep Awareness of I:
Physics-Informed Neural Network (PINN) merupakan salah satu pendekatan perhitungan pemodelan persamaan fisika melalui jaringan saraf buatan. Dengan mempelajari metode ini, saya memiliki harapan untuk bisa memahami segala konsep yang dimuat dalam metode ini beserta dengan segala keterkaitannya agar bisa saya terapkan dalam studi saya. Dengan kesadaran yang saya miliki ini, saya terdorong untuk menyadari tujuan utama dalam mempelajari PINN, yaitu tidak hanya sekadar memahami teori, tetapi juga melihat bagaimana teknologi ini dapat digunakan untuk memberikan manfaat lebih luas dalam bidang teknik mesin dan rekayasa.
2. Intention:
Saya ingin untuk memahami PINN secara mendalam agar saya dapat mengaplikasikannya dalam simulasi atau pemodelan yang saya buat dengan efisien. Jikalau saya memiliki kesulitan, niat ini membantu saya tetap fokus dan tidak mudah menyerah ketika menghadapi tantangan dalam memahami konsep-konsep kompleks dalam PINN. Selain itu, dengan niat yang kuat, saya juga lebih selektif dalam memilih sumber belajar, memastikan bahwa setiap materi yang saya pelajari benar-benar relevan dengan tujuan saya. Niat ini juga membuat saya lebih disiplin dalam mengalokasikan waktu untuk mempelajari PINN secara sistematis.
3. Initial Thinking:
Saya memulai untuk mempelajari teori dasar neural network, hal yang mendasari PINN. Kemudian, barulah saya mencari referensi-referensi pembelajaran mengenai PINN. Di sini saya menyadari betapa fleksibel dan efisien metode PINN yang sekaligus menjadi alasan mengapa metode ini lebih unggul dibanding metode lainnya. Saya coba kaitkan PINN ini dengan 1D Heat Conduction. PINN ini bekerja menggunakan Partial Differential Equation (PDE) yang mana digunakan juga untuk persamaan panas pada heat conduction.
4. Idealization:
Saya mulai mencari cara bagaimana untuk menerapkan PINN untuk memprediksi distribusi suhu sepanjang batang 1D. Dengan keunggulan-keunggulan yang dimiliki PINN, saya rasa saya bisa melakukan simulasi dengan jauh lebih efisien. Saya juga bisa meminimalisisasi kendala yang saya hadapi saat menggunakan metode numerik biasa.
5. Instruction Set:
Untuk membantu saya dan teman-teman yang lain belajar mengenai PINN, Pak DAI memberi kami sebuah coding tentang PINN yang bisa kami jalankan. Kode ini merupakan implementasi Physics-Informed Neural Network (PINN) untuk menyelesaikan masalah konduksi panas tunak 1D dengan kondisi batas tertentu.
Mendefinisikan jaringan saraf:
class PINN(nn.Module):
def __init__(self):
super(PINN, self).__init__()
self.net = nn.Sequential(
nn.Linear(1, 20),
nn.Tanh(),
nn.Linear(20, 20),
nn.Tanh(),
nn.Linear(20, 1)
)
def forward(self, x):
return self.net(x)
- Jaringan saraf digunakan untuk memprediksi distribusi suhu pada batang 1D.
- Terdiri dari 3 lapisan tersembunyi dengan masing-masing 20 neuron dan fungsi aktivasi Tanh.
- Input jaringan ini adalah x (koordinat posisi batang), dan output-nya adalah T(x) (temperatur di posisi x).
Fungsi Loss:
def compute_loss(model, x, T0, T1):
x = x.requires_grad_(True)
T = model(x)
# Menghitung turunan pertama dan kedua terhadap x
dT_dx = torch.autograd.grad(T, x, grad_outputs=torch.ones_like(T), create_graph=True)[0]
d2T_dx2 = torch.autograd.grad(dT_dx, x, grad_outputs=torch.ones_like(dT_dx), create_graph=True)[0]
# Loss berdasarkan hukum fisika (d^2T/dx^2 = 0)
physics_loss = torch.mean(d2T_dx2**2)
# Loss untuk kondisi batas
T_left = model(torch.tensor([[0.0]], dtype=torch.float32))
T_right = model(torch.tensor([[1.0]], dtype=torch.float32))
bc_loss = (T_left - T0) ** 2 + (T_right - T1) ** 2
return physics_loss + bc_loss
- Physics Loss: PINN memodelkan persamaan diferensial konduksi panas tunak 1D yang Dihitung dengan menggunakan diferensiasi otomatis (autograd) di PyTorch:

- Boundary Condition Loss: Memastikan nilai suhu di ujung batang sesuai dengan yang diberikan, yaitu:

- Total loss adalah penjumlahan dari kedua loss di atas.
Fungsi Pelatihan (Training):
def train_pinn(T0, T1, epochs=1000):
model = PINN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
x = torch.linspace(0, 1, 100).reshape(-1, 1).float()
for epoch in range(epochs):
optimizer.zero_grad()
loss = compute_loss(model, x, T0, T1)
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f"Epoch {epoch}, Loss: {loss.item():.6f}")
return model
Plot Hasil Prediksi PINN vs Solusi Analitik:
def plot_results(model, T0, T1):
x = torch.linspace(0, 1, 100).reshape(-1, 1).float()
with torch.no_grad():
T_pred = model(x).numpy()
x = x.numpy()
T_analytical = T0 + (T1 - T0) * x # Solusi analitik konduksi panas 1D
plt.figure(figsize=(8, 6))
plt.plot(x, T_pred, label="PINN Solution")
plt.plot(x, T_analytical, '--', label="Analytical Solution")
plt.xlabel("x")
plt.ylabel("Temperature")
plt.title("1D Steady-State Heat Conduction")
plt.legend()
plt.grid(True)
plt.show()
- Membuat prediksi suhu dari PINN
- Menghitung solusi analitik:

- Menampilkan hasil dalam grafik
GUI (Graphical User Interface):
class PINNApp:
def __init__(self, root):
self.root = root
self.root.title("PINN 1D Heat Conduction Solver")
# Input Suhu Batas
ttk.Label(root, text="T0 (Left Boundary, ยฐC):").grid(row=0, column=0, padx=5, pady=5)
self.T0_entry = ttk.Entry(root)
self.T0_entry.grid(row=0, column=1, padx=5, pady=5)
self.T0_entry.insert(0, "100")
ttk.Label(root, text="T1 (Right Boundary, ยฐC):").grid(row=1, column=0, padx=5, pady=5)
self.T1_entry = ttk.Entry(root)
self.T1_entry.grid(row=1, column=1, padx=5, pady=5)
self.T1_entry.insert(0, "0")
ttk.Label(root, text="Epochs:").grid(row=2, column=0, padx=5, pady=5)
self.epochs_entry = ttk.Entry(root)
self.epochs_entry.grid(row=2, column=1, padx=5, pady=5)
self.epochs_entry.insert(0, "1000")
# Tombol Solve
self.solve_button = ttk.Button(root, text="Solve & Plot", command=self.solve)
self.solve_button.grid(row=3, column=0, columnspan=2, pady=10)
def solve(self):
try:
T0 = float(self.T0_entry.get())
T1 = float(self.T1_entry.get())
epochs = int(self.epochs_entry.get())
model = train_pinn(T0, T1, epochs)
plot_results(model, T0, T1)
except ValueError:
messagebox.showerror("Error", "Please enter valid numerical values.")
Ketika code ini dijalankan, akan keluar sebuah box yang memungkinkan kita untuk memasukkan angka untuk menentukan initial condition (T0 & T1) simulasi 1D heat conduction.

Kemudian, terdapat box yang bertuliskan epochs. Epoch adalah satu siklus penuh di mana seluruh dataset digunakan untuk melatih model sekali. Dalam konteks training neural network, satu epoch berarti model telah melihat seluruh data sebanyak satu kali dan melakukan pembaruan bobot berdasarkan error yang dihitung. Dalam kasus PINN, jumlah epoch yang optimal penting untuk memastikan model bisa memahami hukum fisika dengan baik tanpa overfitting.
Epoch: 1000

Epoch: 3000

Epoch: 5000

Epoch: 10000
