========================================== LibreOffice におけるマクロのコード実行例 ========================================== 例題1 ------ 100℃、1 atmにおける水の蒸発熱は9720 cal/molである。27℃,1 atmにおける水の蒸発熱を求めなさい。 ただし、水のモル熱容量は18.06 cal/Kmolと一定であり、水蒸気のモル熱容量は以下の式で近似される。 .. math:: C_p=7.219 + 2.374 \times \rm{10}^{-3} T + 2.67 \times \rm{10}^{-7} T^2 蒸発反応は以下の化学式である。 .. math:: \rm{H_2O(l) →H_2O(g)} 例題1の回答 ------------ 考え方として、 .. math:: \Delta H_{27} = \Delta H_{100} - \int_{27}^{100} \Delta C_p dT .. math:: \Delta C_p = 7.219-18.06 + 2.374 \times \rm{10}^{-3} T + 2.67 \times \rm{10}^{-7} T^2 の2つの式を使う。 必要な値を :program:`LibreOffice calc` のセルに打ち込み、計算すると以下のようになる。 .. image:: reidai1simpson.png :scale: 70% 積分によって, :math:`\int\Delta C_p dT` を求めたい。勿論、手計算によって積分することが出来る。その場合、 ``E8セル`` に入力する式は .. math:: \int_{27}^{100} \Delta C_p dT = (D3-B4)*(B9-B8) + E3/2*(B9^2-B8^2)+F3/3*(B9^3-B8^3) となる。結果は以下の図である。 .. image:: reidai1tekeisan.png :scale: 70% 一応の回答は -730.9 {cal/mol} と算出出来た。 よって、 .. math:: \Delta H_{27} = 9720 - (-730.9) :math:`\Delta H_{27}` = 10450.9 {cal/mol} と計算できた。 しかし、この書き方では入力式が長くなりミスも生じやすい。マクロを記述し、それを利用する。 マクロのコード --------------- .. literalinclude:: sekibun1makuro.py :language: vbnet :lineno-start: 1 :linenos: :lines: 9 サブルーチンの始まりを定義。 名前は ``simpson`` .. literalinclude:: sekibun1makuro.py :language: vbnet :lineno-start: 2 :linenos: :lines: 12-15 ``「Dim」文`` は変数の宣言。 ``doc`` という名前の変数をオブジェクト型として宣言する。 .. literalinclude:: sekibun1makuro.py :language: vbnet :lineno-start: 6 :linenos: :lines: 19-21 ``doc`` を現在アクティブなドキュメントとして指定。この場合は保存したシート。 .. literalinclude:: sekibun1makuro.py :language: vbnet :lineno-start: 9 :linenos: :lines: 25-33 積分値の上限と下限として、 ``t1`` , ``t2`` を設定。それぞれ対応するセルの値を代入。 ``n`` は試行回数、 ``ft1`` , ``ft2`` はCpの式にしたがって計算し、条件温度を当てはめて値を設定する。 ``fsum`` で合計する。 ``ft1`` と ``ft2`` の処理を合計する。 .. literalinclude:: sekibun1makuro.py :language: vbnet :lineno-start: 18 :linenos: :lines: 37-44 ``for文`` のループを構築する。ここの処理で200回の積分の試行のループを回す。 .. literalinclude:: sekibun1makuro.py :language: vbnet :lineno-start: 26 :linenos: :lines: 48-50 #セルB11に結果を出力する。 #サブルーチンの終わり このマクロを用いて計算すれば、結果は下の図になる。 .. image:: reidai1makuro.png :scale: 70% -733.3 cal/molを得ることが出来た。 .. math:: \Delta H_{27} = 9720 - (-733.3) よって、 :math:`\Delta H_{27}` = 10450.9{cal/mol} を得た。 例題2 ------- .. csv-table:: :file: gurupukadai3.csv :encoding: UTF-8 :header-rows: 1 :stub-columns: 1 :delim: ; 無水ヘキサシアノ鉄(2)酸カリウムの熱容量は上の表のように変化する。 表の各温度で、 :math:`T=0` を基準にしたモルエンタルピー :math:`{H_m}(T) - H_m (0)` と第三法則エントロピー :math:`S_T` を計算せよ。 例題2の回答 ------------- .. math:: S_{T1} = \int_{0}^{T1} \displaystyle \frac{ C_p }{ T } dT H_m(T) - H_m(0) = \int_{0}^{T} C_p dT 横軸 :math:`T` 、縦軸 :math:`C_p` ないしは :math:`C_p /T` のプロットを行い、グラフの面積を求めれば良い。 まず必要な値を :program:`LibreOffice calc` のセルに打ち込み、横軸を *T* 、縦軸を :math:`C_p` でプロットし、 4次の多項式で近似させ、近似値の係数を取り出すと次のようになる。 .. image:: reidai2.png :scale: 70% よって、:math:`C_p` は下の式になる。 .. math:: C_p = -6.331 + 9.271 \times \rm{10}^{-1} T + 2.792 \times \rm{10}^{-2} T^2 - 2.383 \times \rm{10}^{-4} T^3 + 5.591 \times \rm{10}^{-7} T^4 これを、後述するマクロによって積分し、:math:`{H_m}(T) - H_m(0)` の値を ``B20`` に出力すると、以下の図のようになる。 .. image:: reidai2Hkotae.png :scale: 70% よって、:math:`{H_m} (T) - H_m(0)` は 32.27 kJ となった また、 :math:`S_T` についても同様に横軸を :math:`T` 、縦軸を :math:`C_p`/Tでプロットし、4次の多項式で近似させ近似値の係数を取り出せば次のようになる。 .. image:: reidai2Stotu.png :scale: 70% よって、:math:`C_p/T` は下の式になる。 .. math:: C_p/T = -0.1726 + 6.403 \times \mathrm{10}^{-2} T - 6.7725 \times \mathrm{10}^{-4} T^2 - 2.7927 \times \mathrm{10}^{-6} T^3 - 4.0379 \times \mathrm{10}^{-9} T^4 これを、後述するマクロによって積分し、 :math:`S_T` の値を ``B21`` に出力すると、以下の図のようになる。 .. image:: reidai2Skotae.png :scale: 70% よって、 :math:`S_T` は 299 J/K となった。 例題2の :math:`H` を求めるマクロのコード ----------------------------------------- .. literalinclude:: sekibun2Hmakuro.py :language: vbnet :linenos: 例題2の :math:`S` を求めるマクロのコード ----------------------------------------- .. literalinclude:: sekibun2Smakuro.py :language: vbnet :linenos: .. warning:: マクロを記述する時の注意点 1. マクロはアクティブなシートのセルを参照するが、その番号が一つずつずれて認識されている。 例えば ``A1`` は、マクロで ``(0,0)`` となる。 2. マクロを記録した :program:`LibreOffice calc` を起動する時に必ず ``[マクロを有効にする]`` を許可しなければ ならない。 3. 保存場所に注意。