ccitonline.com

CCIT – Cara Cerdas Ingat Tuhan

| AI.DAI5 | DAI5 eBook Free Download | CFDSOF | VisualFOAM | PT CCIT Group Indonesia | 8N8 |

Memahami Konsep dan Algoritma PINN dalam penyelesaian Heat Conduction 1D dengan konsep DAI5 – Rafi Evansyah A.S (2306238776)

Assalaamu’alaikum wa rahmatullahi wa barakaatuh, perkenalkan saya Rafi Evansyah (2306238776), Pada kesempatan kali ini, saya akan membahas tentang konsep PINN atau Physical-Informed Neural Network. PINN adalah sebuah konsep yang menggabungkan pembelajaran mesin yang menggabungkan pendekatan atau fungsi fisika dengan jaringan saraf tiruan atau NN. PINN digunakan untuk melibatkan PDE atau ODE.

Konsep Dasar

  1. Jaringan Saraf digunakan untuk memodelkan solusi dari suatu sistem fisik yang menggunakan input koordinat X,Y,Z dengan waktu (t).
  2. Fungsi PINN dalam bentuk diferensial atau data.
  3. Fungsi Loss diperoleh dari selisih antara prediksi jaringan dan persamaan fisika.

Keunggulan

  1. Tidak butuh terlalu banyak data
  2. Digunakan untuk banyak permasalahan (ODE/PDE).
  3. Akurat dibanding simulasi fisika.

Sebelum memahami konsep tersebut, kita perlu meng-korelasikan konsep diatas kedalam framework DAI5.

  1. Deep Awareness of I : Kita menyadari bahwa konsep diatas mempunyai banyak keunggulan yang perlu kita pahami.
  2. Intention : Dengan kesadaran diatas, kita menyadari adanya keperluan untuk mempelajari konsep PINN. Selanjutnya kita meniatkan pembelajaran ini untuk mengerjakan Heat Conduction 1 Dimension menggunakan konsep PINN tersebut. Saya berniat juga menerapkan menyelesaikan masalah diatas dengan lebih efisien, akurat, dan memungkinkan saya untuk menyelesaikan permasalahan lain dengan konsep PINN tersebut.
  3. Initial Thinking : Setelah sadar akan tujuan dan niat saya, kita perlu menemukan bagaimana cara menyelesaikan HC 1D dengan PINN. Disitulah ketika saya menemukan rumus dasarn HC 1D :

Dengan rumus diatas, dapat kita aplikasikan ke konsep PINN, dan inilah inisiasi kita

