【実践pythonコード】AIによるCAEサロゲートモデルの作り方

シミュレーション

AIとCAEを組み合わせることで、製品開発をより効率よく回す試みが進められています。そのなかでも、CAEソルバを代替するサロゲートモデルが最も注目されています。

今回は、CAE結果からサロゲートモデルを実際に作成してみた手順を紹介します。

 [ad]

サロゲートモデルとは?

AIにCAE結果を学習させることで作る、CAEソルバを代替するモデルをサロゲートモデルと呼びます。

サロゲートモデルを開発するうえで実施するべきは、以下の2つです。

・CAE結果を用意する
・機械学習モデルをコーディングする

今回は、CFDの結果と、LightGBMという機械学習モデルを用いて、シンプルなサロゲートモデルを作る手順を紹介します。

サロゲートモデルのメリットは?

サロゲートモデルを用いるメリットは、主に予測時間の短縮です。

CAEは、微分方程式の繰り返し計算を行うため、モデルが大きいほど計算時間が長くなります。いくつかの設計案を試すには、その都度、長い時間をかけて計算をする必要があります。

一方、サロゲートモデルは、機械学習モデルを一度構築してしまえば、任意の設計を試す時間は一瞬なので、より効率よく製品開発を行うことができます。

また、サロゲートモデルは複雑なCAEソフトウェアの操作なしで計算結果を得られるため、忙しい設計者の電卓として、CAE専任者が設計者に提供する価値もあると考えます。

CAE結果を用意する

今回は、上のテーブルのような、簡単なCAEモデルの結果をまとめた数値データを用います。(このテーブルデータはここにアップロードしました)

テーブルデータの中身を具体的に説明します。

円筒の中に物体(青)が設置されています。円筒と物体の寸法をfai, L, d, xを様々変えて、この管の内部に発生する圧力差をPを計算しました。今回は、98種類の計算を実施し、テーブルにまとめています。



機械学習モデルをコーディングする

では、サロゲートモデルを作りましょう。

CAE結果データをインプットとして、以下のコードによってlightGBMのサロゲートモデルを作ります。

lightGBMは機械学習の勾配ブースティング手法です。コードの詳しい説明はこちらの記事に記載してありますので参考にどうぞ。

import pandas as pd
import numpy as np

import lightgbm as lgb
import seaborn as sns

data_all = pd.read_csv("../input/210718-cae-resultcsv/210718_cae_result.csv")

train = data_all[:80]
test = data_all[80:]

# 学習データ
train_x = train[["fai","L","d","x"]]
train_y = train[["P"]]

# テストデータ
test_x = test[["fai","L","d","x"]]
test_y = test[["P"]]

params = {
    "objective" : "regression",
    "metric" : "rmse",
    "num_leaves" : 40,
    "learning_rate" : 0.01,
    "bagging_fraction" : 0.8,
    "feature_fraction" : 0.4,
    "bagging_frequency" : 6,
    "bagging_seed" : 42,
    "verbosity" : -1,
    "seed": 42
}

train_lgb = lgb.Dataset(train_x, label=train_y)
test_lgb = lgb.Dataset(test_x, label=test_y)
evals_result = {}
model_lgb = lgb.train(params, train_lgb, 10000, 
                  valid_sets=[train_lgb, test_lgb], 
                  early_stopping_rounds=200, 
                  verbose_eval=1000, 
                  evals_result=evals_result)

pred_lgb = model_lgb.predict(test_x)

columns = ["pred_y"]
pred_d = pd.DataFrame(data=pred_lgb, columns = columns)
test_y_reindex = test_y.reset_index(drop=True)

sns.scatterplot(x=test_y_reindex['P'], y=pred_d['pred_y'])
sns.scatterplot(x=test_y_reindex['P'], y=test_y_reindex['P']) #perfect fitting line

モデルの精度を確認した結果が出力されます。

サロゲートモデルの予測と、CAEの結果が完全に一致する場合のオレンジの線に対して、青い点は少し誤差があることがわかります。

この誤差が十分に小さければ、CAE計算をすることなく、サロゲートモデルが十分活用可能であると判断できます。

未知の設計値について予測する

list_new = [[103,510,24,12],[101,505,22,11]]
test_new = pd.DataFrame(list_new)
test_new.columns = ["fai","L","d","x"] 

pred_lgb_new = model_lgb.predict(test_new)
test_new["pred"] = pred_lgb_new
test_new

任意の値について、その寸法で設計した際の圧力差を求めることができます。

やってみるとわかりますが、上記コードを実行するのには1秒もかかりません。CFD計算を回すより圧倒的に早いことがわかります。

コードの中身を少し変えるだけで、ご自身のデータでもモデルを作ることができます。ぜひ一度、試してみてください。

コメント

タイトルとURLをコピーしました