Scilabで化学反応

私の練習のためにScilabで微分方程式による物理現象のモデル化(PDF)の問題を順番に解いてきました。最早、基本的な常微分方程式ならその物理的な背景を理解していなくてもルーチンワークでプログラムを書くだけで計算できてしまいます。

今回は、可逆反応と非可逆反応の反応が進む様子をシミュレーションします。

001_20130802112714a35.jpg

Fig.1: 化学反応は反応物質の数に依存して反応速度が異なる。また、可逆反応と非可逆反応では反応速度を表す微分方程式の形が異なる。画像は(c)GLOBALHAWK90



非可逆反応


非可逆な化学反応とは、反応する化学物質
非可逆反応の微分方程式とその解析解をプロットするScilabプログラムを作成します。

常微分方程式:
\frac{\mathrm{d}x}{\mathrm{d}t} = k(a-x)(b-x)

解析解:
x(t) = \begin{cases}ab\frac{\exp(gt) -\exp(-gt)}{a\exp(gt)-b\exp(-gt)} & (a > b) \\a - \frac{1}kt-\frac{1}{a}} & (a = b)\end{cases}

プログラムはunreversible_sce.txtです。

002_201308021127143ec.png

Fig.2: 非可逆反応の計算結果。


clear;

// ************************************
//
// 共通部分
//
// ************************************
// *** 入力パラメータ ***
a = 1;
k1 = input("k1 = ");
k2 = input("k2 = ");
// 時間ベクトル
T = linspace(0,10);

// ************************************
//
// 数値解
//
// ************************************
// 解くべき微分方程式
function dx = unreversible(t,x)
dx = k1 * (a - x) ^ 2 - k2 * x;
endfunction
// 初期値
x0 = 0;
// 微分方程式の数値解
X = ode(x0,0,T,unreversible);

// ************************************
//
// 解析解
//
// ************************************
b1 = (2 * a + k2 / k1 + sqrt(4 * a * k2 / k1 + (k2 / k1) ^ 2)) / 2;
b2 = (2 * a + k2 / k1 - sqrt(4 * a * k2 / k1 + (k2 / k1) ^ 2)) / 2;
d = sqrt(4 * a * k2 / k1 + (k2 / k1) ^ 2);
Xa = b2 * (exp(k1 * d * T) - 1) ./ (exp(k1 * d * T) - b2 / b1);

// ************************************
//
// プロット
//
// ************************************
plot(T,X,'or');
plot(T,Xa,'-g');
xtitle(strcat(["Chemical Reaction: ","a = ",string(a),", k1 = ",string(k1),", k2 = ",string(k2)]));
xlabel("$t [s]$");
ylabel("$N_x$");
legend(["Numerical","Analytical"],4);


可逆反応


可逆反応の微分方程式と解析解をプロットするScilabプログラムを作成します。

常微分方程式:
\frac{\mathrm{d}x}{\mathrm{d}t} = k_1 (a-x)^2 - k_2 x

解析解:
x(t) = b_2 \frac{\exp(k_1 \Delta b t)-1}{\exp(k_1 \Delta b t) - \frac{b_2}{b_1}}

ただし
b_1 = \frac{2a+\frac{k_2}{k_1} + \sqrt{4a\frac{k_2}{k_1}+\left(\frac{k_2}{k_1} \right)^2}}{2}

b_2 = \frac{2a+\frac{k_2}{k_1} - \sqrt{4a\frac{k_2}{k_1}+\left(\frac{k_2}{k_1} \right)^2}}{2}

\Delta b = b1 - b2 = \sqrt{4a\frac{k_2}{k_1}+\left(\frac{k_2}{k_1} \right)^2}


プログラムはbalanced_sce.txtです。

003_20130802112714957.png

Fig.3: 可逆反応の計算結果。


clear;

// ************************************
//
// 共通部分
//
// ************************************
// *** 入力パラメータ ***
a = 1;
b = input("b = ");
k = input("k = ");
// 時間ベクトル
T = linspace(0,10);

// ************************************
//
// 数値解
//
// ************************************
// 解くべき微分方程式
function dx = balanced(t,x)
dx = k * (a - x) * (b - x);
endfunction
// 初期値
x0 = 0;
// 微分方程式の数値解
X = ode(x0,0,T,balanced);

// ************************************
//
// 解析解
//
// ************************************
g = (a - b) / 2 * k;
if a == b then
Xa = a - 1 ./ (k .* T + 1 / a);
else
Xa = a * b * (exp(g * T) - exp(- g * T)) ./ (a * exp(g * T) - b * exp(- g * T));
end

// ************************************
//
// プロット
//
// ************************************
plot(T,X,'or');
plot(T,Xa,'-g');
xtitle(strcat(["Chemical Reaction: ","a = ",string(a),", b = ",string(b),", k = ",string(k)]));
xlabel("$t [s]$");
ylabel("$N_c$");
legend(["Numerical","Analytical"],4);


常微分方程式の数値解法


以下の通り、これまで微分方程式による物理現象のモデル化(PDF)に倣って、Scilabで常微分方程式の数値解法を扱ってきました。



2013年の更新はこれにて終了です。特にひねりは無いですが、来年は量子力学の問題から行こうと思います。
ただし、量子力学以降は単純な常微分方程式ではありません。常微分方程式は(ある意味何も考えずに)常微分方程式ソルバodeを使うだけで計算できてしまいますが、偏微分方程式は全自動で解いてくれるソルバが存在しないので少し考える必要があります。

元PDFには、(遍微分方程式ではない)普通の常微分方程式の問題として電子回路関係が残っていますが、LTspiceを使えば極めて簡単に計算できる回路をわざわざプログラム書きたくないという思いがあり、やる気がおきないです。

それでは、良いお年を。(と、予約投稿なので、書いている今はまだ7月なのですが。)

参考URL




付録


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


参考文献/使用機器




フィードバック



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

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


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


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


tag: Scilab 常微分方程式 ode 化学反応 

comment

Secret

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

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

最新コメント
リンク

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