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カウンター
カテゴリ
ユーザータグ

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

最新コメント
リンク

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