Scilabで熱拡散方程式 その3 (陰解法)

Scilabで熱拡散方程式 その1 (陽解法)Scilabで熱拡散方程式 その2 (無次元化)では陽解法で偏微分方程式を解く方法を書くと同時に、時間と空間の刻み幅を自由に選べないという問題点を指摘しました。今回はその問題点を解決した陰解法(Crank-Nicolson法)を紹介します。


001_20140215031531793.png
Fig.1: 一次元熱伝導問題の解



偏微分方程式の陰解法


Scilabで熱拡散方程式 その1 (陽解法)では、Octaveの精義を参考にして、一次元の熱伝導を題材に偏微分方程式を陽解法で解くということを行いました。しかしながらScilabで熱拡散方程式 その2 (無次元化)で紹介したとおり、陽解法では λ ≦ 1/2 という安定性の条件から空間の分解能と時間の分解能を独立に決めることが出来ないという欠点があることが確認されました。

Octaveの精義では、この問題を陰解法のひとつであるCrank-Nicolson法を用いて解決する方法を紹介しています。そこで今回は、その1の計算をCrank-Nicolson法で計算します。

計算


計算結果が冒頭に示したFig.1です。
そのスクリプトはCN_sce.txtです。

clear;

// *** 時間と空間の分割 ***
n = 129; // 空間の分割数
dx = 1 / (n - 1); // 空間の刻み幅

r = 4

dt = r * dx ^ 2; // 時間の刻み幅
m = 1001; // 時間の分割数
dm = 100; // プロットする m の間隔

// *** 初期条件と境界条件 ***
// 初期条件
u = zeros(n,m);
// 境界条件
u(1,1) = 0;
u(n,1) = 1;

// *** 行列C ***
C = sparse(toeplitz([-2, 1, zeros(1,n - 2)]));
A = sparse(2 * eye(n,n) - r * C);
B = sparse(2 * eye(n,n) + r * C);
b = zeros(n,1);
b($) = 2 * r;

// *** 偏微分方程式の計算 ***
for j = 1:(m - 1)
// 境界以外の計算
u(:, j + 1) = A \ (B * u(:,j) + b);
// 境界条件
u(1, j + 1) = 0;
u(n, j + 1) = 1;
end

// *** グラフのプロット ***
plot([0:dx:1],u(:,1:dm:m));


陰解法の利点


Scilabで熱拡散方程式 その1 (陽解法)Scilabで熱拡散方程式 その2 (無次元化)では、陽解法の問題点として時間と空間の刻み幅を独立に決定することが出来ないという点を挙げました。

Crank-Nicolson法はこの問題点を改善したものです。


002_201402150315301ea.png
Fig.2: 1次元熱伝導方程式の陽解法(FTCS法)による数値解で、Octaveの精義のコードをScilabへ移植したもの。全てh2=1/322に固定しr = 1/6 (左上), 1/2 (右上), 65/128 (左下)と変化させた結果。r = 64/128 > 1/2 の場合には解が不安定になっていることが読み取れる。

003_20140215031530c4c.png
Fig.3: 1次元熱伝導方程式の陰解法(Crank-Nicolson法)による数値解で、Octaveの精義のコードをScilabへ移植したもの。全てh2=1/1282に固定しr=1 (左上),2 (右上), 4(左下)と変化させた結果。全てのrに対して安定な解が得られていることが分かる。



関連エントリ




参考URL




付録


このエントリで使用したScilabのシミュレーション用ファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器






フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。

tag: Scilab 偏微分方程式 熱伝導 陰解法 Crank-Nicolson法 

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj常微分方程式モンテカルロ解析状態密度トランジスタodeDOSインターフェース定電流スイッチング回路PDS5022半導体シェルスクリプト分散関係レベルシフト乱数HP6632AR6452A可変抵抗トランジスタ技術温度解析ブレッドボードI2C反強磁性確率論数値積分セミナーバンドギャップバンド構造偏微分方程式非線形方程式ソルバ熱設計絶縁ISO-I2Cカオス三端子レギュレータLM358GW近似マフィンティン半径A/DコンバータフォトカプラシュミットトリガLEDPC817C発振回路数値微分直流動作点解析サーボカレントミラーTL431アナログスイッチUSB74HC4053bzqltyVESTA補間電子負荷アセンブライジング模型BSch量子力学単振り子2ちゃんねるチョッパアンプLDA開発環境基本並進ベクトルFFT標準ロジックブラべ格子パラメトリック解析抵抗SMPMaxima失敗談ラプラス方程式繰り返し位相図スイッチト・キャパシタ熱伝導状態方程式キュリー温度gfortranコバルトTLP621不規則合金Quantum_ESPRESSO六方最密充填構造ランダムウォーク相対論ewidthスピン軌道相互作用FETQSGWVCAcygwinスレーターポーリング曲線GGA仮想結晶近似PWscfシュレディンガー方程式LM555ハーフメタル固有値問題NE555最小値ガイガー管QNAPUPS自動計測ダイヤモンドマントルTLP552格子比熱最適化MCU井戸型ポテンシャル最大値xcrysdenCIF条件分岐詰め回路フェルミ面差し込みグラフスーパーセルfsolveブラウン運動awk過渡解析起電力三角波第一原理計算FXA-7020ZRWriter509Ubuntuテスタ熱力学データロガーTLP521OpenMPubuntu平均場近似MAS830LトランスCK1026PIC16F785PGA2SC1815EAGLEノコギリ波負帰還安定性ナイキスト線図MBEOPA2277P-10フィルタCapSenseAACircuitLMC662文字列固定スピンモーメントFSMTeX結晶磁気異方性全エネルギーc/a合金multiplotgnuplot非線型方程式ソルバL10構造正規分布等高線ジバニャン方程式初期値interp1fcc面心立方構造ウィグナーザイツ胞半金属デバイ模型電荷密度重積分SIC二相共存磁気モーメント不純物問題PWgui擬ポテンシャルゼーベック係数ZnOウルツ鉱構造edeltquantumESPRESSOフォノンリジッドバンド模型スワップ領域BaO岩塩構造ルチル構造ヒストグラム確率論マテリアルデザインフラクタルマンデルブロ集合キーボードRealforceクーロン散乱三次元疎行列縮退化学反応関数フィッティング最小二乗法Excel直流解析PCTS-110TS-112日本語パラメータ・モデル等価回路モデルcif2cell入出力陰解法熱拡散方程式HiLAPW両対数グラフCrank-Nicolson法連立一次方程式specx.fifort境界条件片対数グラフグラフの分割円周率ヒストグラム不規則局所モーメントGimpシンボル軸ラベル凡例線種トラックボール

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