COMSOLを用いた
最適化計算とパラメータ推定
橋口真宜、米大海 第1技術部 計測エンジニアリングシステム株式会社 COMSOL Multiphysics®日本総代理店 東京都千代田区内神田1-9-5 SF内神田ビル5F http://www.kesco.co.jp/ https://www.comsol.jp/ 2018年7月19日最適化とパラメタ推定
モデルの開発 解析解のある問題で妥当性を確認 Verification Validation 目的とする解析の実行と妥当性の確認 モデル~現象 仮想実験として利用し、よりよい性能を 出すための工夫を行う 最適化 モデルがパラメタを含む場合 パラメタ推定(物性値含む) 理論を利用 実験値を利用など モデル=現象 (挙動が一致するの意味) アプリの利用 M. Hashiguchi and D. Mi 2018 2COMSOL Multiphysics®
4 M. Hashiguchi and D. Mi 2018
COMSOL Multiphysics®
COMSOL 社(スウェーデン、ボストン)の開発製品です。 計測エンジニアリングシステム株式会社は日本国内販売総代理店です。 COMSOL Multiphysicsはマルチフィジックス解析環境を提供しています。 解析は主として有限要素法に基づいています。 (他に、有限体積法、境界要素法、粒子追跡も利用する場合もある) スウェーデンの数学者 当時、KTH (スウェーデン王立大学)の学生The company was founded in 1986. COMSOL Multiphysics® in 1998.
Germund Dahlquist
More than 460 employees in 21 officies worldwide.
参考資料検索キーワード http://www.kesco.co.jp/comsol/index.html 6
フィジックス(現在、28分野)
複数の連成解析が可能 PDE(偏微分方程式)との組み合わせも可能 M. Hashiguchi and D. Mi 2018COMSOL Multiphysics®の統合型GUIは
モデルビルダーとアプリケーションビルダーを用意している
モデル構築 モデル開発 アプリ化 教育革新・業務革新へCOMSOL Desktop 統合型GUI (プリ・任意のフィジックス・メッシュ・ソルバ・ポスト処理)
モデルビルダ アプリケーション ビルダ 任意の連成が可能 STLデータ吐き出しで 3Dプリンタへ サーバーにアップロードすれば、 タブレット端末などで利用も可能
最適化の理論
M. Hashiguchi and D. Mi 2018 8
参考:
Walter Frei, Optimization, COMSOL Conference 2017 Boston
リハーサルが必要
目的関数を設定し、グラフ表示あるいはパラメトリックスイープを利用して、 設計変数を変化させたとき、その範囲の中で、目的関数が 周囲に比べて小さく(大きく)なる箇所があるかどうかを、 確かめておく必要がある。 目的関数の妥当性 M. Hashiguchi and D. Mi 2018 10設計変数を決める
1)何を動かせるかをユーザーが決める 2)動かせる範囲をユーザーが決める
目的関数を決める
ユーザーが決める ユーザーが決める 最小化の例 最大化であれ ば、逆数の最 小化を考える。 計算! ここがよさそう! M. Hashiguchi and D. Mi 2018 12勾配がわかれば探索できる
𝑓 𝜒 + Δ𝜒 ~𝑓 𝜒 + 𝝏𝒇 𝝏𝝌 · Δ𝝌 設計変数の変動 に対して、関数の変化率 𝝏𝒇 𝝏𝝌 がわかれば探索できる。 𝝏𝒇 𝝏𝝌 ∆𝝌 (ベクトル) (行列)最適値があることを前提
χ1 χ2 f (u(χ1, χ2)) 最適値 初期値(初期設計) 関数形がわかる場合 関数形がわからない場合 M. Hashiguchi and D. Mi 2018 14イメージを持てばわかりやすい
χ1 χ2 利用できる 設計変数の空間 利用できない設計変数 の空間 χ1 制約条件: p(χ1, χ2) < 0設計変数の範囲を設定
χ1 χ2
拘束条件: p(χ1, χ2) < 0
どのような方法で探索するか
χ1 χ2
近似的勾配による方法
最も簡単な方法: 近似勾配
χ1 χ2 初期設計点 いくつかの点での関数値を 求め、それを利用して、 近似的な勾配を作成する最も簡単な方法: 近似勾配
χ1 χ2 初期設計点 この操作を繰り返して、 経路を作成していく。 M. Hashiguchi and D. Mi 2018 20最も簡単な方法: 近似勾配
χ1 χ2 初期設計点 繰り返しながら、関数値を 改善することを目指す。最も簡単な方法: 近似勾配
χ1 χ2 初期設計点 さらに進む M. Hashiguchi and D. Mi 2018 22どのような場合に使うか
目的関数、拘束条件に微分できないものを含む場合に使う。 設計変数が少ない場合に使う。 設計変数の数に応じて指数関数的に計算時間が増大する。 10個程度までの設計変数に対して利用する。 リメッシュを行う場合に使う。 リメッシュは目的関数の滑らかさを損なう。解析的勾配による方法
解析的勾配による方法
χ1 χ2
χ1 χ2 初期設計点
解析的勾配による方法
この方向に沿って 最適点を探す M. Hashiguchi and D. Mi 2018 26χ1 χ2
初期設計点
解析的勾配による方法
どのような場合に使うか
目的関数、拘束条件が微分できる場合に使う。 設計変数が多い場合に使う。 トポロジー最適化に利用する*。 *このセミナでは扱わない。興味をもった人は 京都大学西脇先生チームの研究を参照のこと。 http://www.osdel.me.kyoto-u.ac.jp/members/nishiwaki.html M. Hashiguchi and D. Mi 2018 28 https://www.jsme.or.jp/dsd/4.pdf利用可能なソルバー
近似勾配の利用 座標軸に沿って 乱数 解析的勾配計算なし 解析的勾配計算あり 随伴勾配 最小二乗問題 のみ適用数値実験
関数を最小化する点の算出
(1) 空間2D、スタディ:定常、完了 (2) ジオメトリで矩形(幅6、高さ6)を中心まわり に作成 (4) コンポーネント1:定義:変数 変数に以下を設定する (5) スタディを右クリックし、最適化を追加 (6)最適化の設定ウィンドウで、右記を設定 (7)スタディを右クリックし、計算実行 (8)1Dプロットグループでテーブルグラフ をプロットする。 (3) グローバル定義:パラメタで a,b を数値で定義 後程の制御変数および パラメタの設定の準備 名前をフルで記述関数の分布
M. Hashiguchi and D. Mi 2018 32
(0,0)で関数が最小になることがわかる この問題は検討対象にできる!
座標探索
開始点 最終点 f 5*a^2-6*a*b+5*b^2 最適化を利用する場合には、設計変数a,bを利用できるように、変数 において、fをa,bを使った表現式で記述する。探索軌跡の描画法
M. Hashiguchi and D. Mi 2018 34
ソルバを切りかえて計 算後は、ここを再度、 手動で選択のこと!
結果
Nelder-Mead 開始 終了 座標探索 開始 終了 BOBYQA 開始 終了 COBYLA 開始 終了結果(続き)
M. Hashiguchi and D. Mi 2018 36
モンテカルロ
別の関数形
(0,0)で関数が最小になることがわかる この問題は検討対象にできる!
一方で、関数形は接線不連続なので、 どういう結果になるか。
座標探索
開始点
この問題には座標探索が使えないことはよく知られている。 f abs(a+b)+3*abs(b-a)
ソルバーを変更してみる
f abs(a+b)+3*abs(b-a)
開始点 最終点
COBYLA
ソルバーを変更してみる
f abs(a+b)+3*abs(b-a) 開始点 最終点 Nelder-Mead 探索できた。 M. Hashiguchi and D. Mi 2018 40不連続性をもつ目的関数
各ソルバーの比較
座標探索 × Nelder-Mead ○ BOBYQA ×
COBYLA × SNOPT ○ MMA ○
バネ系
直列結合 並列結合
問題設定
𝑘 , 𝑘 を制御して、直列結合での節点の変位𝑥 , 𝑥 を目標値𝑥 , 𝑥 に
一致させる。𝐹は与える。
COMSOL Desktop
モデルビルダーを利用した実験
𝑥 = 1.8 𝑥 = 7.6
最適化ソルバの選択 (後程、実演)
グラフによる概観
𝑥 𝑥 𝑥 ~2, 𝑥 ~7 𝐹 = 2.5 𝑘 = 𝐹/𝑥 ~1.25 𝑘 = 𝑥 1 𝐹 − 𝑘1 ~0.5 とすると 後程わかるが、 ほぼ、正解! M. Hashiguchi and D. Mi 2018 46計算上の注意点
1.解析的勾配計算なしでは、動かない場合には上限を規定し、 いくつか試行錯誤のこと。 2.後述の解析的勾配計算の場合には、上限なしでも計算できた。 3.後述の最小二乗法では、設計変数の範囲を規定できないので、 問題によっては注意が必要である。実演
座標探索
5だとエラー になる。
COBYLA
モンテカルロ
最大反復回数1000まで探す。
範囲を狭めてみる 約2分
解析的勾配計算あり
MMA
MMA
https://slideplayer.com/slide/8948423/ Method of Moving Asymptotes
https://onlinelibrary.wiley.com/doi/epdf/10.1002/nme.1620240207 論文のダウンロード
目的関数と設計変数との関係
𝑘 + 𝑘 𝑢 + −𝑘 𝑢 = 0 −𝑘 𝑢 + 𝑘 𝑢 = 𝐹 𝑓 = 𝑓(𝑢 , 𝑢 ; 𝜒) 𝑥 → 𝑢 , 𝑥 → 𝑢 𝐾 = 𝑘 + 𝑘−𝑘 −𝑘𝑘 𝜕 𝜕𝑘 𝑘 + 𝑘 𝑢 + −𝑘 𝑢 − 0 = 0 𝜕 𝜕𝑘 −𝑘 𝑢 + 𝑘 𝑢 − 𝐹 = 0 𝜕 𝜕𝑘 𝑘 + 𝑘 𝑢 + −𝑘 𝑢 − 0 = 0 𝜕 𝜕𝑘 −𝑘 𝑢 + 𝑘 𝑢 − 𝐹 = 0 1 0 0 0 𝑢 𝑢 + 𝐾 𝜕𝑢 𝜕𝑘 𝜕𝑢 𝜕𝑘 = 0 0 1 −1 −1 1 𝑢 𝑢 + 𝐾 𝜕𝑢 𝜕𝑘 𝜕𝑢 𝜕𝑘 = 0 0 M. Hashiguchi and D. Mi 2018 60目的関数と設計変数との関係
𝐾 = 𝑘 + 𝑘−𝑘 −𝑘𝑘 𝜕𝑢 𝜕𝑘 𝜕𝑢 𝜕𝑘 = 𝐾 0 0 − 1 00 0 𝑢 𝑢 𝜕𝑢 𝜕𝑘 𝜕𝑢 𝜕𝑘 = 𝐾 0 0 − 1−1 −11 𝑢 𝑢 𝜕𝑓 𝜕𝑘 = 𝜕𝑓 𝜕𝑢 𝜕𝑢 𝜕𝑘 + 𝜕𝑓 𝜕𝑢 𝜕𝑢 𝜕𝑘 𝜕𝑓 𝜕𝑘 = 𝜕𝑓 𝜕𝑢 𝜕𝑢 𝜕𝑘 + 𝜕𝑓 𝜕𝑢 𝜕𝑢 𝜕𝑘感度計算と検証
先に導出した式を変数に定義し、COMSOLの数値解と比較し、一致を確認した。 解析的勾配計算ありでは、感度を表示できる。
随伴法による勾配計算の説明
この方法は、目的関数が解uの連続関数であると仮定して、微分 を解析的に計算する。 解uに関する有限要素法による方程式 設計変数𝝌に関する微分 展開 解uの設計変数𝜒による微分 公式を得る 目的関数𝑓(𝒖, 𝝌)の勾配を求める公式を得る 𝜕𝑓 𝜕𝝌 = 𝜕𝒖 𝜕𝝌 𝜕𝑓 𝜕𝒖 注意: ベクトル=テンソル・ベクトル、スカラ/ベクトル=ベクトル、ベクトル/ベクトル=テンソル寸法最適化
図形の問題
固定点 固定点 円周上に拘束された点 面積が最大となるには 𝑆 𝜃 = 1 2R × sin 𝜃 × 𝐴𝐵 𝐴 𝐵 𝑅 0 < 𝜃 < 𝜋 𝜃 = 𝜋 2 𝑥 = 𝑅 cos 𝜃 𝑦 = 𝑅 sin 𝜃 𝜃 を導入することで問題を簡潔に表現できる。最適化による最大化
手法の比較
座標探索 Nelder-Mead
マイクロ流路への応用
M. Hashiguchi and D. Mi 2018 68
ジオメトリをベジエ曲線で表現
ベジェ曲線はパラメタ化されており、 寸法最適化に利用される。
電気浸透流
電流、流体を計算
移動時間を算出
実際に化学種を流してみる
M. Hashiguchi and D. Mi 2018 70
2次元片持ち梁への応用
L 0 T 0 A点 X 上辺に境界荷重を受ける片持ち梁(左端固定)において、点Aでの変位を目標 値より小さくするという拘束条件下で質量(面積)を最小にする。 変位:solid.disp < 5 mm M. Hashiguchi and D. Mi 2018 72境界変形による形状最適化
https://www.comsol.jp/model/an-introduction-to-shape-optimization-in-comsol-46731 この範囲の境界形状を変更
形状変化を構造解析に反映するた めに、変形形状 を利用する
関数による形状変更による最適化
バーンスタイン曲線を利用
形状変更の際の拘束条件
バーンスタイン多項式による基底関数の利用
𝐵 = 𝐶 1 − 𝑥 + 𝐶 (𝑥) 𝐵 = 𝐶 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 𝐵 = 𝐶 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 0 1 0 1 . . . 𝐵 𝐵 ウィキペディア x=0とx=1を根にもつ多項式の組み合わせ M. Hashiguchi and D. Mi 2018 76関数への制限
𝐵 = 𝐶 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 1 − 𝑥 + 𝐶 𝑥 𝐶 =0 𝐶 < 𝐶 𝐶 = 0.9とする 今回は、 グローバルコントロール変数の 上限を設定する𝑑𝐵 (𝑋)/𝑑𝑋 > 0 長さ方向のいたるところで微係数を正に拘束する。 • 単調に減少する厚み • 左端での拘束 • 右端で規定した最大値を超えないこと
不等式拘束を追加する
不等式拘束 M. Hashiguchi and D. Mi 2018 78モデルビルダー
𝐶 < 0.9
ポイント和不等式拘束 ポイント毎の不等式拘束
計算結果
SNOPTによる計算結果(MMAでも同様な計算結果になった)
異なる方法での結果の比較
• 寸法最適化 – 明解 – 計算時間がかかる – 誰でも使える • 形状最適化 – セットアップが手間 – 自身での工夫を要する • トポロジー最適化 – 斬新なデザイン – 研究を要する – 解釈を必要とするデザイン – 自身で修練を積む必要あり最適化に関する記述について
伝熱問題での説明
5 cm 2 cm 1 cm 1 cm 𝑇 𝑄 𝑇 𝑄 断 熱 熱伝達 熱伝達 5 cm Tave2 Tave1 Tave3 目的:同一材料を3分割した材料の各領域の平均温度を指定値にしたい。 設計変数: 温度、境界熱源、熱伝達係数 最適化ソルバ:SNOPTモデルビルダ
平均温度の定義 形状作成 材料:銅 伝熱 境界条件 目的関数の記述の説明 最適化ソルバー 設計変数の設定 M. Hashiguchi and D. Mi 2018 84目的関数の記述について
目的関数を和として評価する場合、複数個所に分けて記述できる。
注意:変数名はフルで記述すること
目的関数の記述(続き)
ジオメトリックエンティティレベル毎に目的関数を記述し、 それらの和を目的関数として利用できる。
目的関数の構成
目的関数のスケーリング
目的関数は1の大きさになるようにするとよい。
𝜌
𝑀 𝑑𝑆 = 1
パラメタ推定
実験式のパラメタ推定
非線形材料の伸びλと印加圧力Pの関係式が与えられているが、 係数C10、C01を推定したい。
モデルビルダ
実験値を用意する
実験値の第1列に相当するパラメタが、 COMSOL側の変数lambdaに対応すると 決める 実験値の第2列が、COMSOL側の変数 Pに対応すると決める (実験値を外部ファイルから読み込む 場合は、後ほど説明する) 実験値をマニュアルで入力する。 M. Hashiguchi and D. Mi 2018 94ソルバー
Levenberg-Marquardt
計算結果の検証
実験値を表示する 変数を利用できる。
伝熱モデルで材料を推定してみる
𝑇 以外の境界条件を固定し、𝑇 を変化させたときの温度を算出し、 それらを実験データとする。
数値実験データの作成
(1)データ採取点を下図のように決める。(ジオメトリでポイント作成) (2) スタディ1にパラメトリックスイープを追加し、 温度T1を変化させる。 (3) 結果:計算値で上述の3点を選び、ポイント評価をし、 クリップボードにコピー後、エクセルにペーストする。 (4) エクセルファイルを保存しておく。 ここからcsvファイルを作成し、それをファイルとして読み込む。 M. Hashiguchi and D. Mi 2018 98パラメタ推定
測定点の情報を取り出す
あとでプロットする ときの名前(任意)
結果
真値400 W/(m・K)に対して405.26 (1.3%の誤差) <面白いこと> 外部ファイルからではなく、結果テーブルを 利用すると、400と正確値が算出される。 従って、Verificationを最も正確に行う場合 には、結果テーブルを利用する方が良い。 テーブルのフル精度表示による出力も可。 M. Hashiguchi and D. Mi 2018 100 このことを避けるためには 次ページのフル精度表示を行った 上で、外部ファイルに吐き出せば良い。テーブルのフル精度表示
(1) 外部ファイル(csv)へのテーブル出力の前に、
フル精度ボタンをクリックすることで、表示桁をフル精度に変更できる。
(2) 正確値を推定できる。
時系列データが与えられた場合
伝熱への応用
Ed Fontes https://www.comsol.jp/video/using-the-optimization -module-for-parameter-estimation 温度測定データ T(t) 温度の時系列データから熱伝導係数を推定するモデルビルダ
結果
化学工学への応用
温度の異なる 5種類の時系列 データを読み込む
結果
計算時間 19秒
アプリ
モデルビルダ
外部ファイル(.csv)を読み込む
音振動とプログラミング
アプリケーションライブラリ
アプリによる概要説明
モデルビルダーでアプリケーションビルダーを クリックすればそちらへ移行する アプリの実行のみを行う場合 問題説明、理論、参考文献、操作手順、結果の説明など M. Hashiguchi and D. Mi 2018 114すぐに計算に取り掛かれる
モデルの内容を見る
アプリケーションでない項目の例題は「開く」でモデルビルダーを表示する。 モデルビルダへ モデルビルダーでアプリケーションビルダーを クリックすればそちらへ移行する アプリの実行のみを行う場合 問題説明、理論、参考文献、操作手順、結果の説明など M. Hashiguchi and D. Mi 2018 116モデルビルダーの内容
最適化がない! 何故?
割線法(セカント法)
𝑓 𝑥 = 0 となる𝑥 を求める。 𝑥 = 𝑥 − 𝑓(𝑥 ) 𝑥 − 𝑥 𝑓 𝑥 − 𝑓(𝑥 ) 𝑓 𝑥 = 𝑓 𝑥 + 𝑥 − 𝑥 ~𝑓 𝑥 + 𝑓 (𝑥 )(𝑥 − 𝑥 ) いま、𝑓 𝑥 = 0 となったとすると 𝑓 𝑥 + 𝑓 𝑥 𝑥 − 𝑥 = 0 𝑥 = 𝑥 − 𝑓(𝑥 ) 𝑓 (𝑥 ) これはニュートン法であり、 関数値と関数の微分値の 両方の計算が必要である。 𝑓 𝑥 = 𝑓 𝑥 − 𝑓(𝑥 ) 𝑥 − 𝑥 後退差分で近似 𝑓の計算のみで済む (計算速度が速い) M. Hashiguchi and D. Mi 2018 118アプリケーションビルダへ
ここを分析して みる
FEMを介した代数方程式
FEMの役目 構造物の腕の長さLを決めて、その固有振動数fを計算する 関数化 frequency( 引数 L ) こうすれば、長さLの構造物の固有振動数frequency(L)を目標値targetfqに 一致させたいという要求は、見かけ上、次の代数方程式で表現できる。 ただし、𝑓(𝐿) = frequency L − targetfq 𝑓(𝐿) = 0 数値解法として、セカント法を利用すれば、Lを求めることができる。 COMSOLではアプリケーションビルダのメソッドエディタで プログラムを実装できる。 M. Hashiguchi and D. Mi 2018 120FEMの関数化
// Function used in compute_and_play method // Syntax: double f = frequency(double L)
model.param().set("Lp", pronglength); model.study("std1").run();
set_results(); // in case there was no solution included in the application file
double[][] d = model.result().numerical("gev1").getReal(); f = d[0][0]; メソッド frequency Lpにpronglengthの数値をセットする FEMの実行 計算された固有周波数をfとする
セカント法
long t0 = timeStamp(); // 計算時間の記録の初期化
solution_state = "nosolution"; // showProgress();
if (findlength) { // findlength declared variable linked to check box in main form
setProgress(0, "Computing prong length."); // セカント法の開始:
int MAXITERATIONS = 20; // 最大反復回数
double L1 = 85; // 長さの初期値 20 Hz<fq<10,000 Hz. double L2 = 60; // 長さの初期値 20 Hz<fq<10,000 Hz. double carry = L1; carryにL1をコピーしておく
double f2 = frequency(L2)-targetfq; // L2に対するFEM計算結果でf(L2)を計算 setProgress(100/MAXITERATIONS); // プログレスバーの設定 fq = frequency(L1); // 画面表示用の変数、L1に対するFEM計算結果をfqとする setProgress(20); メソッド b_solved_and_update_results M. Hashiguchi and D. Mi 2018 122
セカント法(続き)
double f1 = fq-targetfq; //f(L1)を計算
L1 = L1-f1*((L1-L2)/(f1-f2)); // セカント法 L2 = carry; //caryyの内容をL2にコピー
L1 = Math.max(L1, 1e-3); //Javaの数学ライブラリの最大値計算関数
int k = 2; //整数kを2とする
while (k < MAXITERATIONS && Math.abs(f1) > fqtol) {
f2 = f1; //f1の内容をf2に置き換える fq = frequency(L1); //fqをL1でのFEM計算結果とする f1 = fq-targetfq; //f1を更新する carry = L1; // carryにL1をコピーする L1 = L1-f1*((L1-L2)/(f1-f2)); //新しいL1を算出する L2 = carry; //carryをL2にコピーする L1 = Math.max(L1, 1e-3); // k = k+1; setProgress(k*100/MAXITERATIONS); } 𝑥 = 𝑥 − 𝑓(𝑥 ) 𝑥 − 𝑥 𝑓 𝑥 − 𝑓(𝑥 ) 𝐿 𝐿 𝐿 𝐿 carry secant 𝑓 𝑓 𝑓 𝑓 FEM FEM FEM 反復計算
セカント法(続き)
L1 = Math.round(L1*100)/100.00; // we won't get more than 2 decimal accuracy (mesh limits the accuracy rather than the secant method)
model.param().set(“Lp”, L1); グローバル定義:パラメタLpへの収束値L1のセット
fq = fq; 収束値L1に対応する固有周波数のセット
if (Math.abs(f1) > fqtol) {
error("Computation terminated after "+toString(MAXITERATIONS)+" iterations. Frequency diff: "+toString(Math.abs(f1)));
} }
else { // "Find prong length" check box is cleared in main form
setProgress(0, "Computing frequency."); setProgress(25);
fq = frequency(model.param().evaluate("Lp")); setProgress(75);
}
セカント法(続き)
with(model.result("pg1"));
set("looplevel", new String[]{"7"}); // The first real eigenfrequency always the 7th computed eigenfrequency in solid mechanics
endwith();
model.result().numerical("gev1").setResult();
useGraphics(model.result(“pg1”), “graphics1”); ウィンドウ(graphics1)への表示 zoomExtents(“graphics1”); 長さが変わったので画面にフィットさせる
setProgress(100); プロセス100%とする
play_sound(); 音を出す
model.setLastComputationTime(timeStamp()-t0); // record computation time solution_state = "solutionexists";
closeProgress();
参考
COMSOL のVideo教材やBLOGはぜひご覧ください。