輸送方程式_中心差分2次精度近似_2.py の整備

2026-03-29 / 数値解析・Python・matplotlib

セッション概要

1次元移流方程式を中心差分+前進オイラー法で解くコード(輸送方程式_中心差分2次精度近似_2.py)を 段階的に修正し、HTMLドキュメントおよびグラフ画像として整備した。 途中でmatplotlibの軸設定メソッドの誤り修正、ラベルの有効数字指定、プロット条件の変更なども扱った。

やりとりの詳細

ax.ylim([0,2.0]) について
ax.ylim()plt の関数であり、Axes オブジェクトには存在しない。 正しくは ax.set_ylim([0, 2.0]) を使う。
誤:ax.ylim([0, 2.0])
正:ax.set_ylim([0, 2.0])
輸送方程式_中心差分2次精度近似_2.py をまとめて(初回)
コードを実行してグラフ(code_transport_cds2_2.png)を生成し、 code_輸送方程式_中心差分2次精度近似_2.html を作成。codes.html にエントリを追記。

当時のコードの仕様:
nmax6
dt値0.05 / 0.03 / 0.01
プロット条件n%2==0(偶数ステップ)
ラベルf'n={n}'
初期ラベル'n=0'
ラベルの n*dt に有効数字をつけたい
Pythonのf文字列で :.Ng(g = 有効数字N桁)を使う。
label=f't={n*dt:.2g}'
:.2g = 有効数字2桁。末尾ゼロを自動省略(例:0.10 → 0.1)。
特定の物理時刻(t=〇s)のときだけプロットしたい
プロットしたい時刻のリストを用意し、np.isclose で比較する方法を採用。 == による直接比較は浮動小数点誤差で一致しない場合があるため不可。
plot_times = [0.1, 0.2, 0.3] if any(np.isclose(n*dt, pt) for pt in plot_times): ax.plot(x, q, marker='o', lw=2, label=f't={n*dt:.2g}')
plot_times リストを変えるだけで出力タイミングを自由に指定できる。
コードを修正したので、まとめなおして(2回目)
修正後のコードに合わせてHTMLとグラフを更新。

修正後の仕様:
nmax6 → 600
dt値0.05/0.03/0.01 → 0.1/0.05/0.01
プロット条件n%2==0np.isclose + plot_times
ラベルf'n={n}'f't={n*dt:.2g}'

クーラン数の変化:
dtr = c·Δt/Δx
0.11.00
0.050.50
0.010.10
グラフが最新になっていない → やり直して
前回のグラフ生成時に古い label='n=0' が残っていたため、 最新コード(label='t=0.0')で再実行し code_transport_cds2_2.png を上書き。
n=0t=0.0 に直したはず → HTMLも更新して
HTMLのコード全文内の 'n=0''t=0.0' に修正し、グラフも再生成して一致させた。
修正箇所(コード全文・グラフ共通):
label='n=0'label='t=0.0'

作成・更新したファイル

ファイル操作内容
code_輸送方程式_中心差分2次精度近似_2.html 新規作成→更新×2 コード解説HTML(概要/ライブラリ/物理背景/計算手法/コードの流れ/精度/コード全文/グラフ)
code_transport_cds2_2.png 生成→再生成×2 dt=0.1/0.05/0.01の3パネル比較グラフ(物理時刻 t=0.0〜0.3s)
codes.html 追記 輸送方程式_中心差分2次精度近似_2.py のエントリを追加

キーワード

移流方程式 中心差分 前進オイラー法 数値不安定 クーラン数 np.isclose 有効数字 :.2g ax.set_ylim subplots 物理時刻指定 matplotlib