D2MatE top
計算材料学基礎 top
2024年度Q4 材料計算科学基礎
Fundamentals of Computational Materials Science 2024 Q4
News:
- 2025/1/22 07:34 1/21講義資料最終版アップロード
以前の更新
- 2025/1/20 11:08 1/21講義資料更新
- 2025/1/19 04:43 1/21講義資料アップロード
- 2025/1/14 21:03 1/14講義資料最終版更新
- 2025/1/14 06:29 1/14講義資料更新
- 2025/1/11 11:35 1/14講義資料アップロード
- 2025/1/11 04:31 1/10講義資料最終版更新
- 2025/1/09 13:00 1/10講義資料更新
- 2025/1/07 14:42 1/10講義資料アップロード
- 2025/1/06 12:59 本ページオープン
まとめ資料 (本ページ最後の講義資料のスライドを再構成したPowerPointファイル)
最終課題で学生が作ったプログラム
プログラムは全て動くものでした。機能追加、コードレビューなどを施した変更版を公開します
- matplotlibを使って迷路をつくるプログラム
変更点:
迷路を解くアニメーション機能を追加しました
- 学生実験のデータの最小二乗法のプログラムを改良
特徴: 既に存在するファイルを上書きせず、matplotlibのグラフファイルを保存するようにした。
また、決定係数R2を表示するようにした
変更点:
・ nargs == 2の場合はエラーになるので、usageを表示するようにした
・ パラメータ、決定係数の表示をplt.show()の前に移動し、グラフを見ながら結果を確認できるようにした
・ 入力ファイル名から、拡張子をはずしたbase_nameを取得する際に、os.path.splitext()で取得するように変更。
もとはfile_name.split('.')を使っていたが、この場合は拡張子が無い場合にエラーになる
・ 保存するグラフファイル名を探索する際にoutput_file_nameの試行ファイル名を2箇所で作っていたが、
一か所のコードにまとめた
- 学生実験の減衰挙動データをMaxwellモデルにフィッティングするプログラム
変更点:
非線形最小二乗法は初期値の推定が重要なので、以下の段階に分けて推定するようにした
1. 減衰データのベースライン (E0X0) の推定
最後の (最小の) stressの値に0.9を掛けて推定値とする
2. 緩和時間の推定
緩和時間 eta
は初期時に最小値を取り、最後のデータで最大値を取ります。
そこで、最初の5点と最後の5点を使って最小二乗法でetaの最小値と最大値を推定します。
この時、log(stress - E0X0) と tの線形最小二乗法を行い、傾きからetaを決めます。
3. eta1, eta2の推定値が決まったら、線形最小二乗法でscaling
factor E0, E1, E2を決めます。
非線形最小二乗法で決めてもいいのですが、E1, E2の値が大きく外れていると収束しません。
線形最小二乗であれば推定値はいらないので、線形パラメータであるE0,E1,E2だけ線形最小二乗で決めます
4. 最後に、上の推定値を使って非線形最小二乗法を実行して最終解を求めます。
しかしながら、2つの減衰項だけでは初期の急激な減衰を再現できないことが分かったため、減衰項を3つに増やしました。
- 最小二乗法のデータファイルのとデータをGraphical User Interfaceで選択するプログラム
特徴: 入力データファイルの選択にtkinterを使っている
変更点:
・ 例外処理に try ~ except文を多用していた。
複数行のブロックがある場合や深くネストしたtry ~
except文、ブロック途中でのraiseによる例外発生は、
エラー個所の特定とプログラムの進行を補足しにくくなるため、一部をif
~ else文で置き換えた
・ データを選ぶ際のメッセージをより具体的に変更
・ コンソールでのprint/inputは、tkinterのダイアログに置き換えた。
・ OKCancelダイアログに置き換えた個所では、Cancel処理のコードを追加した
- 最小二乗法のデータファイルやデータをコンソール入出力でinteractiveに選択・入力するプログラム
特徴:
・ プログラム起動時や状態移行時に、">"などの表示を入れてsleep()で待ち時間を作り、animation効果を作っている
・ データを、コンソールからCSV形式で入力するか、Excelファイルから読み込むかを選択できる
・ コンソールに処理の選択肢を表示し、選択できる
変更点:
・ animation表示部分は、show_progress(message, wait_progress)
関数を作って置き換えた。
この関数では、message変数を1文字ずつ取り出して画面に表示し、wait_progssの間sleepすることでanimation効果を出します。
・ 処理の選択部分は、先に選択肢を出してinput()を使う順番に変更
・ CSVデータをコンソールで入力するのではなく、CSVファイルであればエディタ、.xlsxファイルであればExcelを起動してファイルを作成・編集するように変更。外部プログラムの実行はos.system()を使いました
・ グラフ表示機能が未完成でしたが、ChatGPTに追加してもらいました
(動作確認はしていません)
講義の質問、感想、要望など
参加学生数: 44名
質問
展開して表示
- 自分のPCでのVSCodeとpythonのエラー
(モジュールインストールエラー) について質問
モジュールがインストールできないエラーについて質問
対応: 第10回、第11回講義で回答
- pythonは研究でどのように使えるのか
対応: 第10回講義で回答
- 過学習/過適合の判断の仕方を知りたい
対応: 第11回講義で回答
- Si, Sij(行列)の、「要素は初期化しない」とはどういうことか
対応: 第11回講義で回答
- x_sumなどで出てきた、+=とはどういう意味か
対応: 第11回講義で回答
- @で行列の積を計算できるとあるが、@以下を左からかけるということでいいのか
対応: 第11回講義で回答
- if __name__ == "__main__": main()
のところが理解できなかった
対応: 第11回講義で回答
- 研究室で実際に必要になることを知り たい
要望
展開して表示
- 伝播誤差を求めるプログラムを作りたい
対応: 対応できず
- 自分でプログラムを作る演習時間が欲しい
対応: 第11回講義で自習時間を取った
pythonに関する感想
展開して表示
- Pythonの扱い方やライブラリなどの概念が少しわかってきた
- matplotlibできれいな図が描けるので感動した。Excelから乗り換えていきたい
- pythonで行列計算を行えるのに驚いた
- 実行時にファイルを(起動時引数で)選択できるのは去年のCSで知りたかった
- 今までexcelを用いて、関数を設定してフィッテイングを行っていたが、pythonをうまく用いれば様々な関数を簡単に扱った最小二乗法をでき、とても便利だった。
- 線形回帰のような煩雑な計算をnumpyでの行列計算とforループで手軽に実行できることが特に便利
- ファイルの読み込み、matplotlibでのグラフ描画の部分が関数内で何と対応しているかを考えることで、
プログラムの動き方を効果的に理解できた。読み込み・計算・出力の流れを意識することが大切そうだと考えた。
- コメントブロックの利用や行列への代入などのプログラムを改行する場所を工夫して、読みやすくなるプログラムを心掛けていきたい。
- Python
での数学ライブラリを学んで、研究室に入ったときに便利に使いこなしたい
自分でプログラムを修正、作成などした例 (LLMの支援を含む)
展開して表示
- numpy.polyfit()を使って、2次多項式で回帰
- numpy.polyfit()をnumpy.Polynomial.polynomial.polyfit()に置き換え
- np.linalg.lstsq()に置き換え、例外処理の追加
- 多項式回帰で、多項式の次数による違いを比較
- ヒストグラムの追加
- 学生実験データ、熱電対の起電力データへのフィッティング
講義で回答:
・
熱電対データのように入力値に誤差を考慮しないほうがいい場合もある。
そのような場合は最小二乗法を使うのではなく、補間を使うほうがいい
次回の講義の課題:
上の回答に対して、自分で補間のプログラムを作成して提出
- matplotlibのグラフをファイルに保存
- 起動時引数の処理にargparseを使用
- cos2(x)、sin(a + bx)などにフィッティングするプログラム
LLMに自分で質問した例
講義で説明したプロンプトは講義における生成AIの利用ページ参照
展開して表示
- プロンプト: PythonでExcelファイルのデータを読み取り、最小二乗法を使って多項式近似を行う以下のコードを解説してください
結果: Excelファイルをpandasライブラリを通してデータを読み取る方法や、matplotlibを用いたプロットの作成の仕方について特に詳しく解説してくれた。
コードの解説だけでなく、理論的背景も簡潔に説明されていたため、理解を深めるのに役立った。
また、最小二乗法を用いた多項式近似について、行列の計算の仕方が授業だけでは完全に計算手順が理解できていなかったため、その点で特に役立った。
生成AIの活用によって、理論と実装の橋渡しができ、理解が深まった。
- LLMに質問してlsq_general.pyと同様のプログラムを作ろうとしたが、結局ほとんどコピーになった。
LLMに質問しつつ理解しながら読み進めたことは授業の成果
- プロンプト: pythonで logN = a + b * Tinv
にフィッティングするプログラム
結果:
プロンプトは、2023年に開いたチュートリアルでChatGPT3.5に質問したものであるが、今回はMS365
Copilot (GPT4)
に質問した。その結果、logNについてはログ値のデータを初期値として与え、Tinvは、初期値として温度Tのデータを与えて1/Tで変換し、scipy.optimize.curve_fit()を使うというように、2023年のChatGPT3.5よりも文脈を深く理解し、作成するプログラムにも違いが出た
- 背景: 以前のnumpyでは、2次元配列型の行列 M
と1次元配列型のベクトル Vの積を M @
Vで計算するとエラーになった。Vも1x2の2次元配列にしないといけなかった
(2025/1現在のnumpyでは可能)
プロンプト: numpy.ndarray
でベクトルも行列として扱う理由は?
結果: ndarrayの便利な点を説明してくれたが、ベクトルを2次元配列にしないといけない理由については説明が無かった
講義での回答: 第11回講義で推察を含めて説明
- プロンプト: 非線形最小二乗法をpythonで実装しています。効果的に収束させるために、初期値の推定をプログラムで効率的に実行したいです。どのような手法が挙げられますか?
回答:
パラメータのスケーリング、グリッドサーチによる絞り込み、ランダムサーチによる探索、データをクラスタリングして中心点を採用する、経験的知識に基づいて設定、事前学習モデルの利用
結果:
対数軸に変更しても上手くグラフがプロットできていない
- 実験.pyの改善点の提案と,改善したプログラムの作成をしてもらった
結果: 次の修正がされた
・
ファイルが見つからない場合や必要な列が存在しない場合のエラーハンドリング機能を追加
・ yデータの正規化やスケーリングを行うことによるフィッティング精度の向上.
- 生成AIになぜプログラミングに詳しいか質問したところ,次のように返答された.
回答: データの豊富さ、プログラミングコードは非常に構造化されたデータであるため学習しやすい、コミュニティの貢献、問題解決と応用の多様性
(AIが具体的なコードを生成し、プログラマーがそのコードをレビューし、フィードバックを提供することで、AIはさらに改善されます)、連続的な学習とアップデート
LLMに関する感想
展開して表示
- 思ったよりもchat gptやcopilotが賢いことに気づいた。プログラムを書くのは人間よりも速く、多少ミスがあってもそこを指摘すればすぐに修正してくれることも多い。
- pythonらしい書き方にメリット・デメリットがあるということを知っている必要もあるので、無知でLLMを使うのはやっぱり難しいとも感じた
- 材料分野の質問をしてもあまり良い回答を得ることができないことが多く,なかなか使いづらいなと感じていた。プログラミングの質問に対してはこうも有用なのかととても驚いた。AIの特異不得意をしっかりと把握し今後の学習に役立てていきたいと思う.
その他
展開して表示
- 背景:
材料のデータベース検索の演習の要望があった。時間的に無理だったので、Materials
Projectとpymatgenを紹介し、検索プログラムを公開しているWebページを紹介した。
課題提出: Materials ProjectのAPI
Keyを取得し、公開Webページにあるget_phonon.pyを実行した結果を提出
講義資料
#09 2025/1/10 (金) 神谷担当
pythonプログラミング
講義資料: 20250111-09slides.pdf
#10 2025/1/14 (火) 神谷担当
講義資料: 20250114-10slides2.pdf
#11 2025/1/21 (火) 神谷担当
講義資料: 20250121-11slides.pdf