4. Idealization : Untuk konsep PINN sendiri, saya mencari tahu bahwa konsep ini memadukan antara konsep fisika dengan jaringan saraf buatan. Konsep PINN sendiri banyak digunakan untuk permasalahan ODE ataupun PDE. Konsep PINN sendiri dapat digunakan salah satunya dalam permasalahan CFD dan itulah yang sedang saya kerjakan.

      5. Instruction Set : Untuk memulai perjalanan diatas, kita tentunya memerlukan set untuk mengetahui apa yang ingin kita kerjakan dan cara mencapainya. Namun, sebelumnya kita perlu untuk berdoa kepada Allah SWT untuk diberi kemudahan dalam pengerjaan. Setelah itu baru kemudian kita membuat instruction set yang kurang lebih terdiri dari :

      1. Definisi domain dan kondisi batas
      2. Membangun model neural network
      3. Definisi physics – informed loss function
      4. Optimizer
      5. Visualisasi

      Langsung saja kita mulai pengerjaan.

      • Pembuatan Domain dan kondisi batas : Kita Perlu untuk membuat grif x dan t dalam rentang 0 – 1. Kita juga perlu untuk membuat kondisi awal T(x,0) = sin (phiX), kita tentukan nilai suhu setiap titik awal. Untuk kondisi batas, kita tetapkan T (0,t) = 0 dan T(1,t) = 0 di semua waktu.
        • Berikut Kode phyton nya :

      import numpy as np

      Parameter domain

      N_x = 50 # Jumlah titik ruang
      N_t = 50 # Jumlah titik waktu
      x = np.linspace(0, 1, N_x)
      t = np.linspace(0, 1, N_t)
      X, T = np.meshgrid(x, t) # Meshgrid untuk titik (x,t)
      XT_train = np.hstack((X.flatten()[:, None], T.flatten()[:, None]))

      Kondisi awal: T(x,0) = sin(pi*x)

      T_initial = np.sin(np.pi * x)
      XT_initial = np.hstack((x[:, None], np.zeros_like(x[:, None])))

      Kondisi batas: T(0,t) = T(1,t) = 0

      XT_bc = np.vstack((np.hstack((np.zeros_like(t[:, None]), t[:, None])),
      np.hstack((np.ones_like(t[:, None]), t[:, None]))))

      T_bc = np.zeros((XT_bc.shape[0], 1))

      • Membangun Model Neural Network

      Membuat jaringan saraf dengan beberapa hidden layer, dengan input : x,t dan output : T(x,t). Kita gunakan 3 hidden layer. Berikut kode nya :

      import tensorflow as tf

      class PINN(tf.keras.Model):
      def init(self):
      super(PINN, self).init()
      self.hidden1 = tf.keras.layers.Dense(20, activation=’tanh’)
      self.hidden2 = tf.keras.layers.Dense(20, activation=’tanh’)
      self.hidden3 = tf.keras.layers.Dense(20, activation=’tanh’)
      self.output_layer = tf.keras.layers.Dense(1, activation=None)

      def call(self, inputs):
          x = self.hidden1(inputs)
          x = self.hidden2(x)
          x = self.hidden3(x)
          return self.output_layer(x)

      Inisialisasi model

      pinn = PINN()

      • Definisi Physics-Informed Loss Function

      Menghitung turunan terhadap x,t,dan x kuadrat. Setelah itu kita hitung residual loss dari pesamaan konduksi panas dan kita tambahkan loss kondisi awal dan batas.

      Berikut kode phyton nya:

      alpha = 0.01 # Difusivitas termal

      def compute_loss():
      with tf.GradientTape(persistent=True) as tape:
      tape.watch(XT_train)
      T_pred = pinn(XT_train)
      T_x_t = tape.gradient(T_pred, XT_train) # โˆ‚T/โˆ‚x dan โˆ‚T/โˆ‚t

          T_x = T_x_t[:, 0:1]  # โˆ‚T/โˆ‚x
          T_t = T_x_t[:, 1:2]  # โˆ‚T/โˆ‚t
      
          T_xx = tape.gradient(T_x, XT_train)[:, 0:1]  # โˆ‚ยฒT/โˆ‚xยฒ
      
          residual = T_t - alpha * T_xx  # Persamaan konduksi panas
          loss_pde = tf.reduce_mean(tf.square(residual))
      
      # Loss kondisi awal
      T_pred_initial = pinn(XT_initial)
      loss_ic = tf.reduce_mean(tf.square(T_pred_initial - T_initial[:, None]))
      
      # Loss kondisi batas
      T_pred_bc = pinn(XT_bc)
      loss_bc = tf.reduce_mean(tf.square(T_pred_bc - T_bc))
      
      total_loss = loss_pde + loss_ic + loss_bc
      return total_loss
      • Optimizer : Kita gunakan untuk meminimalisir fungsi loss
      • Visualisasi : Kita buatkan prediksi suhu T (x,t) menggunakan model dan kita gunakan kontur plot untuk melihat hasil dengan kode :

      import tensorflow as tf
      import numpy as np
      import matplotlib.pyplot as plt

      Set parameter fisika

      alpha = 0.01 # Difusivitas termal

      Generate data latih (collocation points)

      N_x = 50 # Jumlah titik ruang
      N_t = 50 # Jumlah titik waktu
      x = np.linspace(0, 1, N_x)
      t = np.linspace(0, 1, N_t)
      X, T = np.meshgrid(x, t)

      Konversi ke Tensor

      XT_train = tf.convert_to_tensor(np.hstack((X.flatten()[:, None], T.flatten()[:, None])), dtype=tf.float32)

      Kondisi awal: T(x,0) = sin(pi*x)

      T_initial = np.sin(np.pi * x)
      XT_initial = tf.convert_to_tensor(np.hstack((x[:, None], np.zeros_like(x[:, None]))), dtype=tf.float32)
      T_initial = tf.convert_to_tensor(T_initial[:, None], dtype=tf.float32)

      Kondisi batas: T(0,t) = T(1,t) = 0

      XT_bc = np.vstack((np.hstack((np.zeros_like(t[:, None]), t[:, None])),
      np.hstack((np.ones_like(t[:, None]), t[:, None]))))

      XT_bc = tf.convert_to_tensor(XT_bc, dtype=tf.float32)
      T_bc = tf.convert_to_tensor(np.zeros((XT_bc.shape[0], 1)), dtype=tf.float32)

      Model PINN

      class PINN(tf.keras.Model):
      def init(self):
      super(PINN, self).init()
      self.hidden1 = tf.keras.layers.Dense(20, activation=’tanh’)
      self.hidden2 = tf.keras.layers.Dense(20, activation=’tanh’)
      self.hidden3 = tf.keras.layers.Dense(20, activation=’tanh’)
      self.output_layer = tf.keras.layers.Dense(1, activation=None)

      def call(self, inputs):
          x = self.hidden1(inputs)
          x = self.hidden2(x)
          x = self.hidden3(x)
          return self.output_layer(x)

      Inisialisasi model

      pinn = PINN()
      optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)

      Fungsi loss

      def compute_loss():
      with tf.GradientTape(persistent=True) as tape:
      tape.watch(XT_train)
      T_pred = pinn(XT_train)
      T_x_t = tape.gradient(T_pred, XT_train) # โˆ‚T/โˆ‚x dan โˆ‚T/โˆ‚t

          T_x = T_x_t[:, 0:1]  # โˆ‚T/โˆ‚x
          T_t = T_x_t[:, 1:2]  # โˆ‚T/โˆ‚t
      
          T_xx = tape.gradient(T_x, XT_train)[:, 0:1]  # โˆ‚ยฒT/โˆ‚xยฒ
      
          residual = T_t - alpha * T_xx  # Persamaan konduksi panas
          loss_pde = tf.reduce_mean(tf.square(residual))
      
      # Loss kondisi awal
      T_pred_initial = pinn(XT_initial)
      loss_ic = tf.reduce_mean(tf.square(T_pred_initial - T_initial))
      
      # Loss kondisi batas
      T_pred_bc = pinn(XT_bc)
      loss_bc = tf.reduce_mean(tf.square(T_pred_bc - T_bc))
      
      total_loss = loss_pde + loss_ic + loss_bc
      return total_loss

      Training loop

      def train_pinn(epochs=500):
      for epoch in range(epochs):
      with tf.GradientTape() as tape:
      loss = compute_loss()
      gradients = tape.gradient(loss, pinn.trainable_variables)
      optimizer.apply_gradients(zip(gradients, pinn.trainable_variables))

          if epoch % 100 == 0:
              print(f"Epoch {epoch}: Loss = {loss.numpy()}")

      Latih model

      train_pinn()

      Prediksi hasil

      XT_test = tf.convert_to_tensor(np.hstack((X.flatten()[:, None], T.flatten()[:, None])), dtype=tf.float32)
      T_pred = pinn(XT_test).numpy().reshape(X.shape)

      Plot hasil

      plt.figure(figsize=(8, 6))
      plt.contourf(X, T, T_pred, levels=50, cmap=”jet”)
      plt.colorbar(label=”Temperature T(x,t)”)
      plt.xlabel(“x”)
      plt.ylabel(“t”)
      plt.title(“Hasil Simulasi Konduksi Panas 1D dengan PINN”)
      plt.show()

      Maka akan didapatkan visualisasi seperti :

      Sekian dari saya Wassalamualaikum warahmatullahi wabarakatuh.


      Leave a Reply

      Your email address will not be published. Required fields are marked *