M92612E - 兵庫教育大学|Hyogo University of Teacher...

86
平成5年度 修士論文 r i複数の弱酸・弱塩基を含む化学平衡系の理論的解析 兵庫教育大学大学院 教科・領域教育専攻 M92612E 学校教育研究科 自然系コース 佐藤 哲也

Transcript of M92612E - 兵庫教育大学|Hyogo University of Teacher...

平成5年度

修士論文

ri複数の弱酸・弱塩基を含む化学平衡系の理論的解析

兵庫教育大学大学院

教科・領域教育専攻

M92612E

学校教育研究科

自然系コース

佐藤 哲也

目次

第一章 序論 1

第=二章

2-1

2-2

理論

化学平衡と活量

水素イオン指数 一pH一

3

3

12

第三章 プログラム

3-1 プログラムの概略

3-1-1 プログラムの特色

3-1-2 プログラムの開発環境

3-1-3 プログラムの流れ

3-2 アルゴリズム

3-2-1

3-2-2

3-2-3 3-2-43-3

pHの計算アルゴリズム

活量係数の補正のアルゴリズム

化学式判別のアルゴリズム

デb・…タベースの構造

操作方法

18

18

18

20

23

24

24

28

31

33

37

第四章

4一一1

4-2

4-3

結果及び考察

計算結果と文献値・実測値との比較

平衡定数の変更に伴う計算結果の変動

プログラムの制限事項

43

43

58

61

第五章 結論 62

参考文献 63

プログラムリスト(メインプログラム)

(データベース作成用)

64

79

第一章 序論

溶液の酸性・塩基性の強さを示す指数にpHがある。これは1909年デンマーク

のSφrensenによって提案された尺度であり、(1-1)式で定義される。

pH = 一log [H“] (1-1)

このpHの大きさが化学反応に及ぼす影響は決して小さいものとは言えず、無機

化学、有機化学を問わず広い分野でpHの値が使われている。また、硫化物の沈

殿反応に対するpHの影響や、有機色素化合物の変色については、中等教育の現

場においても教材化と関連して検討されている。さらに生物の分野においては、

例えば組織や細胞を扱うのに、トリスバヅファーなどの緩衝溶液で厳密にpHを

一定にさせることがしばしば行われている。また昨今、環境科学の分野では、雨

水のpH値の大きさが環境に与える影響についての研究が、全国的に行われてい

る。

このように重要な物理量であるpHを測定するにはpHメータがあるが、溶液

を構成する物質の組み合わせから事前にその値を知りたいことも度々ある。特に

所定のpH:を示す溶液を、研究対象の化学種に相互作用しない無関係塩の組み合

わせから作りたいときに、溶液を調製して実測する方法では膨大な時間と試薬を

消費することになる。さらに、少量の酸や塩基が混入した際に、この溶液がどれ

だけ元のpH値を保持できるかという緩衝の強さまで実測するのは大変な労力が

伴う。そこで実測するのではなく、理論的にpHを精度良く計算できればたいへ

ん有用である。

しかしながらこの計算は、通常その水溶液中の酸塩基平衡系の平衡定数から、

物質の質量(モル数)は保存されるというマス・バランスや、溶液申の陽イオン

[1]

の電荷の和と陰イオンの電荷の和は等しいという電荷バランスなどを考慮して、

水素イオンに関する高次方程式を誘導し、その解を求める必要がある。しかもこ

の高次方程式は、人間が式の変形から誘導しなければならず、複数の平衡系を含

む場合は非常に煩雑な作業となる。

そこで本研究では溶液中のイオンが持つ電荷量に着目して、より正確で汎用性

が高く、しかもコンピュータにそれほど精通していない利用者にも、簡単に使用

できるプログラムの開発を行った。このプログラムの開発を通じて、水溶液中で

の化学平衡を理論的に取り扱う上で必要な種々の因子、例えばイオン強度、活量

係数の影響についても検討した。活量係数については種々の補正式が提案されて

いるが、それらの妥当性についても検討した。

[2]

第二章

2-1 化学平衡と活量

溶液内での化学平衡が

A十B二C十D(2-1-1)

(2-1-1)式で示される時、平衡定数をKとすると、Kは(2-1-2)式で表される。

[C] [D]

K=

[A] [B]

(2-1-2)

しかしこれはあくまでも非常に希薄な理想溶液で成立する式であって、実際の溶

液では成り立たない。それは溶質問の相互作用が全くない状態を考え、さらに溶

質の溶媒和が完全であると仮定しているからである。そこでそれぞれの濃度[i]

の代りにai・fi[i]と補正をする1)2)。このaiを活量と呼び、この時の係数fi

を活量係数と呼ぶ。よって(2-1-2)式は(2-1-3)式のように表現される。

K=ac . aD

fc [C] fD [D]

aA . aBf. [D] f. [D]

(2-1-3)

非常に希薄な溶液ではfi・1となり(2一一1-2)式と(2-1-3)式は一致する。 Debye-HUc

kelはこの理想溶液と実際の溶液のずれの最大の原因を、イオン間の静電的相互

作用にあると考えた。今点Pにイオンjがある時、静電ポテンシャルをφ、電荷

をZjとすると静電エネルギーはZ」eφとなる。この静電エネルギーによるイオン

の空間分布を知るためにボルヅマン分布を用いると、イオンjによる点Pでの電

[3]

荷密度Pjは(2-1-4)式で示される。

pj = zjenj = zjenjO・exp (一zje¢/RT) (2-1-4)

ここでnj、 n」Oはそれぞれ電位が存在する時、しない時のイオンの密度であり

Rは気体定数、Tは絶対温度である。点Pにおける全電荷密度をρとすると

p= ZzjenjO・exp (一zje¢/RT) . (2-1-5)

となる。静電エネルギーに対して熱運動が十分に大きいとし、指数項をテイラー

展開してその第2項までとると(2-1-5)式は

p = ZzjenjO・ (1一一zje¢/RT) = 2zjenjO一一Z (zj2e2¢2/RT) (2・一1-6)

と変形できる。ここで十分大きな微小空間内では、陽イオンの電荷の和と陰イオ

ンの電荷の和は等しいという電気的中性の原理からΣZjenjO・0なので

p=一Z (zj2e2¢2/RT) (2一’1-7)

となる。電気力線の数をそれを含む閉空間の表面で足し合わせると、その空間内

に閉じ込められている電荷に比例することから誘電率をεとすると

V2¢ = 一4np/e (2-1-8)

となる。ここでラプラシアン▽2は半径をr、角度部分を㊥とすると

[4]

v2・_+i轟+腸÷濫)+⑧ (2-1-9)

で記述される演算子であるが、球対称性から角度部分⑭は以下の議論に関与しな

い。(2十8)式に(2-1-7)式を代入すると

V2¢= {4zp/ (ERT)・Z (zj2e2¢2/RT)}¢ (2・一1-10)

ここで{4πρ/(εRT)・Σ(zj2e2φ2/RT)}≡κ2とすると(2-1-10)式は

v2¢= re 2¢ (2-1-1 1}

となり、この式の一般解は(2十12)式で示される。

exp (一 re r) exp (re r)

¢=A・一 十 B・一 (2-1-12) r r

ところがr一)aoでφが有限値を持っためにはB・0でなければならない。また点Pの

中心に半径aで電荷zのイオンiを置くと、電気的中性の原理よりr・aからr・oo

の空間はそのイオンiの補集合になり一Zieの電荷を持つことから

f ℃,4zr2dr = 一zie(2-1-13)

(2-1-13)式から定数.Aの値は

[5]

zie exp (K a)

A =一・ E 1十Ka

(2-1-14)

よって(2-1-15)式が与えられる。

zie exp (K a) exp (一 re r)

¢=一・一・ E 1十rea r

(2-1-15)

今注目しているイオンの表面における静電ポテンシャルを考える時、(2-1-15)式

にr・aを代入して(2十16)式が与えられる。

zie exp(rea) exp(一rea) zie

¢=一・一・一=一・ E 1十rea a e

1

(1+re a) a

zie 1 zie re=一・一 十一一・ E a e 1十Ka XSY一一7 v一一y-y ¢1 ¢2

(2-1-16)

これは中心イオンi自身による寄与φ、と、それを取り囲む他のイオンの寄与φ2

とに分離できることを意味する。今半径rの球を用意して、その表面の静電ポテ

ンシャルφのところに、電荷q=Zieを持って来るときの仕事Wは

dw = ¢dq (2-1-17)

となる。これを積分すると

[6]

, . fgi8d, = fgi9¢,+¢,) dq(2-1-18)

となる。ここで無限希釈の溶液を考えると誘電率εの媒体中において、着目して

いるイオンの近傍には他のイオンのは存在しないので、孤立イオンとみなすこと

ができφ、のみ影響を及ぼすことになる。

すなわち無限希釈の場合には(2-1-19)式が得られる

wi = fg’8,dq = f:i’e-IT, d, . i,一!1’g91-ige)2

(2-1-19)

一方有限の濃度の場合には(2-1-20)式が得られる

w・ ・∫:’e(¢・+¢・) dq・∫:’÷q+∫:樗・÷dq

(zie)2 re (zie)2

2E 2E 1十Ka

(2-1-20)

(2-H9)式と(2+20)式の差はイオン間の相互作用による余剰エネルギー一と考え

られるので、これを△wとすると(2-1-21)式が与えられる。

(zie)2 KAw =wl 一 w2 = 一 一,

2E 1十rea

(2-1-21)

理想溶液中のイオンの化学ポテンシャルμは濃度。の時、(2-1-22)式で示すこと

[7]

ができる。

”i = ILO + RTInc (2一一1-22)

ここでμoはある基準における標準状態での化学ポテンシャルで、標準化学ポテン

シャルとよぶ。(2-1-22)式は無限希釈の理想溶液の場合であって、実在の溶液で

は成立しない。そこで先に述べた活量aを用いて(2-1-22)式を表すと(2十23)式

となる。

u2 = L{O 十 RTIna (2-1-23)

ここで活量係数をγとすると、a・γ・cなので(2-1-23)式は(2-1-24)式となる。

IL2 = LtO 十 RTIn7c = tLO 十 RTIn7 十 RTIne (2-1-24)

ここで(2-1-22)式と(2-1-24)式の差を△μとすると

Ait = it2 - tLi = RTIn7 (2-1-25)

この△μが余剰エネルギー△wと考えられるので

(Zie)2 re

RTIn7 = 一 一・一 (2-1-26) 2E 1十rca

となる。よって1nγは

[8]

(zie)2 Mln7 =一 一’ 2ERT 1十rea

(2-1-27)

ここで温度一定ならばe2/2εRTは定数なので、これをAとおくと(2-1-27)式は

reln7 = 一 Azi2

1十rea

(2-1-28)

となる。また先の定義からκは

4ze2

rc = U-2njzj2 eRT

(2-1-29)

ここでnjは1cm3中のイオンの個数なのでアボガドロ数をN.とすると、体積モ

ル濃度cjとの関係からnj・NAcj/1000より(2-1-29)式は次のように変形される。

4ze2 NAre = Uny ’一2cjzj2 eRT looo

(2-1-30)

更にイオン強度1を1・1/2ΣCjZj2と定義すると

8xe2 NA

x= 41一,一・I eRT looo(2-1-31)

温度一定ならば8πe2/(εRT)・NA/1000は一定なので、この平方根をBとおくと(2-

1-31)式は

[9]

re =B・ V-iM (2-1-32)

となる。これを(2+28)式に代入し、対数を自然対数1nから常用対数logに変

形すると

2, 303ABzi2 ff

log7 = 一一 (2-1-33) 1+BafI

となる。ここで分子の2.303ABをあらためてAとおくと(2-1-34)式が得られる。

AZi2石一

log7 = 一一 (2-1一一34) 1+Baf1

25℃の水溶液ではA・0,5091であり、Bxa≒1である。この(2-1-34)式は濃度(イオ

ン強度1)の大きさによって3つに場合分けされている。

①イオン強度が非常に小さいときに成り立つ。(1<0,01M)

log7=一〇, 5091zi2 ff (2-1-35)

この(2-1-35)式をDebye-HUekelの活量係数の限界式(limitting law)と呼ぶ。

②イオン強度が比較的小さいときに成り立つ。(1<0,1M)

O, 5091z,2 ff

log7 = 一一 (2-1-36) 1+Baノー1

[10]

この(2-1-36)式を拡張Debye-Hif ckelの活量係数の式と呼ぶ。これ以上イオン強度

が大きくなると、溶媒の相互作用の影響を無視できなくなるので、その補正項を

付け加えなければならない。

③イオン強度が比較的大きいときにも成り立つ。〔1 :1M)

log7 = 一

O, 5091z,2 ff

十 CI 十 DI2 十 ”. (2-1-37)

1+BafI

(2十37)式の係数C、D、…は個々のイオンで決まる定数で、実験から求める必要

がある。イオンの種類によらず、ほぼ普遍的に成立する式としてIUPACでは次の

式3)を推奨している。本プログラムの中の活量係数の計算にもこの式を使用した。

log7=一〇,5091zi2

狽狽狽??一〇・31)

(2-1-38)

この(2-1-38)式をDaviesの活量係数の式と呼ぶ。ただし、イオン強度が非常に小

さい場合(希薄溶液)ではlogγ・0、すなわちγ・1であることを述べておく。

[11]

2-2 水素イオン指数 一pH一

溶液中の諸物性仮応性、溶存構造など)に水素イオン濃度が大きく影響する。

水素イオンの濃度の対数(正確には水素イオンの活量の値の常用対数値)を水素イ

オン指数pHと呼ぶ。このpHは(2-1-1)式で定義される。

pH = 一logaH+ = 一log7H’ [H“] (2-1-1)

溶液のpHを計算によって求めるためには、通常下記の方法が用いられる。例え

ばH3PO4とNaOHの混合溶液では、リン酸の第一酸解離定数、第二酸解離定数、

第三酸解離定数をそれぞれK、、K2、 K3、水の平衡定数をKwとおくと(2-2-2)式

~(2-2-5)式が得られる。

[H+] [H,PO4’]

H3PO4 = H+ 十 H,PO,一 より K1 = (2-2-2)

[H,PO,]

[H+] [HPO,2一]

H2PO4一=H+十HPO42 より K2 (2-2-3)

[H,PO.一]

[H+] [PO,3一]

HPO42一 二 H+ 十 PO43一 より K3 = (2-2-4)

[HPO,2一]

H,O = H+ 十 OH一

[H+] [OH一]

より Kw= [H20ユ

(2-2-5)

また溶解しても物質の質量(モル数)は保存されるというMass balanceより、

[12]

全リン酸濃度をcp。4、水酸化ナトリウム濃度をcN。とすると次の(2-2-6)、(2-2-

7)式が得られる。

cpo4 = [PO43一] 十 [HPO42一] 十 [H2PO4一] 十 [H3PO4]

cNa = [Na’]

(2-2-6)

(2-2-7)

次に溶液中の電荷の合計は0、すなわち陽イオンの電荷の和と陰イオンの電荷の

和は等しいというCharge balanceより次の(2-2-8)式が得られる。

3[PO,3一] 十 2[HPO.2一] 十 [H,PO.一] 十 [OH一] = [H+] 十 [Na+] (2一一2-8)

上記の(2-2-2)~(2-2-8)式から、[PO.3一】、[HPO42一]、[H,PO.一]、[Na+]、[OH“]

を消去することで、水素イオン濃度に関する5次方程式(2-2-9)が導かれる。

[H+] s

十(K1 十CNa ) [H+]4

十(KIK2 十KiCNa -Kw - KICPo4 ) [H+]3

十(KiK2K3 十KiK2CNa 一KiKw 一2KiK2Cpo4 )[H“]2

十( 十KiK2K3CNa ’KiK2Kw ’一3KiK2K3Cpo4) [H’]

一KiK,K,K. = O (2-2-9)

この5次方程式を近似計算、例えばニュートン法などによって解くことにより

[H+]を求め、pH=一log[H+]からpHが求まることになる。しかしながらこの高次

方程式は、人間が数式に変形によって求めなければならないので、実際は大変煩

雑な作業となる。H3PO4とNaOHの混合溶液の場合には次数は5次であるが、

H3PO,とH2CO3とNaOHの混合溶液の場合には7次にもなる。このように加える

[ 13 ]

物質の価数が大きい場合や多くの物質が溶解している場合には、この高次方程式

を導き出すのは非常に困難となる。またニュートン法で近似解を求める場合、次

数が大きくなると精度を維持するために、有効桁数を大きく取らなければならな

い等の問題も生じる。

そこでこのような高次方程式を導かなくてもpHを計算できるアルゴリズム4)

について検討した。着目したのは、上述の『陽イオンの電荷の和と陰イオンの電

荷の和は等しい』という条件である。ここで、陽イオンの電荷の和と陰イオンの

電荷の和の総和を総電荷量と呼ぶことにする。溶液中の水素イオン濃度をパラメ

ータとして変化させながら総電荷量を計算し、この値がちょうど0になるときの

水素イオン濃度を最適値とするアルゴリズムである。

次にこの総電荷量を計算するアルゴリズムを炭酸系を例として説明する。この

溶液では次の(2-2-10)、(2-2-11)式の平衡反応がある。

H+ 十 CO,2一 = HCO,’ (2-2-10)

H+ 十 HCO,一 = H2CO3 (2-2-11)

この共役系の化学種はCO32’、 HCOゴ、 H2CO3であり、共役系の総濃度をac, tcnc

とおくとMass balanceから次の(2-2-12)式が得られる。

ac, tcnc = [CO32一] 十 [HCO3一] 十 [H2CO3] (2-2-12)

また(2-2-10)+(2-2-11)式から(2-2-13)式が導かれる。

2H++CO32一二H2CO3(2-2-13)

[ 14 ]

ここで(2-2-10)式、(2-2-13)式の平衡定数をそれぞれk、、β2(・k、xk,)とおくと

(2-2-14)、(2-2-15)式が得られる。

[HCO,一]k1= より [HCO3一]=k1[H+][CO32一] [H+] [CO,2一]

[H,CO,]β2 = より [H2CO3] = β2[H+]2[CO32一]

[H+]2[CO32一ユ

これを(2-2-12)式に代入すると(2十16)式が導かれる。

ac. tcne = [CO32一] {1 十 ki [H’] 十 B2 [H’] 2}

[CO32一] = ae, tcnc/{1 + ki[H’] + B2[H’] 2}

ここで{1+k、[H+]+β2[H+]2}・qとおくと〔2-2-17)式が得られる。

[CO32一] = ac, tcnc/q

この(2-2-18)式は[朗の関数で示される。

excess_charge = [CO32一]×(一2) 十 [HCO3一]x(一1) 十 [H2CO3]xO

・ac. tcnc/q{〔一2)+k、[H+]×(一1)+β2[H+]2×0}

これを一般化すると次のようになる

[ 15 ]

(2-2-14)

(2-2-15)

(2-2-16)

(2-2-17)

これらの化学種の総電荷量をexcess_ohargeとおくと(2-2-18〕式が得られる。

(2-2-18)

一般式

H+十L-n

H+ 十 HI、1-n

H’ + H2L2’n

二肌1-n

=H2五2-n

詰H3五3¶

例麟酸(n・3)

H+ 十 PO43-

H+ 十 HPO42-

H+ 十 H2PO4一

= HPO42一

=H,PO4一

二H3PO4

一 一 { 一 一 t 一 一 一 一

H’ 十 Hn-iLM = HnL

ここで共役系acのi番目の化学種ac, sp[i]の濃度をac, sp[iユ,con(i・0,1,2,

…,n)と記述すると(2-2-19)式が得られる。ただしac, tcncは共役系acの総濃

度を示している。

ac, sp [O],cnc =

ac, sp [1],cnc =

ae, sp [2],cnc =

ac, sp [3],cnc =

一 一 一 一 一 一 一 “ 一 一

ac, sp[nユ,cnc =

ac, tcnc

[L-n]

[肌1-n]

[H2L2-n]

田・L3“n]

[HnL]

= β1[H+][L-nユ

= B2 [H’]2 [L-n]

= B3 [H+] 3 [L-n]

= B. [H’]” [L-n]一

= [1、一n] 十 [HL1-nユ 十 [H2L2-n] 十 [H3L3-n] 十 … 十[HnL]

ac, tcnt = [L”一] {1 + Si [H’] + B2 [H’]2 + B3 [H“] 3… + B. [H’] ”} (2-2-19)

ここで先ほどと同様に{1+β、[H+1+β2[H+]2+β3[H+]3…+βn[H+]n}・qとおく.と

[Ln一] = ac, tenc/q (2-2-20)

[ 16 ]

(2-2-20)式が得られるので、それぞれの化学種の電荷をzとおくと、共役系の総

電荷量excess_chargeは次の(2-2-21)式で示される。

exoess_eharge = [Ln一ユ×zI、 十 [HL1-n]xzHI. 十 [H2L2-n]xzH2L… 十 [HnL]xzHnL

= [L”一] {zL + 6i [H’] zHL + B2 [H’] 2zH2L + … +B.[H’] ”zH.L} (2・一2-21)

よって共役系の全ての平衡定数(β、、β2、…)、個々のイオンの電荷(ZL、 ZHL、…)

、個々のイオンに水素イオンがいくつ付加しているか、という情報などを用意し

ておけば、この共役系の化学種による電荷の寄与を総濃度ac, tcncと水素イオン

濃度[H+]の関数で示すことができる。この水素イオン濃度をパラメータとして

変化させながら、総電荷量excess_chargeが0になる点のpH値を採用すれば、

煩雑な作業の伴う高次方程式を導かなくてもpH値を求めることができる。しか

しながらこの方法は、繰り返しのアルゴリズムを利用しているために、コンピュ

ータの活用が不可欠である。水溶液中での化学平衡を理論的に取り扱うための種

々の因子、例えばイオン強度、活量係数などを考慮して、このpH値を算出する

計算理論をプログラム上に展開し、これらの因子がどのような影響を及ぼしてい

るか検討した。

活量係数の補正に用いた拡張デバイ・ヒュッケル則はイオンの化学ポテンシャ

ルから導き出されたものであり、溶液中のイオン間の静電的相互作用と、イオン

と溶媒間の相互作用が寄与すると考えられている。実際の溶液中でこの法則に従

った相互作用が存在するかを計算値と実際の値との比較で検討した。

[ 17 ]

第三章 プログラム

3-1 プログラムの概略

3-1-1 プログラムの特色

①高度な化学やコンピュータに関する知識がなくても、比較的簡単に操作できる。

メニュー画面上から溶液中に存在する塩の種類、化学式、濃度、体積、希釈後

の体積を入力するだけで、プログラムは自動的に計算に必要なデータを、別のフ

ァイル上にあるデータベースから読み込み計算を始める。この際特に高度な化学

やコンピュータに関する知識を必要としないので、コンピュータを操作した経験

さえあれば、中学生や高校生にも利用できる。

②複数の酸・塩基あるいは塩が含まれている溶液でも計算できる。

高次方程式を導く方法では、溶液中の物質の種類が増加すると方程式の次数が

大きくなるため、誘導する労力が急激に増大し、実質的に求めることが不可能に

なるが、本プログラムではメモリの許す限り複数の物質が扱え計算できる。

③拡張デバイ・ヒュヅケル法に基づく活量係数の影響を補正する機能を持つ。

拡張デバイ・ヒュッケル法に基づくデーピアスの活量係数の式をプログラム上

に組込むことによって、より理論的に正しい計算が行える。このことで大部分の

物質、並びにpHの広い範囲に渡って、補正の効果が現れ実際の値に近づく。

④計算に必要な平衡定数などの情報はデータベースから自動的に読み込む。

[18]

一度データベースを構築していれば、計算の度に平衡定数などの情報を入力す

る必要はない。またこのデータベースはテキスト形式で書かれているので、市販

のエディターでも簡単に追加、修正できるが、専用のプログラムも用意してあり、

利用者の研究目的によって自由に構築が可能である。

⑤計算結果は短時間に得られ、しかも精度が高い。

いくら精度が高くても、一回の計算に何分も時間が掛かるようでは現実的では

ない。本プログラムでは、数種類の物質が混合している溶液についても1分以内

に結果がでるようにした。精度に関しては、ほぼ±0.1の範囲に収っている。

[ 19 ]

3-1-2 プログラムの開発環境

本プログラムはパーソナルコンピュータで使用することを年頭において制作し

た。ここではMS-DOS上で動く言語の利用を考えた。コンピュータの普及に伴っ

て、MS-DOS上で動く言語には様々なものが有り、従来は大型計算機でしか動かな

かったものもパソコンのレベルで利用可能となっている。最も良く知られている

言語にBASICがあるが、プログラムを構造化しにくい点やコンパイル後の実行速

度が遅い点など多くの弱点が有り候補から除外した。また科学技術の分野で最も

良く利用されているFORTRANは最適化に優れ計算速度が非常に早い利点も有るが、

パソコンレベルでのユーザーの利用が極めて少ないのでこれも除外した。そこで

数年前からアプリケーションの制作で脚光を浴びているrC言語』5)6)7)に着目

した。

この『C言語』は1972年から1973年にかけて、アメリカのベル研究所のDennis

Ritchieによって開発された、汎用の高水準プログラミング言語である。歴史的

にはミニコン(PDP-7)用のUNIXオペレーティングシステムの元となったファイル

システムを開発するために、同研究所のKen Thompsonが開発したB言語(1970年)

が進化したものである。そのルーツは古く、イギリスで進化したALGOL(1958年)

である。このALGOLは構文の規則性、モジュラー構造などの近代的な特徴を備え

ていたが、汎用性の過度の追及による抽象的な表現のために言語の主流とはなら

なかった。1960年国際委員会によって設計されたALGOL60をさらに使いやすくす

るために、1963年ケンブリヅジ大学、ロンドン大学においてCPL(Combined Prog

ramming Language)が開発されたが、憶えるのが難解で言語の持つ優れた能力を

十分に発揮できない欠点は解決されなかった。そこで1967年ケンブリヅジ大学の

Martin RichardsはCPLの優れている点だけを抽出し、 BCPL(Basic Combined Pro

gramming Language)開発した。この後先述のB言語を経てC言語に至った。同じ

[20]

ルーヅを持つものにPASCALがある。このC言語が生まれて約20年が経過したが、

この間にも進化が行われている。1980年に同研究所のBjarne Stroustrupがシミ

ュレーションの効率を上げるために、Simula67にあったクラスや導出クラスの概

念を導入してCwith Classesを開発した。1983年にはC++となり、現在では

多義演算子や参照型、仮想関数などのオブジェクト指向の概念が導入されている。

このC言語を一言で表せば、構造的でモジュール化ができ、コンパイル可能な

汎用プログラミング言語となる。この言語は数々の優れている点を持っているた

め、現在ビジネスソフトの開発等に広く利用されているが、そのおもな点は次の

通りである。

①構造化したプログラム

BASICとは異なりモジュール化、ブロック化している構造化言語であるが、最

近はこの考え方を更に進化させたオブジェクト指向言語となっている。この構造

化によって関数の使い回しが可能となり、一度作ったものがそのまま利用できる

だけでなく、長大なプログラムをモジュール別に制作できる等、プログラミング

上たいへん有利である。

②インラインアセンブラの利用

アセンブリ言語ルーチンを別個に作って、Cプログラムとリンクできることは

もちろん、Cプログラム中にアセンブリ言語コードを直接記述することができる。

これをインラインアセンブラと呼ぶが、この有効活用によって実行処理の高速な

プログラムが制作できる。ただし、移植性を考慮して今回のプログラムにおいて

はインラインアセンブラは使用していない。

[21]

③優秀なコンパイラ

パソコンで使われ始めた頃は、コンパイラの処理速度が非常に遅く、使いにく

いものが多かったが、最近の物はコンパイルの速度も著しく向上している。一 ワた

実行速度や容量に関するオプティマイズも十分に行われ、最適化の上でもFORTRA

Nに勝るとも劣らないところまで発展している。

以上の理由から本プログラムの作成にはC言語を利用した。また作成にあたって

のi操作方法、文法等は、文献8)9)10)11)を参照した。

[22]

3-1-3 プログラムの流れ

本プログラムは大きく4っのブロックから構成されている。

①利用者からの入力を解釈して、平衡系(共役系)の

イオン種、濃度、量などの情報を判断する。

②平衡系(共役系)に関する平衡定数などの計算に必

要な情報を、別のファイル上にあるデータベース

から読み込み、溶液内の条件を設定する。

データベース

③溶液内の電荷量に着目したアルゴリズムにより、

pHと緩衝能力を計算する。

④以上の計算結果を画面へ出力する。

[23]

3-2 アルゴリズム

3-2-1pHの計算アルゴリズム

pHを計算するフローチャートを図3-2-1-aに示す。このアルゴリズムは次の

ような仕組なっている。まずpHの初期値を与える。これを水素イオン濃度[H+1

に変換する。この時、活量係数には1を用いる。最初の共役系の化学種の濃度を、

この共役系の全濃度と平衡定数から計算する。例えばリン酸系の場合では(3-2-1-

1)式から(3-2-1-4)式の計算を一般化した関数サブルーチンを用いて行う。

CPO4[PO43一ユ・ (3-2-1-1)

1 十 K3[H+] 十 K3K2[H+]2 十 K3K2K1[H+ユ3

K, [H+] Cpo,

[HPO.2一] . (3-2-1-2)

1 十 K3[H+] 十 K3K2[H+]2 十 K3K2K1[H+]3

K,K, [H+] 2C...

[H,PO.一] = (3-2-1-3)

1 十 K, [H+] 十 K,K, [H+]2 十 K,K,K, [H+]3

K,K,K, [H+] 3C...

[H3PO4ユ =: (3-2-1-4)

1 十 K3[H+] 十 K3K2[H+]2 十 K3K2K1[H+]3

このサブルーチンは、プログラム中では一つのユニットとなっている。最初の共

役系の計算と同様に、溶液中の全ての共役系について処理を行い、全化学種の濃

度を算出する。この濃度を用いて、与えられた水素イオン濃度における全電荷量

を計算する。次にcharge balanceから溶液中の全電荷量は0でなければならな

[24]

いのでこの判断を行う。もし0でなければ最初に与えたpHの値が正しくないと

いうことになるので、pH値を変えて再度同様の計算処理をする。このようにし

て全電荷量が0になる点のpHを採用する。

次にこのサブルーチンに関連するユーザー関数calc_oonjとcalc_ph...subを解

説する。

ユーザー関数 double calc_conj

このユーザー関数は共役系の構造体と水素イオン濃度を引き数に与えると、それ

ぞれの共役系での電荷の和を返すルーチンである。次の表は、このユーザー関数

中で使われている主な変数の意味をまとめたものである。

h

ac. num-sp

q

ac, excess-charge

ac, tcnc

ac. sp [n] , eq-k

hdhrac, sp [n] . nm-h

ac, sp [n] . enc

水素イオン濃度

それぞれの共役系の化学種の数{1+lli [H’] +62 [H’] 2+B3 [H“] 3’・’+B. [H’] ”}

それぞれの共役系での電荷量の和

それぞれの共役系の全濃度

n番目の平衡定数

水素イオンの活量係数

n番目の化学種の持っている水素イオン

n番目の化学種の濃度

[25]

ユーーザー関数 double calc_ph_sub

このユーザー関数は化学種の数、緩衝能の計算の有無、活量係数の有無のフラグ

を引き数として与えると、pHの値を返すルーチンである。この関数の中で、前

述のユーザー関数caユe_conjを用いている。

total一一charge

step一一ph

upper-eharge

calc-water O

ph

それぞれの共役系の総電荷量の合計

pHの値の刻み値(1,0,1,0,01,0,001・…・と変化)

収束の判断の上限値(プログラム上では10’i2)

H+、OH一に関する総電荷量を計算するユーザー関数

採用されるp:H:

[ 26 ]

pHの初期値を与える。

[H+]に変換する。

pHを変える

平衡系1}の全濃度、平衡

關狽�pいて、この[H+]

ノおける共役化学種の濃度

�v算する。

平衡系2)について同様lI

全ての平衡系

について処理

を行う

総電荷量を計算する。

NO

総電荷量二〇

YES

図3-2-1-a pHの計算アルゴリズム

複数の平衡系(例 1:リン酸系、2:酢酸系…)を含む場合

[27]

3-2-2 活量係数の補正のアルゴリズム

活量係数の補正のフローチャートを図3-2-2-aに示す。このアルゴリズムは次

のような仕組になっている。まず共役系の全ての化学種の活量係数を1とする。

次に濃度と活量係数から全てのイオンの活量を計算する。先述のpHを計算する

ユーザー関数(calc_ph_sub)を使って、この活量からpHの最適値を計算する。

次に算出されたpH値におけるイオン強度を、濃度と電荷から計算する。このイ

オン強度から、拡張Debye-HUckel法の理論に基づくデーピアスの活量係数の式を

使って、それぞれの化学種の活量係数を計算する。今度はこの活量係数を使って

活量を求め、pHを算出後イオン強度を計算する。このイオン強度が前回計算し

たイオン強度の値と同じならばこの時のpHを採用する。もし異なっていれば再

度活量係数を計算し、収束するまで繰り返す。

このアルゴリズムに関連するユーザー関数calc_ion_strとset_aot_coefと

menuを解説する。

ユーザー関数double caユ。 ion str

このユーザー関数は、引き数として水素イオン濃度、化学種の種類、活量係数を

与えると、イオン強度を返すルーチンである。

act cor

proton-z

ionst

活量係数

水素イオンの電荷(通常は+1,0)

イオン強度

[28]

ユーザー関数set_act_ooef

このユーザー関数は、引き数として化学種の種類とイオン強度を与えると、それ

ぞれの共役系のそれぞれの化学種に関する活量係数を計算するルーチンである。

10g-g

Const A

Const B

proton一.z

cnj [m],sp [n],dh-r

活量係数の対数値

Debye-Hlickelの限界法則の定数A(ここでは0.5091)

Debye-HUckelの限界法則の定数B(ここでは0.3)

水素イオンの電荷(通常は+1,0)

m番目の共役系のn番目の化学種の活量係数

ユーザー関数 int menu

このユーザー関数は、化学式や濃度などを利用者が入力するためのメニュー画面

用のルーチンであるが、先述のパヅチはこのルーチン内で処理している。

*ap-org

letter

文字列の最初のポインタ

文字列へのパッチあて用文字

[29]

活量係数f、=1とする

濃度と活量係数から全ての

イオンの活量を計算する

活量を用いてpHの最適値を求める(calc-ph.sub)

(拡張Debye-HUckel法による)

(set-act-coef)

一り このpHにおけるイオン強度 1

1=一Zc,z,2 2を計算する(calc-ion一一str)

前回のイオン強度と

同じ値か

YES

図3-2-2-a活量係数の補正のフローチャート

[30]

3-2-3 化学式判別のアルゴリズム

化学式判別のフローチャートを図3-2-3-aに示す。このアルゴリズムは入力さ

れた化学式の文字列中’ a”に、識別するための共役系の文字列”b”が含まれてい

るか否か、並びにそのときの係数はいくらかを判別するためである。文字列”a”

中に文字列”b”が存在するならば、”b”の長さだけ後ろを検索する。もぴ)”な

ら更に後ろを検索する。数字ならばその数字を係数として採用する。そうでなけ

れば1を係数として採用する。なお重複の検索を防ぐために”a”の”b”に相当す

る箇所にパッチを充てる。

次にこのアルゴリズムに関連するユーザー関数xstrstrを解説する。

ユーザー関数 int xstrstr

このユーザー関数は引き数として入力された化学式の文字列”a”のポインタと識

別用の文字列” b”のポインタを与えると、”a”中の”b”に相当する係数を返すル

ーチンである。

*a

*b

*ap

leBg

suf

*ap 一一 ’O’

入力された化学式の文字列のポインタ

識別用の文字列のポインタ

検索用のポインタ

文字列の長さ

文字コードユ0進

文字コードを10進数に変換

[31]

文字列a中の文字列bの位置の検索

NO

bが存在するか

YES

文字列bの長さだけ後ろの位置の検索

NO

)であるか

YES

検索位置の移動

文字列の検索

YES

文字列の終わりか

NO

数字であるか

NO

1

YES

その数字 。

図3-2-3-a化学式判別のフローチャート

[32]

3-2-4 データベースの構造

このプログラムでは、個々の共役系の情報をC言語の構造体という変数を用いて

保持している。

(1)平衡系に関するデー・・一タベース:構造体 struct conjugate

これはひとつの共役系を表す構造体であり、この中にその共役系属するイオンの

データベースが別の構造体として表現されている。

変数名 データ 例(酢酸)

int nu瓜一sp 共役化学種の数 2

char sys[50] 共役系に関するコメント 酢酸系

char shiki[50] 化学式 CH3COOH

char name[50ユ イオン種の名前 酢酸イオン

double tcnc 総濃度 (入力)

doubユe vlm 蠣(入力)

double excess_charge 共役化学種の電荷の和 (計算出力)

double proton 水素イオン濃度 (計算)

struct species sp[0] 共役化学種に関する情報 酢酸イオンの構造体

struct species sp[1] 共役化学種に関する情報 酢酸分子の構造体

[33]

(2)共役化学種に関するデータベース:構造体 struct species

変数 データ 例(酢酸)

char name[50] 化学種の名前 acetie acid

char shiki[50ユ 化学種の化学式 CH3COOH

int nm』 化学種の複核数(注1) 1

int nm h 一 付加しているプロトン数 1

double eq_k 化学種の平衡定数 4.74

double dh r 一 活量係数 (計算)

int cfix 一 (注2) 0

double cnc 化学種の濃度 {計算)

double z 化学種の電荷 0.0

(注1)酢酸分子のように、濃度が高くなるにつれて二量体を形成する化学種の場

合に利用する変数。〔現在使用していない。二量体ならば2の値をとる。)

(注2)沈澱、溶媒、溶存溶質等を識別する変数で、現時点では強電解質か否かの

判別を行っている。

[34]

(3)データベースファイル

データベースファイルはテキスト形式で書かれている。このデータの配列は前述

の構造体の変数の順序に並んでいる。

(例)酢酸系

awwt 3 cooH gtul}.ggg3 c oo ww

acetate ion CH3COO一 ユ.、9L蝋£し辺畑

acetic acid CH3COOH 1 1 蝦0 1,0 0.0圓

1っの共役系のデータ

データ 説明 半角入力

2 酢酸分子と酢酸イオンの2種類。 半角

CH3COOH 共役系に関するコメントで化学式や名称等。

CH3COO 判別のための文字列。 半角

酢酸イオン 系を代表するイオンの名称。

acetate ion 一 1番目の化学種CH3COO の名称。(注1)

CH3COO一 化学種CH3COO一の化学式。

1 単量体で存在するとみなしているので1。 半角

0 水素イオンになることができるプロトン数。 半角

0.00 平衡定数。最初の化学種は必ず0,0。(注2) 半角

0 酢酸は弱電解質なので0。 半角

1.0 臨時の値。 半角

一1,0 CH3COO一の電荷なので一1,0 半角

acetic acid 一 2番目の化学種CH3COO一の名称。(注1)

4.74 酸解離平衡定数。(注2) 半角

[35]

(注1)化学種が複数存在する場合は、水素イオンと成り得るプロトン数の最も少

ない化学種から記述する。

(注2)酸解離平衡定数が複数存在する場合、すなわち化学種が3個以上存在する

場合の平衡定数の記述は以下の様になる。

化学種が3個存在する場合。

1番目の化学種 0,00

2番目の化学縮 pk2

3番目の化学種 pk2+pk1

化学種が4個存在する場合。

1番目の化学種

2番目の化学種

3番目の化学種

4番目の化学種

。. oo

pk,

pk,十pk,

pk,+pk,+pk,

ただしデータベース専用プログラムを使用すれば、そのままの順序に従って入力

すればよい。

(実際のファイル)

1Na十Naナトリウムイオン sodium ion Na十 1 O O, O 1 O, 1 1, 0

2NH3 NH4アンモニウムイオン ammonia NH3 1 0 O, OO O 1,0 O. O

ammonium ion NH4十 1 1 9. 480 O 1,0 十1,0

3H2CO3 CO3炭酸イオン carbonate ioR CO32一 1 0 O, OO O 1,0 一2,0

biearbonate ion HCO3一 1 1 10, 36 O L O 一LO

carbonate acid H2CO3 1 2 16, 70 O 1,0 O,0

4H3PO4 PO4燐酸イオン phosphate-ioR PO43一 1 0 O, OO O 1,0 一3,0

phosphate2-ion HPO42一 1 1 12, 32 O L O 一2,0

phosphate-ion H2PO4一 1 2 19,53 O 1,0 一1,0

phosphorie-acid H3PO4 1 3 21,65 O 1,0 O, O

’……… 莱コ省略)・………・…・

[36]

3-3 操作方法

プログラムの実行ファイルSTRUX, EXEとデータファイルDATA. DATが同一ディ

レクトリにあることを確認したらDOSブロンブトン上からSTRUXと入力する。

>STRU)團

(例)0,lmol/1のCH3COONa水溶液、50mlと

0,2mol/1のK2HPO4水溶液、40mlとを

混合して、純水で薄めて全量を100mlとする。

㈱ 画面中の綴は利用者からの入力を示す。

[37]

(1)入力画面その1

ファイルの検索中

データを読み込みました。

デー・タは22個です。

緩衝能を計算しますか? Y/N _囑

pHと緩衝能を計算します。

物質の種類は何種類ですか? 溺

(注1)

(注2)

(th3)

(注1)

(注2)

(注3)

データベースにすでに登録済みの共役系の数を示す。

対象の溶液中に強酸あるいは強塩基が0,0003mo1混入したと仮定して計算

したpHの変化量を緩衝能とする。この緩衝能を計算するときはyを入力

する。計算しない場合より約3倍時間がかかる。

CH3COONaとK2HPO4の2種類なので、2を入力する。

[38]

(2)入力画面その2

1番目の物質は何ですか?

化学式を半角で入力して下さい!幽

濃度は何Mですか? 魍

体積は何mlですか? 鞭

この溶液には CH3COO Naが含まれています。

2番目の物質は何ですか?

化学式を半角で入力して下さい!幽

濃度は何Mですか? 螂到

体積は何mlですか?

この溶液には PO4 K

が含まれています。

現在までの体積の合計は90,000m1です。

全体の体積は何mlですか? 魍

(注4)

(注5)

(注5)

(注6)

(注7}

(注5)

(注4)

(注5)

(注6)

(注7)

必ず半角で入力する。NaCH3COOと入力しても認識するが、大文字と小文字

を区別するのでCH3COONAでは正常な認識をしない。

数値は全て必ず半角で入力する。

判別された共役系の文字列を表示するので、入力ミスをこの段階でも確認

できる。

溶液の混合後の体積を示す。この場合には50mlと40mlで90mlとなるの

で全体の体積は、少なくとも90m1以上を入力しなければならない。

[39]

(3)入力画面その3

イオン種 モル数

酢酸イオン 0,00500mol

リン酸イオン 0,00800mo 1

ナトリウムイオン 0.00500mol

カリウムイオン 0.O1600 mo1

全体の体積は100,0000m1です。

これで良いですか?

正しくなければNを入力して下さい。 糊

モル濃度 (注8)

O, 05000 M

O, 08000 M

O, 05000 M

O, 16000 M’

(注9)

(注8)最終確認のための画面表示。それぞれの共役化学種(イオン種)の種類とモ

ル数、モル濃度を表示する。

(注9)正しくなければnを入力する。正しければそのままリターン。

[40]

(4)計算結果の出力画面

.N“t

…・・(途中省略)・・…

Av,

総轄oo60000000008589

この溶液のpHを計算しました。

活量係数の補正を行いました。(拡張デバイ・ヒュヅケル法)

pHは9,21508です。

水素イオンの活量係数は 0,73506です。

f[hydroxide ion] =O,735061

f[water] =1, OOOOOO f [sodium-ion] =O, 735061

f [acetat e-ion] =O, 735061

f [acetic-acid] =1, OOOOOO

f[phosphate__ionユ ニ0,062649

f[phosphate2一一.ion] =O,291941

f [potassium-ion] =O, 735061

溶:液のイオン強度は 0.28527です。

(注10)

(注11)

,’v

.”v

(注10)次の計算結果に進むためには、そのままリターンする。緩衝能を計算し

ない場合には2回、計算する場合には6回りターンすると、最終出力画

面になる。

(注11)全ての共役化学種(イオン種)の活量係数と、溶液のイオン強度を表示す

る。

[41]

(5)計算結果の最終出力画面

計算結果:

溶液のpHの値(活量係数の補正なし)

この時の総電荷量

溶液のpHの値(活量係数の補正あり)

この時の総電荷量

緩衝能計算結果

塩基が混入したときのpHの値 9,741

酸が混入したときのpHの値 9、689

.活量係数の補正あり

塩基が混入したときのpHの値 9,236

酸が混入したときのpHの値 9,194

終了しますか? Y/N _鳥回_

9, 715

0, OOOOOOOOOOOO6628

9, 215

0, OOOOOOOOOOOO8589

変動量

十〇, 026

-O, 026

十〇,021

-O. 021

(注12)

(注12)プログラムを終了するときにはy、終了しないときにはnと入力する。

[42]

第四章 結果及び考察

4-1 計算結果と文献値・実測値との比較

232種類の溶液(物質の組み合わせ35種類、それぞれ濃度を1~19種類)

について、文献値12)並びに実測値との比較を行った。この内活量係数の補正を

行って計算した場合、pH値に0,20以上の差が生じたものは10種類に過さ

ない。これは全体の、わずか4,3%である。しかも無機化合物のみならず有機

化合物においても、高い精度で文献値・実測値をシミュレートしている。

またMichaelisの緩衝溶液(NH4Cユ+NH,系)のように計算値が全て小さく出る場

合や、Michaelisの緩衝溶液(酒石酸+酒石酸ナトリウム系)のように全て大きく

出る場合などは、用いる平衡定数の補正によって簡単に差を少なくすることもで

きる。この詳しい説明は4-2に述べている。

活量係数の補正を行わなかった場合と行った場合の比較では、明らかに行った

場合の方が精度が高い。補正によって逆に精度を悪くしたものが29種類存在す

るが、このうち文献値との差が0,10以上になったものは5種類、0,20以

上になったものはなかった。

[43]

表4-1-1文献値と計算値の比較

(注1)文献値 :化学便覧改定2版 (温度を明記していないものは室温の値)

計算値1:活量係数の補正無し

計算値2:活量係数の補正有り(拡張デバイ・ヒュッケル則、デーピアスの式)

姓2}数’字 :活量係数の補正後、文献値との差が0.10以上有るもの

團麗麗 :活量係数の補正後、文献値との差が0,20以上有るもの

獄 :活量係数の補正をしない方が、文献値との差が小さいもの

1)Clark-Lubsの緩衝溶液 (KCl+HC1系)

文献値 20℃ 1.0 1.2 1.4 1.6 1.8

計算値1 1.01 1.19 1.38 1.58 1.78

計算値2 1.13

撚 1.49 1.69 1.89

文献値 20℃ 2.0 2.2

計算値1 1.97 2.17

計算値2 2.08 2.28

2)Clark-Lubsの緩衝溶液 (フタル酸水素カリウム+HCl系)

文献値 20℃ 2.2 2.4 2.6 2.8 3.0

計算値1 2.27 2.51 2.73 2.94 3.13

計算値2 2.26 2.46 2.66 2.85 3.03

[44]

文献値 20℃ 3.2 3.4 3.6 3.8

計算値1 3.33 3.54 3.75 3.98

計算値2 3.22 3.42 3.60 3.79

3)Clark-Lubsの緩衝溶液 (フタル酸水素カリウム+NaOH系)

文献値 20℃ 4.0 4.2 4.4 4.6 4.8

計算値1 4.22 4.47 4.71 4.94 5.16

計算値2 3.98 4.19 4.39 4.60 4.81

文半値 20℃ 5.0 5.2 5.4 5.6 5.8

計算値1 5.37 5.59 5.79 6.00 6.20

計算値2 5.01 5.22 5.43 5.63 5.82

文献値 20℃ 6.0 6.2

計算値1 6.41 6.60

計算値2 6.03 16.22

[45]

4)Clark-Lubsの緩衝溶液 (KH2PO4+NaOH系)

文献値 20℃ 5.8 6.0 6.2 6.4 6.6

計算値1 6.12 6.32 6.52 6.74 6.95

計算値2 5.77 5.97 6.18 6.38 6.59

文献値20℃ 6.8 7.0 7.2 7.4 7.6

計算値1 7.16 7.37 7.58 7.79 7.98

計算値2 6.80 7.00 7.21 7.41 7.61

文献値 20℃ 7.8 8.0

計算値1 8.18 8.37

計算値2 7.81 7.99

5)Sφrensenの緩衝溶液 (クエン酸ナトリウム+HC1系)

文献値 18℃ 1.04 1.17 1.42 1.93 2.97

計算値1 1.00 1.10 1.39 1.93 3.13

計算値2 1.11 1.21 1.50 2.01 3.02

文献値 18℃ 3.69 4.16 4.45 4.65 4.96

計算値1 3.95 4.51 4.87 5.14 5.58

計算値2 3.72 4.18 4.48 4.70 5.05

[46]

6)Sφrensenの緩衝溶液 (クエン酸ナトリウム+NaOH系)

文献値 20℃ 4.96 5.11 5.31 5.57 5.98

計算値1 5.58 5.78 6.02 6.31 6.71

計算値2 5.05 5.22 5.42 5.67 6.05

文献値 20℃ 6.34 6.69

計算値1 7.05 7.38

計算値2 6.39 6.71

7)Sφrensenの緩衝溶液 (KH2PO4+NaHPO4系)

文献学 18℃ 4.49 5.29 5.59 5.91 6.24

計算値1 4.69 5.63 5.93 6.26 6.61

計算値2 4.50 5.28 5.58 5.90 6.25

文献値 18℃ 6.47 6.64 6.81 6.98 7.17

計算値1 6.84 7.03 7.21 7.39 7.58

計算値2 6.48 6.66 6.84 7.01 7.20

文献値 18℃ 7.38 7.73 8.04 9.18

計算値1 7.81 8.16 8.49 9.71

計算値2 7.43 7.76 8.10 9.25

[47]

8)Kolthoffの緩衝溶液 (HCl+Na,CO3系)

文献値 18℃ 10.17 10.32 10.51 10.86 11.24

計算値1 10.53 10.71 10.93 11.23 11.67

計算値2 10.15 10.33 10.55 10.87 11.41

9)Kolthoffの緩衝溶液 (クエン十二水素カリウム+クエン白系)

文献値 18℃ 2.2 2.4 2.6 2.8 3.0

計算値1 2.34 2.58 2.78 2.99 3.20

計算値2 2.30 2。5蓬 2.70 2.89 3.09

文献値 18℃ 3.2 3.4 3.6

計算値1 3.42 3.64 3.87

計算値2 3.29 3.48 3.66

10)Kolthoffの緩衝溶液 (クエン十二水素カリウム+HCl系)

文献値 18℃ 2.2 2.4 2.6 2.8 3.0

計算値1 2.25 2.51 2.75 2.97 3.17

計算値2 2.26 2.46 2.67 2.87 3.05

[48]

文献値 18℃ 3.2 3.4 3.6

計算値1 3.36 3.57 3.79

計算値2 3.23 3.41 3.60

11)Kolthoffの緩衝溶液 (クエン酸二水素カリウム+NaOH系)

文献値 18℃ 3.8 4.2 4.6 4.8 5.0

計算値1 4.02 4.45 4.95 5.20 5.46

計算値2 3.81 4.20 4.60 4.80 5.01

文献値 18℃ 5.2 5.4 5.6 5.8 6.0

計算値1 5.73 5.97 6.20 6.40 6.63

計算値2 5.22 5.42 5.62 5.80 6.02

12)Kolthoffの緩衝溶液 (Na2HPO4+NaOH系)

文献値 18℃ 11.0げ 11.2 11.6 11.8 12.0

計算値1 11.42 11.60 11.96 12.13 12.28

計算値2 10.93 11.11 11.51 11.72 11.92

[49]

13)Michaelisの緩衝溶液 (酒石酸+酒石酸ナトリウム系)

文献値 1.4 2.0 2.7 3.6 4.5

計算値1 2.32 2.59 3.24 4.58 5.56

計算値2

灘 躍 灘 園 翻14)Michaelisの緩衝溶液 (乳酸+乳酸ナトリウム系)

文献値 2.3 2.9 3.2 3.5 3.8

計算値1 2.62 3.00 3.27 3.57 3.86

計算値2

翻 2.93 3.19 3.47 3.77

文献値 4.17 4.45 4.7 5.0 5.3

計算値1 4.16 4.46 4.77 5.07 5.37

計算値2 4.◎6 4.36 4.66 4.96 5.26

15}Miohaelisの緩衝溶液 (酢酸+酢酸ナトリウム系)

文献値 3.19 3.5 3.8 4.1 4.4

計算値1 3.30 3.58 3.84 4.14 4.44

計算値2 3.24 3.50 3.76 4.05 4.35

[50]

文献値 5.0 5.3 5.6 5.9 6.22

計算値1 5.04 5.34 5.64 5.94 6.25

計算値2 4.94 5.24 5.54 5.84 6.14

16)Michaelisの緩衝溶液 (NH4Cl+NH3系)

文献値 8.0 8.3 8.58 8.89 9.19

計算値1 7.75 8.06 8.36 8.66 8.96

計算値2 7.86 8≧16 8.46 8.76 9.06

文献値 9.8 10.1 10.4 10.7 11.0

計算値1 9.56 9.86 10.17 10.44 10.70

計算値2 .9.6.5 9.95 ま0ゼ・24 1◎.δ2 ㎜酬魍

17)Michaelisの緩衝溶液 (ジエチルバルビツル酸ナトリウム+職ナトリウム+NaC1+HCユ系)

文献値 18℃ 9.16 8.18 7.004.馬 R3 2.62

計算値1 9.41 8.39 7.27 4.67 2.16

計算値2 9.29 &28 ?.工6

翻 田

[51]

18}Michaelisの緩衝溶液 (ジエチルパルビヅル酸ナトリウム+HCl系)

文献値 25℃ 6.80 7.00 7.40 7.60 8.00

計算値1 6.94 7.17 7.57 7.77 8.16

計算値2 6.84 7.06 7.46 7.65 8.05

文献値 25℃ 8.20 8.60 9.00 9.40 9.60

計算値1 8.35 8.74 9.11 9.54 9.77

計算値2 8.23 8.62 9.00 9.42 9.65

19)Mcllvaineの緩衝溶液 (Na2HPO4+クエン酸系)

文献値 2.2 4.0 5.0 7.0 8.0

計算値1 2.24 4.40 5.69 7.55 8.56

計算値2 2.22 4.09 5.18 7基13 8.三5

20)Menzelの緩衝溶液 (Na2CO3+NaHCO3系)

文献値 18℃ 9.47 9.73 9.90 10.08 10.35

計算値1 9.88 10.18 10.36 10.53 10.83

計算値2 9.50 9.79 9.96 10.13 10.42

[52]

文献値 18℃ 10.77 11.54

計算値1 11.27 11.82

計算値2 10.88 11.55

21)Walpoleの緩衝溶液 (CH,COONa+HCl系)

文献値 0.65 0.91 1.42 2.64 3.95

計算値1 0.70 0.92 1.40 2.72 4.14

計算値2 0.83 1.04 1.51 2.72 4.03

文献値 4.39 4.76 5.20

計算値1 4.56 4.92 5.34

計算値2 4.45 4.80 5.22

22)Walpoleの緩衝溶液 (CH3COONa+CH3COOH系)

文献値 18℃ 6.80 7.00 7.40 7.60 8.00

計算値1 6.94 7.17 7.57 7.77 8.16

計算値2 6.84 7.06 7.46 7.65 8.05

[53]

文献値 18℃ 8.20 8.60 9.00 9.40 9.60

計算値1 8.35 8.74 9.11 9.54 9.77

計算値2 8.23 8.62 ・9.11 9.42 9.65

23)Hasting-Sendroyの緩衝溶液 (Na2HPO4+KH2PO4系)

文献値 20℃ 6,809 6,909 7,005 7,103 7,212

計算値1 7,203 7,304 7,406 7,510 7,620

計算値2 6,829 6,928 7,028 7,129 7,238

文献値 20℃ 7,313 7,412 7,655 7,848 8,018

計算値1 7,730 7,831 8,083 8,288 8,461

計算値2 7,346 7,446 7,696 7,899 8,071

24)Gomoriの緩衝溶液 (トリメチルピリジン+HCl系)

文献値 23℃ 6.45 7.03 7.40 7.77 8.35

計算値1 6.45 7.03 7.40 7.77 8.35

計算値2 6.54 7.13 7.49 7.86 8.44

計算値3 6.53 7.11 7.47 7.82 8.37

(注)計算値3:HCIのpka=一7としたときの値(活量係数の補正有り)

[ 54 ]

24)Gomoriの緩衝溶液 (トリスアミノメタン+HC1系)

文献値 23℃ 7.20 7.77 8.14 8.50 9.10

計算値1 7.12 7.71 8.07 8.44 9.03

計算値2 7.22 7.80 8.17 8.53 9.11

25)温血動物の等張緩衝溶液 (クエン酸+Na2HPO4系)

文献値 2.06 2.94 3.81 4.79 6.33

計算値1 2.19 3.13 4.13 5.31 6.93

計算値2 2.13 3.00 3.86 4.86 6.49

26)蟻酸一一一 ma酸ナトリウム緩衝溶液

文献値 25℃ 2.6 2.8 3.0 3.2 3.4

計算値1 2.67 2.87 3.07 3.27 3.47

計算値2 2.58 2.78 2.98 3.18 3.38

文半値 25℃ 3.6 3.8 4.0 4.6 4.8

計算値1 3.67 3.87 4.07 4.67 4.87

計算値2 3.58 3.78 3.98 4.58 4.77

[55]

表4-1-2実測値との比較

(注1)実測値 :液温26℃の測定値

計算値1:活量係数の補正なし

計算値2:活量係数の補正あり(拡張デバイ・ヒュヅケル法、デーピアスの式〕

(注2)数 字 :活量係数の補正後、実測値との差が0.10以上あるもの

羅 :活量係数の補正後、実測値との差が0,20以上あるもの

粧 :活量係数の補正をしない方が、実測値との差が小さいもの

(注3}複数の物質を記載している場合の濃度は混合後の濃度

(例) NaH2PO45,75×10-3M

CH3COOH 5, 20 × 10-3M

実際は1,15×10“2MのNaH2PO4を20m1と1,04×10’2MのCH3COOHを20mlを混合

したもの。ただし混合後の全量は40mlとする。

(注4)測定に用いたpHメータはHORIBA pHMETER M-8L

1)濃度の異なる酢酸

酢酸の濃度(M) 実測値 計算値1 計算値2

2.38一 騨 霞 一 輔 一 冒 一 圃 一 r 一 一 一 一 一 一 一 一 一 一

@2.88

9.52×10-1? 一 一 一 瞬 一 ■ 一 ■ 璽 一 一 一 冒 ■ 一 冒 一 冒 一 冒 冒 一 ■ 一 冒 一 冒 一

@9.52×10-2| 顧 一 一 一 騨 一 轄 卿 一 璽 ■ 一 一 璽 冒 一 璽 ■ 璽 一 一 一 ■ 冒 一 一 一 一

@9.52×10-3? 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 冒 一 一 一 一 一 一 一

@9.52×10-4

2.49。 一 一 一 一 一 騨 一 零 一 騨 一 ■ 零 辱 一 一 一 一 一 冒

@2.96? 一 一 一 一 } 一 一 璽 騨 一 暉 一 一 一 一 一 一 一 一 暉

@3.43? 一 冒 一 冒 一 冒 一 冒 一 一 冒 一 一 一 ■ 一 雪 一 冒 ■

@3.91

2.38? 一 一 一 一 一 一 一 一 一 一 一 富 一 曽 一 - 讐 曽 顧 騨 一

@2.88? 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 冒 一 一 闇 曽

@3.39? 一 一 一 一 一 一 曽 贈 卿 一 一 , 騨 暉 一 辱 璽 ■ 一 一

@3.91

甲 糟 需 一 曽 o 鱒 一 一 冒 一 一 一 一 一 , 一 一 璽 一 一

@3.39一 一 _ _ _ 冒 暫 一 一 一 一 一 冒 o 一 一 ■ 一 一 冒 一

@3.91

[ 56 ]

2)リン酸のナトリウム塩と酢酸の混合溶液

塩 濃度(M) 実測値 計算値1 計算値2

3.67 3.65 3.62NaH2PO4bH3COOH

?一 一 冒 一 一 一 冒 一 一 冒 一 曽 一 一 騨 騨 願 P 一 璽 一 璽 冒 一 一

ma2HPO4bH3COOH

? 璽 ■ 璽 冒 一 冒 一 冒 一 冒 冒 冒 一 冒 璽 一 一 一 一 一 響 一 層 一 一

ma3PO4bH3COOH

5.75×10}3

T.20×1『3?■ 一 一 冒 冒 冒 嚇 一 r 卿 一 璽 一 一 一 一 一 ■ 一 冒 冒 冒 一

U.75×10-3T.20×10-3

? } 一 一 一 一 璽 殉 一 一 一 一 一 一 一 一 一 一 一 噛 雫 一 一 一

V.15×10-3T.20×10-3

噛 曹 響 胃 ■ 一 一 一 璽 冒 冒 一 - 一 響 , 一 ■ 一 一 一 一 一 一 一 一 一 一 一 一 一 一 層 一 一 一 一

@6.70

一 _ _ 一 曽 一 , 一 一 一 一 一 一 一 一 囎 一 一 一

@6.44 6.47? 一 一 冒 一 騨 一 一 一 一 璽 一 一 一 一 一 一 一

P1.10

一 , 聰 一 一 一 9 一 辱 辱 一 一 一 一 一 鴨 辱 一 一

P1.17

一 _ 璽 一 ■ 一 一 一 冒 冒 一 9 一 一 一 一 一 冒 冒

3)pH7附近を示す代表的な溶液

塩 濃度(M) 実測値 計算値1 計算値2

6.09? 一 一 一 讐 幽 一 囎 P 一 鞘 騨 璽 一 一 一 一 一

7.00?團 9 - r 一 一 一 一 一 冒 曽 一 願 一 一 一 〇 一

闘騨 r 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一CH3COONH4?冒 一 一 一 冒 一 一 一 一 一 , , 一 噌 騨 の , 璽 鴨 騨 r 一 一 一 一

maH2PO4ma2HPO4

0,106? 一 一 一 一 一 一 噛 一 一 一 一 一 一 凹 一 幽 曽 一 一 一 〇 一 刷

O,100O,103 6.71 7.22 6.82

表4-1-3文献値・実測値とのpHのずれ

計算値

pHのずれ活量係数の補正無し 活量係数の補正有り

0.1未満 61種(26,3%} 196種(84,5%)

0.1~0.2 48種(20.7%) 26種(11,2%)

0.2以上 123種(53,0%) 10種 (4,3%)

[57]

4-2 平衡定数の変更に伴う計算結果の変動

アンモニアの平衡定数はpkb・9,26〔25℃)であるが、この値をそのまま用いて計

算している場合は、文献値と計算値との差は比較的大きい。しかしpH・11,0を除

くと△pH・(計算値)一(文献値)の値はほぼ一定の値を示している。活量係数の補

正を行なわない場合で△pH≒0,24、補正を行っている場合では△pH≒0,14である。

そこで△pH≒0に近づけるためにpKbを大きくして計算を行ってみた。表4-2-1か

らpKb・9.40の時に最も文献値に近付くことがわかった。このように平衡定数

pKbを補正して計算することによって、本プログラムは更に実際の値をより良く

シミュレートすることになり、信頼性や実用性が高まる。

[58]

表4-2-1平衡定数の変化に伴う計算値の変動

(注1)各表上段の数値は活量係数の補正なし、下段は補正有り

(注2)数:.字 :活量係数の補正後、文献値との差が0,10以上有るもの

躍 :活量係数の補正後、文献値との差が0,20以上有るもの

欝 :活量係数の補正をしない方が、文献値との差が小さいもの

Michaelisの緩衝溶液 (NH3+NH4Cl系)

NH3のpKb・9,260を変化させたときの計算値

文献値 8.0 8.89 9.5 10.1 11.0

pKb

X,2607.75 8.66 9.26 9.86 10.70

7.86 8.76 9.36 9.95

7.77 8.68 9.28 9.88 10.719,280

7ボ88 8.78 9.38 9.97

7.79 8.70 9.30 9.90 10.739,300

7.90 8.80 9.4◎ 9.99

7.81 8.72 9.32 9.92 10.759,320

7.92 8.82 9.42 10.01 10..81

7.83 8.74 9.34 9.94 10.779,340

7.94 8.84 9.44 10.03 10.82

[59]

7.85 8.76 9.36 9.96 10.789,360

7.96 8.86 9.46 10.05 :1℃ピ:84

7.87 8.78 9.38 9.98 10.809,380

7.98 8.88 9.48 10.07 ユ:α∵86,

7.89 8.80 9.40 10.00 10.819,400

8.00 8.90 9.50 10.09 ユ◎べ・87

7.91 8.82 9.42 10.02 10.839,420

8.02 8.92 9.52 10.11

7.93 8.84 9.44 10.04 10.859,440

8.04 8.94 9.54 10.13 10.91

7.95 8.86 9.46 10.06 10.879,460

8.06 8.96 9.56 10.15 10.92

7.97 8.88 9.48 10.08 10.889,480

8.08 8.98 9.58 10.17 10.94

[60]

4-3 プログラムの制限事項

本プログラムは、物質の種類やその溶液組成に関わらず正確にpHを理論計算

することができる。しかしながら下記の1)2)のように、いくつかの物質につ

いては、pHの領域によって精度が悪くなるものと、全ての領域で大きな誤差を

生じるものがある。

1)HClを含むもの。

精度の悪くなる領域

最大誤差の平均

強酸性側(約pH<2)

ApH UO, 15

実際のpH値に比べて、強酸性側で計算した値が大きくなる傾向がある。これは

HC1を含む高濃度の溶液ではイオン強度が大きくなり、この結果として拡張デバ

イ・ヒユヅケル則から水素イオンの活量を実際の値よりも小さく計算するためで

ある。しかしながら1M以下のHCIでは、誤差は0,20未満であるので実用に問題

はないと考えられる。

2)両性イオンを含むもの。

精度の悪くなる領域

最大誤差の平均

強酸性側を除くほぼ全領域

ApH>2

これはアミノ酸のような両性イオンを、本プログラムでは電荷を持たない中性分

子とみなして計算するためである。この誤差は1,0を越えるため、本プログラム

での計算は不可能である。

[61]

第五章 結論

活量係数の補正をしない場合でも、ほとんどの溶液並びにその溶液組成につい

て文献値と計算値との誤差は±0,5の範囲内に収つた。しかし活量係数の補正

を行なった場合にはさらに精度が高くなり、全溶液組成の96%が±0,2以下

の誤差に収つた。中でもpH・3~pH=11の弱酸性~弱塩基性の領域では計算

精度が高い。このことから活量係数の補正に用いたデーピアスの式が、溶液中の

化学平衡並びにイオンの挙動をほぼ正確に示していることがわかった。つまり有

限濃度の溶液中では、イオン間の静電的相互作用やイオンと溶媒の相互作用が無

視できないレベルで存在していることを、このpHを計算する理論によって説明

することができた。

また今回の研究での副産物として、開発したpHを理論計算するプログラムは、

活量係数の補正を組み込むことによって、多数の物質の広い範囲で実際の値を良

くシミュレートしている。特に実際の実験等で利用頻度の高い、弱酸~弱塩基領

域の緩衝溶液での計算精度は十分実用に値する。さらにこのプログラムは、特に

高度な化学やコンピュータに関する知識がなくても利用可能であり、平衡定数な

どのデータベースの拡張も容易である。従来行なわれていた高次方程式を誘導し

て、これを近似計算する方法では2、3種類の物質が含まれている混合溶液が限

度であったが、本プログラムを使うことでその制約もなくなった。本プログラム

は大学の研究室のみならず、中学校や高等学校の教育現場においても広い利用価

値があるものと思われる。

[62]

参考文献

1)荒木 峻訳:R,L, Pecsok, L, D, Shields共著:

「分析化学」(1971)東京化学同人

2)大滝仁志、田中元治、舟橋重信 著: 「溶液反応の化学」(1977)学会出版センター

3)Pure&Appl。 chemりVol。54, No.12, pp.2675-2692,1982, GUIDELINES FOR THE DETERMINATION OF STABILITY CONSTANTS

4) Talanta, Vol, 30, No. 3, pp, 20-208, 1983 ANNOTATION

FAST pH CALUCUATIONS IN AQUEOUS SOLUTION CHEMISTRY

5)土居範久著:「情報処理入門コース6 基礎C言語」(1991)岩波書店

6)アスキー出版局監訳:Les Hancock,Morris Krieger共著: 「C言語入門」(1984)アスキー

7)足立高徳著:「C++入門」(1988)CQ出版

8)中山 茂著:「教育用C言語のABC」(1989)技報堂出版

9)中山 茂著:「Turbo C,Turbo C++グラフィヅクスプログラミング入門」 (1989)技報堂出版

10)Borland International著:マイクロソフトウェアアソシエイヅ編訳: 「TurboC2,0ユーザーズガイド」(1988)マイクロソフトウェアアソシェイツ

11)BorIand International著:マイクロソフトウェアアソシエイヅ編訳: 「TurboC2,0リファレンスガイド」(1988)マイクロソフトウェアアソシェイツ

12)日本化学会編:「化学便覧基礎編 改定2版」(1975)丸善

[63]

プログラムの全リスト

1)メインプログラム (ファイルサイズコメント文を鋤て約27kB)

/***************************************************************************/

/* strux, cpp *//* 「複数の弱酸・弱塩基を含む化学平衡系の理論的解析」 */

/* 教科領域教育自然系コース(理科) 佐藤哲也 */

/* 1992, 6, 19 一 1993, 12, 20 *//***************************************************************************/

/*プリプロセヅサ**********************************************************/

#inelude 〈stdio, h>

#inelude 〈string,h>

#include 〈graphics, h>

#inelude 〈process,h>

#inelude 〈math,h>

#include 〈conio,h>

#include 〈stdlib,h>

#inelude 〈dos. h>

#include 〈dir, h>

#inelude 〈alloe, h>

#inelude 〈ctype, h>

#define FILE_NAME”data,dat” /*データファイルの名前 */

/*構造体の設定*************************寒************************************/

struet speeies {

struct sPecies*next; /*次の構造体 speciesのポインタ */

char na皿e[50]; /*名前 acetic acid */ char shiki[50]; /*化学式 CH3COOH */

int 皿』; /*複核数 1 */

int n皿_h; /*プロトン数 1 */ double eq_k; /*平衡定数 指数 */ double dh_r; /*活量係数 0,98 */

int c_fix; /*c_fix==1 活量1:沈澱、溶媒等 */ /*c_fix==o 濃度可変、層層溶質 */

double enc; /*濃度 0,2 */

double z; /*電荷 0 */};

struet eonjugate (

struet eonjugate*next; /*次の構造体conjugateのポインタ */

char sys[50]; /*共役系に関するコメント */

char shiki[50]; /*化学式 CH3COOH */

char name[501 ; /*イオン種の名前 */

[64]

double tcnc;double v1皿;

int . num-sp;

double excess-charge;

double proton;struct speeies sp[5];

/*総濃度 メニューから入力/*体積

/*共役化学種の数 酢酸なら2

/*共役化学種の電荷の和

/*水素イオン濃度

/*共役化学種に関する情報

/*ただし、sp[0]は、塩基モノマー

*/

*/

*/

*/

*/

*/

*/

};

struct conjugate cnj-list[40];

struct eonjugate cnj[20];

/洪役系のデータベース/*目的の共役系

*/

*/

int

int

ehar

double

int

int

max-enj;

nu皿_cnj;

salt_na皿e[10] [50];

salLcne [10] ;

num-salt;

皿ax;

/*共役系のデータベースの最大数

/*目的の共約系の数

/*共存電解質の塩の化学式

/洪存電解質の塩の濃度/*共存電解質の塩の種類

/*データベース中のデータ数

*/

*/

*/

*/

*/

*/

/*グローバル変数**********************************************************/

double

double

double

double

double

double

double

int

double

ehar

con [25], conc [25] ;

vo1[25],vo1皿[25];

皿01[25],皿01e[25];

皿01_con[25];

V-a11;

ph-x [10] ;

eharge-x [10] ;

i-debug = O;

h-dh.一r = 1, ;

buffer;

/聴択されたイオンの濃度/*選択されたイオンの体積

/*選択されたイオンのモル数

/撮終的なイオンの濃度/*最終体積

/*pHの値の保存/囎:電荷量の値の保存

/*・1デバッグ用表示 ・0非表示

/*水素イオンの活量係数

/*緩衝能計算のフラグ

*/

*/

*/

*/

*/

*/

*/

*/

*/

*/

/*プロトタイプ宣言********************************************************/

void set-water( struct conjugate & water );

//水のイオン解離に関する情報の設定であり、独立なサブルーチンにする。

void set-ae( struct conjugate & ae , FII,E *fl);

//化学種に関する情報の設定であり、独立なサブルーチンにする。

void list-conj ( struct eonjugate conj);

// 共役系の画面出力

int xstrstr( ehar *a,char *b);

//化学式aの文字列bの後の数字の検出

void init-vari ( void ) ;

//変数初期化

int 皿enu( void };

//メニューサブルーチン

[65]

void file( void );

//ファイルのオープン、クローズ

double eale-water( struct eonjugate & water, double h );

//水のイオン解離に関する平衡状態を入力のプロトン濃度で計算する。

//戻り値は、この平衡系のexcess_chargeである。

double eale-conj( struet conjugate & ac, double h );

//共役系に関する平衡状態を入力のプロトン濃度で計算する。

//戻り値は、この平衡系のexcess-chargeである。

double ealc-ion-str( double h,

//イオン強度の計算

int shurui, int aet-cor );

void set_act_coef( int shurui, doub王e ionst };

//活量係数の計算

double cale-ph-sub( int shurui ,

//pHの計算ルーチン サブ

void cale-ph( int shurui ,int frag,

//pHの計算ルーチン メイン

int buf_皿ode }書

int buf_皿ode, int act_cor };

void print-ph( void );

//pHの計算結果の画面出力

/*パラメータ設定**********************************************************/

void set-water( struct conjugate & water )

//水のイオン解離に関する情報の設定であり、独立なサブルーチンにする。{

water,nu皿_sp = 2;

water, tenc = LO;

strepy{water, sys,”水の電離系”);

strcpy( water. shiki, ”H20”);

/*O-th species*/

/* By Diffinition */

/*塩基モノマー

strcpy( water, sp[0],na皿e, ”hydroxide ion” };

strcpy( water, sp[O],shiki, ”OH一” );

water, sp [O], nm-m = 1;

water, sp[O],nm-h = O;

water, sp [Ol, eq-k = L O;

water, sp [O],e-fix = O;

water, sp [O], cnc = 1, O;

water, sp [O],z = 一1, O;

/*1-th speeies*/

strepy( water, sp[1],name, ”water” );

strcpy( water, sp[1],shiki, ”H20” );

water,sp[1],n皿_皿 二 1;

/*Temporary Value

/*水素付加イオン(分子)

*/

*/

*/

[66]

water, sp[1],nm-h = 1;

water, sp[1],eq-k = LOe14;

water, sp[1],c_fix・1; /*溶媒なので、濃度固定 water, sp [1], enc = 1;

water, sp[1],z ・0; /*分子だから電荷なし}

v。id set_ac{struct c。njugate&ac,FILE*f1} /*FILE*f1が必要*/

//化学種に関する情報の設定であり、独立なサブルーチンにする。{

int ’ i;

double x,ph;

elrscr O ;

printf (”ファイル検索中¥n”};

fseanf (fl, ”%d”, &ae, num-sp) ;

fscanf (fl, ” %s ”, ae, sys) ;

fscanf (fl, ” %s ”, ac, shiki) ;

fscanf{fl,”%s ”,ac,na皿e);

for{i=0;i〈ac, nu皿_SP;i++}{

fscanf{f1,”%s”,ac, sp[i},na皿e};

fscanf (f 1,”%s”,ac, sp [i], shiki) ;

fscanf(f1,”%d”,&ac, sp[i],n皿_皿 );

fscanf (fl,” %d”, &ac, sp [i], nm-h ) ;

fscanf (fl,”%If”,&ac, sp [i],eq-k );

ac, sp [i], eq-k=pow (10, O, ae, sp [i], eq-k) ;

fscanf (f 1, ” %d”, &ac, sp [i], c-fix) ;

fscanf (f1,” %if”, &ac. sp [i],cnc) ;

fscanf (f 1, ” %lf”, &ac, sp [i], z) ;

}}

void list-conj( struet conjugate conj)

//共役系の画面出力{

int i;

printf{”酸塩基共役系〈%s>です。¥n’,

for(i=0; i〈conj,nu皿_sp; i++ ) {

printf (”%2d番目の化学種の名前: i, conj,sp[i],na皿e,

printf{” この化学種は、¥n”};

printf(” %d (%s) conj,SP[i],n皿_皿,

printf (”

geteh O ;

/*画面クリア*/

/*10の指数乗

/* Te皿porary Value

*/

*/

*/

*/

conj,sys ) ;

〈%s> 化学式:〈%s>電荷:%d¥n” conj, sp [i], shiki, (int) conj, sp [i], z );

+ %d (H+) = (%s) K=%g¥n”,

conj, sp[0],shiki, conj,sp[i],n皿_h,

conj,sp[i],shiki, eonj.sp[i],eq-k );

の反応を行います。¥n¥n”};

[67]

}}

int xstrstr( ehar *a,ehar *b)

//化学式aの文字列bの後の数字の検出{

ehar*ap; /*位置のポインタ */

int leng; /*文字列の長さ */

int suf; /*文字コード16進 */ int i,j;

ap・strstr〔a, b); /*a中にあるbの位置するポインタ */

if{apニ=NULL){ /*なければ0を返す */ return (O) ;

1e且g=strle且(b};

for (i・O;i〈1eng;i+÷}{ap++;} /*あればbの終わりまでポインタ移動 */

if{*ap==’)’) {ap++;} /*括弧は飛ばす */

if{*ap・・0} {return(1};}/*文字列の終わり {O}ならば1を返す*/

if(isdigit{*ap}!・O}{ /*数字か否かの判断 */

suf = *ap 一 ’O’;

//*ap一’ O’は文字コードを対応する10進数に変換

return{suf}; /*係数を返すNa2なら2を返す */ }

return(1}; /*Naなら1を返す */}

void init-vari( void )

//変数初期化{

int i;

for (i=O;i〈20;i+十) {

con [i] = O, O; cone [i] = O, O; vol[i] ニ 0.0; vo1皿[i] = 0,0;

皿ol[i] = 0.◎; 皿01e[i] = 0,0;

皿ol_con[i] = 0,0;

}}

int 皿enu{ void )

//メニューサブルーチン{

int str; /*係数 */ iEt i, j, j-eon , is;

[68]

int shurui・0; /*イオンの種類 */

char flag; /*繰り返し用のフラグ */double co; /*濃度temporary */double chk_vo1・0,G; /*体積チェヅク用 */

int en; /*塩の種類 */char salt[50]; /*化学式入力 */char *ap; /*位置のポインタ */ehar *ap_。rg; /*文字列の最初のポインタ */

int leng; /*文字列の長さ */char letter・’x’; /*文字列消去用文字 . */

do(

shurui = O;

chk-vol= O,;

init_vari〔O ; /*変数初期化*/

printf (” ¥n” );

printf (” ¥n” );

printf{”緩衝能を計算しますか? Y/N ¥n’);

buffer = getchO;

if(( buffer == ’Y’)11( buffer == ’y’ ))(

printf(”pHと緩衝能を両方計算します。少し時間がかかります。¥n”); }

else{

printf(”pHだけ計算します。¥n”};

printf(”¥n塩は何種類含まれていますか? ”); scanf (” %d”, &en )’ ;

elrser O ;

for (i・O;i<en;i++1{ /*塩の種類だけ繰り返す*/

printf (” ¥n”);

printf (”¥xlb[32皿どんな塩が含まれていますか? ¥n”);

printf(”¥xlb[3加化学式で入力してください!¥xlb[o皿 ”);

scanf(”%30s”, salt);

ap_org・salt; /*塩の文字列の先頭のポインタの保存 */

printf(”¥n濃度は何Mですか?入力してください! ”}; scanf(”%lf”, &eon[i]);

printf(”¥n体積は何皿1ですか?入力してください! ”};’

scanf{”%1f”,&vo1皿[i]);

chk_vo1+・volm[i]; /*体積加算 */

printf(”¥nこの溶液には ”};

[69]

for (j=O;j〈max;j十十) {

j-eon = j+1;

if (strstr (salt, cnj-list [j-con],shikD !=NULL) {

eo = eon[i] ;

printf(” %s ”,cnj-list[j-eon],shiki);

str = xstrstr(salt,cnj-list[j.eon],shiki);

eone[j-con] = co*str;

vo1[j_con] = vol皿[i];

mole [j-eon] = conc [j-eon] * (vol [j-cen] /1000, O);

皿OI[j_COn] 十二 皿Ole[j_COn];

ap=strstr( salt,cnj-list[j-con],shiki );

//a中にあるbの位置するポインタ

ーf( ap,!= NULIi ){

leng = strlen( cnj-list[Lcon],shiki);

for (is=O;is〈leng;is++) (

strnset(ap, letter, 1);

ap十十;}

ap・ap_org; /*ポインタを最初の文字列の位置に戻す*/}

}}

printf (” が含まれています。¥n”);}

printf (” ¥n¥n”);

printf (”現在までの体積合計は%12,61f mlです。¥n”,chk」oI);

printf(”全体の体積は何皿1ですか?入力してください! ”};scanf (” %lf”, &V-a11) ;

printf (” ¥n¥n”);

while( ehk-vol 〉 V-all) {

printf (” ¥xlb [3tm”);

printf{”体積に矛盾があります。¥n”);

printf(”少なくとも %12,61f m1以上です。¥n”,eh’k_vo1);

printf(”¥xlb[0皿¥n”);

printf(”全体の体積は何mlですか? ¥n”};

printf(”再入力してください!¥n¥n”); scanf (” %lf”, &V-a11) ;

printf (” ¥n”);

printf{”この溶液の全体の体積は%12,61f皿1ですね。¥n¥n”,V_aI1);printf (” ¥n”);

shurui=O;

[70]

clrser O ;

printf(”¥n イオン種 モル濃度 モル数¥n¥n”);

for (i=O;i〈max;i++) {

」一con=i十1;

if(皿01[j_c。n]!・o,o}{ /*モル数が。でないなら存在する*/

shurui+÷; /*shuruiを1っ増やす */ 皿。Lcon[j_con]・皿01[」_con]/V_a11*1000,0; /*最終的モル濃度計算*/

printf(”%一一2es >> %10,81f M %10,81f mol¥n”

,cnj_1ist[」_con],na皿e, 皿ol_con[j_con], mo1[j_con]};

cnj[shurui] = enj-list[j-con];

//構造体cnj[j]への条件の呼込み ・cnj[shurui],tcnc = 皿01_con[j_con];

//濃度の引き渡し

//注意cnj[0]:water cnj[1],,,皿x,,,

Printf(”¥n¥nこの溶液の全体の体積は%12,61f mlです6¥n”,V_a11}; printf (” ¥n”);

printf(”この濃度で良いですか?¥n”};

printf(”誤りがある時には N を入力してください!¥n”);

flag = getehO;

whiIe{(flag=ニ’N’)II(flag==’n’}};/*Nまたはn以外でループを抜ける*/ printf (” ¥n”);

printf{”種類は %dです。¥n¥n”, shurui);

return{shttrui) ; /*イオンの種類を返す*/}

void file( void )

//ファイルのオープン、クローズ{

FILE *fl; /*ストリームのためのファイル構造対*/

int istatie;

/*ファイルのオープン*/ if((fl = fopen( FILE.NAME, ”r” )) == NULL)(

fprintf (stderr,”ファイル%sをオープンできません¥n”, FILE」AME};

printf(”ファイル%sをオープンできません¥n”, FILE_NAME);

exit (1) ;

for( istatic=O; ; istatic++ ){

set-ae( enj-list[ istatic 十 1 ], fl );

/*EOFかどうかをチェヅク*/

[71]

if (feof(fl)) {

texteolor(T-GREEN);

/*textc。1。rで色を変化できるのはcprintf */ cprintf (”全データを読み込みました。¥r¥n”};

皿axニistatic;

cprintf〔”データ数は%d個です。¥r¥n”,皿ax);

/*cprintfは¥nだけでは改行復帰しないので¥r¥nが必要*/

break; }}

getch O ;

felose (fl) ;

/*ファイルエンドなら読み込み終わり*/

/*ファイルのクローズ*/}

double calc-water( struct conjugate & water, double h )

//水のイオン解離に関する平衡状態を入力のプロトン濃度で計算する。

//戻り値は、この平衡系のexcess_chargeである。{

//トー一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一rl

// 1 [H20] = 1 beeause H20 is solvellt water, 1

// 1 From [H20] = eq-kl [H十] [OH一] 1

// 1 [OH一] = 1/( eq-kl * [H +]) 1 // [一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一1

water, sp [O],enc = 1/( h * h-dh-r * water, sp[1],eq-k ) / water, sp [O],dh-r;

water, excess-charge = water, sp [O],z * water, sp [O].cnc ;

return ( water, excess-eharge );}

double calc-eonj( struct conjugate & ae, double h )

//共役系に関する平衡状態を入力のプロトン濃度で計算する。

//戻り値は、この平衡系のexcess-ehargeである。{

int i;deuble q = O;

if ( ac, num-sp == 1 ) {

/*強電解質に関するexcess-chargeを持って帰る。 /*強電解質なので、何もしなくてよい。

*/

*/

ae, exeess-charge = ac, sp [O],z * ac, tcnc ;

else {

/*酸塩基共役系に関する平衡状態を入力のプロトン濃度で計算する。 戻り値は、この平衡系のexcess_ehargeである。*/

[72]

//トー一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一

//1

//1

//1

//1

//1

//1

//1

//1

この場合、 n皿一m・1なので、[ac] ニ [ac] [ac] = keq[O] * cnc[O] * h^n皿_h[0];

[hac] = [ac] * K [hac] = keq[1] * cnc[0] * h^nm_h[1ユ;

tcnc = cnc[O] * { keq[0] * h^n皿_h[0] + keq[1] * h^n皿_h[1] }

一〉 cne[O] = tcnc / { keq [O] * h“nm-h[O] + keq[1] * h“nm-h[1] }

一〉 [ae] = cnc[O], [hac] = keq[1] * ene[O]

//1一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一.一一一一一一一一一一一一一一一一一一一一一一一一一一

for (i=O; i〈ac. num-sp; i++) {

q十=(ac. sP[i].eq_k}*pow(h_dh_r*h, (ac. sp[i].n皿_h})

* ae, sp [O],dh-r / ac, sp [i],dh-r;

ac, sp [O],cnc = ac, tenc / q ;

//ac, sp[O],cncは水素イオンの最も少ないもの

ae, excess-charge = O, ;

[CO32一]

for〔i=0; i<ac, nu皿_sP’; i+十) {

ae, sp [i], ene = (ac, sp [i], eq-k) * (ac, sp [O]. ene) * (ac, sp [O],dh-r)

* pow( h_dh_r * h, ac,sp[i],n皿_h }/( ac, sP[i],dh_r);

ac, exeess-eharge 十= ae. sp[i],z

}}

return( ac, excess-charge);

* ac, sp [i],cnc

double cale-ion-str( double h, int shurui, int act-cor )

//イオン強度の計算

//イオン強度の計算には活量ではなく濃度を使う{

int i, j ,J;

double proton-z = 十1,; /* Charge of proton */

double ionst = O,;

if ( act-cor == O ) return ( ionst )

ionst = h * proton-z * protonMz; /*イオン強度の初期化 */

for(j=一1 ; j〈shurlli ;j++){

J=j+ 1;for (i=O;’ i〈cnj [J],num-sp ;i++) I

ionst += enj [J],sp[i],enc

* cRj [J] ,sp [i], z * cnj [J] , sp [i], z

//cnj[0]は水の共役化学種

[73]

ionst *= O,5;

return ( ionst );}

void set-aet-coef( int shurui, double ionst )

//デバイ・ヒュヅケルの限界法則に基づく活量係数の計算{

double log-g;

double Const-A = O,50gl;

double Const-B = O,3000;

dou1)工e proto皿_z = +工;

int i, j, J;

/*活量係数の対数値

/*Debye-Hucke1の限界法則

/*Debye-Huckelの定数B/* Charge of proton

*/

*/

*/

*/

// calculation of aetivity coefficient for proton : h-dh-r

log-g = 一 Const-A * ( proton-z * proton-z )

* (( sqrt“onst)/(L+sqrt(ionst))) 一 Const-B*ionst);

h-dh-r = pow (10,0 , log-g );

for(j=一1; j〈shurui; j++) {

/*ト1水,水酸化物イオン 」〉・0その他の共役系 */ //printf (”Calculation of aetivity coeffieient %d: 〈%s>¥n”,

// j, cnj [j], shiki ); j=j+1;

for (i・0;i<cnj[J],num_sp;i++}{ /*活量係数の計算 */

//デーピアスの式 Davies equation 1962 C,W,Davies’1。n Assoeiation’

log-g = 一Const-A * ( cnj [J],sp [i],z * enj [J],sp[i],z )

* (( sqrt(ionst)/(Le 十 sqrt(ionst))) 一 Const-B*ionst );

enj [」],sp[il,dh-r = pow(10,0 , log-g );

double ealc-ph-sub( int shurui ,

//pHの計算ルーチン{

int

ehar

i, j, j.con;

c-break;

int buf-mode , int frag)

double

double

double

total_charge; /*総電荷量 */ph, h, step」h; /*pHのきざみ1,0,1, O,01,0,001,.,*/

upper_charge・0,000000000001;//収束条件

ph=O, O;

for (i=O;;i++) (

step_ph = 1,0/pow(10,,doub工e{i});

/*pHを1,0,0, i,0,01, O,001,,ずつ増加させる*/

[74]

for (;;) (

ph 十= step-ph;

//printf (” pH・%10,81f¥n”,ph}; /*この時点でのpHの出力*/

h=pow (1 0, O, 一ph) ;

total-eharge = O,O;

//緩衝の強さ0,1Mの強酸・強塩基が (一滴)0,03ml混入した時のpH変化

if { buf_皿ode == 正 ) tota1_charge ; +0,000003*1000,/V_alI;

/*水酸化ナトリウム 0,000003阻01混入*/

if ( bllf.mode == 2 ) total-charge = 一〇, OOOOO3*1000, /V-all;

/*塩酸 0,GOO3皿01混入*/

total-charge 十= h + ealc-water(cnj [O], h );

for(j=O; j〈shurui; j+十) {

j-con = j+1;

total-charge 十= ealc-conj(cnj[j-eon], h );

if(fabs (t。ta1_eharge)〈upper_charge}break;/*必要*/

if( total-charge 〈 O,O )(

ph一・step_ph; 「 /*pHを一つだけ前{正の値}に戻る*/

break; /*ループを抜ける */

printf (”¥xlb[IAtotal-charge is %20, 161f¥n”, total-charge );

charge-x [frag] =total-charge;

if(fabs(t。taI_charge}〈upper_charge)break; /*収束条件*/

return (ph);}

void eale-ph( int shurui , int frag, int buf-mode, int aet-cor )

//pHの計算ルーチン メイン{

int i, j, J;

double h=O, ph=O;

double ion_str_old ・0,; /*イオン強度 前の値 */

d。uble ion_str ・0,; /*イオン強度 後の値 */ double upper_ion_str・0,0000000001;/*イオン強度の収束条件 */

printf(”¥nln ealc_ph:共役系の種類・%d¥n”;shurui};

[75]

h=O;

ioR-str = cale-ion-str( h, shurui, O );

printf (” ¥n”);

if{act_cor==0){ /*活量係数の補正をしない時*/ set-act-coef( shurui, ion-str );

ph = cale.ph-sub( shurui, bufmmode , frag);

else {

do{ /*活量係数の補正をする時*/

ion-str-eld = ion-str;

set-act.coef( shurui, ion.str );

ph = eale-ph-sllb( shurui, buf-mode ,frag);

h=pow (10, O, 一ph) ;

ion-str = calc-ion-str( h, shurui, act.eor );

} while( fabs( ioB-str 一一 ion-str-old ) 〉 upper-ion-str );

printf (” ¥nn);

if(buf』ode・・0}printf{”この溶液のpHを計算しました。¥n”); if (buf_皿ode ニニ 1 }

printf(”強塩基{0,000003皿01)が混入した場合のpHを計算しました。¥n”}; if (buf-mede == 2 )

printf(”強酸{0,000003皿。1)が混入した場合のpHを計算しました。¥n”};

if(act_cor・・0)printf (”活量係数の補正は行っていません。¥n”);

if(act_c。r=ニ1}printf(”活量係数の補正を行いました。(拡張デバイ・ヒュッケル法)¥n”);

ph = 一loglO (pow (10, O, 一ph) * h-d h-r); /* */

printf(”¥n¥xlb[32皿pHは%7,51fです。¥xlb[0皿¥n”, ph);

printf (” ¥n”);

if (aet-cor == 1 )(

printf{”水素イオンの活量係数は %7,51fです。¥n”

, h.dh-r) ;

for (j=一1;j〈sharui;j++) {

J=j+1;

for〔i=0;i〈cnj[J],nu皿_sp;i十十) {

printf (”[%24s]の活量係数・%7,51f¥n”

, cnj[Jj,sp[i],na皿e , cnj[J],sp[i],dh_r );

printf(”¥n溶液のイオン強度は %7,51fです。¥n”

,ion-str) ; }

[76]

ph_x[frag]・ph; /*画面出力のためのデータの保存 */

geteh O ;

printf (” ¥n¥n”);

void prinLph( void )

//pHの計算結果の画面出力{

elrserO; printf (” ¥n”) ;

printf(”¥xlb[36m結論:¥n”};

printf (” ¥n”);

printf{”元の溶液のpHの値(補正なし)%6,31f¥n¥n”,ph_x[1]);

printf (”この時の総電荷量 %18,161f¥n¥n”,charge_x[1]);

printf (”元の溶液のpHの値(補正あり)%6,31f¥n¥n”,ph-x[4]};

printf{”この時の総電荷量 %18,161f¥n”,charge_x[4]);

printf (” ¥xlb [Om¥n”);

if(( buffer == ’Y’)lI( buffer == ’y’ ))(

printf(”緩衝能:¥xlb[33m¥n¥n”);

printf{”塩基が混入した時のpHの値 %6,31f変動値 %+6,31f¥n¥n” , ph-x [2], ph-x [2] 一ph-x [1] );

printf{”酸が混入した時のpHの値 %6,31f変動値 %+6,31f¥n¥n” , ph-x [3], ph-x [3] 一ph-x [1] );

printf (”活量係数の補正がある場合¥n¥fi” );

printf{”塩基が混入した時のpHの値 %6, 31f変動値 %+6,31f¥n¥n”

,ph_x[5],ph_x[5]一ph_x[4ユ};

Printf(”酸が混入した時のpHの値 %6,31f変動値 %+6,31f¥n” , ph-x [6], ph-x [6] 一ph-x [4]);

printf{”¥xlb[0皿”};

void皿ain{void) /*メイン関数*/{

int i, j, k;

int shurui・0; /*イオンの種類 */ int te皿P; /* te皿porary */

ehar e; int frag; /*緩衝溶:液用のフラグ */

[77]

int buf』ode; /*0: 緩衝能計算なし */ /*1: 緩衝能計算 NaOH */

/*2: 緩衝能計算 HCI */

int act_c。r; /*0: 活量補正なし */

/*1: 活量補正 */

char ende; /*終了のフラグ */

fileO; /*ファイルのオープン、クローズ*/ set-water (enj [O]); /* cnj [O] : water */

do(

shurui・menll O ; /**メニュー画面の呼び出し***/

/*活量係数の補正なし pHの計算、判定 */ frag = 1; buf_皿ode = 0; aet_cor = 0;

ealc-ph( shurui, frag, buf-mode, act-cor );

/*活量係数補正あり pHの計算*/ frag = 4; buf_皿ode ニ 0; act_cor = 1;

cale_Ph( shurui, frag, buf_皿ode, act_cor };

if(( buffer == ’Y’)11( buffer == ’y’ ))(

/*活量係数の補正なし 緩衝能計算用処理NaOH */

frag = 2; buf-mode = 1; act-cor = O;

calc-ph( shurui, frag, buf-mode, act-cor );

/*活量係数の補正なし 緩衝能計算用処理HC1 */ frag = 3; buf-mode = 2; act-cor = O;

cale-ph( shurui, frag, buf-mode, act-cor );

/*活量係数補正あり 緩衝二二算用処理NaOH */

frag = 5; buf-mode = 1; act-eor = 1;

eale_Ph( shurui, frag, buf_皿ode, act_cor };

/*活量係数補正あり 緩衝能計算用処理HCI */

frag = 6; buf-mode = 2; act-eor = 1;

calc_ph{ shurui, frag, buf_皿ode, act_cor };

print_phO; /*pHの画面出力 */

printf{”¥n終了しますか? Y/N¥n”);

ende = getehO;

}while(( ende != ’Y’)&&( ende != ’y’ ));

//Yまたはyでなければループを抜けない}

[78]

(2)データベース作成用プログラム 〔ファイルサイズコメント文を含めて約7kB)

/***************************************************************************/

/* struxdat, cpp *//* 「複数の弱酸・弱塩基を含な化学平衡系の理論的解析」 */

/* 「データベース作成用サブプログラム 」 */

/* 教科領域教育自然系コース(理科) 佐藤哲也 */

/* 1993, 11, 3 一 1993, IL IO *//***************************************************************************/

/*プリプロセッサ**********************************************************/

#include 〈stdio, h>

#include 〈string,h>

#inelude 〈graphies, h>

#include 〈proeess, h>

#include 〈皿ath,h>

#include 〈eonio, h>

#include 〈stdlib,h>

#include 〈dos, h>

#inelude 〈dir, h>

#include 〈alloc, h>

#include 〈etype, h>

#define FILE_NAME”A:¥¥data2, dat” /*データファイルの名前 */

/*構造体の設定**************************************************************/

struet speeies {

struet speeies *next;

char name [50] ;

ehar shiki [50] ;

int n皿_皿;

int n皿_h;

double eq-k;

double dh-r;

int e-fix;

double cne;

double z;};

struct eonjugate {

struet conjugate *next;

char sys [50] ;

ehar shiki[50];

/*次の構造体

/*名前

/*化学式

/*複回数

/*プロトン数

/*平衡定数

/*活量係数/* e-fix == 1

/* c-fix == O

/*濃度

/*電荷

speciesのポインタacetic aeid

CH3COOH1

1

指数O, 98

活量1:沈澱、溶媒等濃度可変、三三溶質O, 2

0

/*次の構造体conjugateのポインタ/*共役系に関するコメント

/*化学式 CH3COOH

*/

*/

*/

*/

*/

*/

*/

*/

*/

*/

*/

*/

*/

*/

[79]

ehar

int

double

doubleillt

double

double

struet

na皿e[50];

shiki-len;

tcnc;

V1皿;

num-sp;

excess-charge;

proton;

speeies sp[5];

/*イオン種の名前

/*判別文字式の長さ

/*総濃度 メニューから入力/*体積

/*共役化学種の数 酢酸なら2

/*共役化学種の電荷の和

/*水素イオン濃度

/*共役化学種に関する情報

/*ただし、sp団は、塩基モノマー

*/

*/

*/

*/

*/

*/

*/

*/

*/

};

struet eonjugate cnj-list;

struct conjugate dat;

/*共役系のデータベース

/*データベース作成用

*/

*/

double temp-pk[10]; /*テンポラリーバリュー*/

v。id set_ac(FILE*f1) /*FILE*f1が必要*/

//ファイルにデータを書き込むルーチン{.

i且t i;

double x,ph;

elrscr O ;

dat, sp[0ユ,eq_k=O,00;

/*画面クリア*/

for{i=1;i〈dat,nu皿_sp;i++) {

dat, sp[i],eq_k+=te皿P_pk[dat, nu皿_sp-i];

printf{”ファイル書き込み中¥n”};

fplrintf(fl,”%d ”,dat,nu皿_sp);

fprintf (fl,” %一15s ”, dat, sys) ;

fprintf (fl,” %一15s ”, dat, shiki) ;

fprintf (fl,” %一20s ”, dat, name) ;

dat, shiki-len=strlen (dat, shiki) ;

fprintf (fl,”%一3d ”,dat, shiki-len);

fprintf (fl,”¥n”);

for〔i=0;i〈dat,nu皿_sP;i÷+}{

fprintf(f1,” %。20s ”,dat,sp[i],na皿e};

fprintf (fl, ”%一15s ”,dat, sp [i], shiki) ;

fprintf(f1,”%一3d ”,dat,sp[i],n皿_皿 };

fprintf (fl,”%一一3d ”, dat, sp [i],nm-h );

fprintf (fl,”%7,51f ”,daL sp [i],eq-k );

fprintf (fl, ”%一2d ”, dat, sp [i],c-fix) ;

[80]

fprintf (fl,”%7, 51f ”,dat, sp [i],cnc); /* Temporary Value */

fprintf (fl,”%+7, 51f ”,dat, sp [i], z) ;

fprintf(fl,”¥n”);

fprintf (fl,”¥R”);

void file( void )

//ファイルのオープン、クローズ{

FILE *f1; /*ストリームのためのファイル構造対*/

int istatie;

/*ファイルのオープン*/ if((fl = fopen( FILE-NAME, ”a” )) == NULL) (

fprintf(stderr, ”ファイル%sをオープンできません¥n”, FILE_NAME);

printf{”ファイル%sをオープンできません¥n”, FILE_NAME);

exit (1) ;

set-ae( fl );

printf( ”ファイルデータとして<%s>を書き込みました。¥n¥n’, dat.na皿e);

fclose{fl); /*ファイルのクローズ*/}

void 皿ain( void ){

int i; double te皿p1,temp2; /*テンポラリーバリュー*/

char chek; /*確認用フラグ */ char ende; /*終了用フラグ */ char *皿s9; /*共役化学種用メッセージのポインタ*/

clrscr O ;

do{

elrscr O ;

printf (”¥xlb[36皿データベースの作成を開始します。例として酢酸系をあげていま

す。¥n¥n¥xlb[Om”);

printf{”共役化学種の数はいくらですか? (酢酸と酢酸イオンで 2)。¥n¥n”}; scanf (” %d”, &dat, num-sp);

printf{”共役系を代表する化学式入力して下さい! (CH3COOH)¥n¥n”}; seanf (” %s”,dat, sys) ;

printf{”共役系を判別する化学式を入力して下さい!この文字列で判別します(CH3COO ) ¥n¥n”);

[81]

seanf (” %s”, dat, shiki) ;

printf(”共役系の名称を入力して下さい! (酢酸系)¥n¥n”}; scanf(”%s”,dat, na皿e};

printf (”正しいですか? 正しくなければNを入力して下さい!¥n”);

chek = getchO;

if(( ehek == ’N’)11( chek == ’n’ )){ eontinue; }

for(i=0;i〈dat, nu皿_sp;i++) {

clrser O ;

printf(”¥且¥xlb[36皿<%d>番目の共役系の名称を入力して下さい! (酢

酸イオン)¥n¥n¥xlb[0皿”,i+1};

scanf(”%s”,dat, sp[i],na皿e);

printf(”共役系の化学式を入力し下さい! (CH3COO一)¥n¥n”,*皿s9); seanf (” %s” ,dat, sp [i], shiki) ;

printf{”複核数を入力して下さい!通常は1です。 (1)¥n¥n”); scanf(”%d”,&dat, sp[i].RM_皿 };

printf(”その共役化学種の電離できるプロトン数を入力して下さい! (o)¥n¥ li”) ;

scanf(”%d”,&dat。 sp[i},n皿_h );

printf(”溶媒、強電解質なら1を、そうでなければ0を入力して下さい! (O ) ¥n¥n”);

scanf (” %d”,&dat, sp [i], c-fix) ;

dat, sp[i],cnc = 1,0; /* Te皿porary Value

printf (”その共役化学種の電荷を入力して下さい! scanf{”%1f”,&te皿p2};

dat, sp[i],z = temp2;

pri且tf{’正しいですか?

ehek = getehO;

if(( chek == ’N’)H( ehek == ’n’ ))( i一; eontinue; }

for (;;) (

for (i=1;i〈dat, num-sp;i十+) {

elrscr O ;

printf{”第く%d>平衡定数を入力して下さい! scanf(”%lf”,&te皿P1 );

te皿P_Pk[i]=te皿P1;

printf〔”正しいですか?

*/

( 一LO ) ¥n¥n”);

正しくなければNを入力して下さい!¥n”};

( 4, 74 ) ¥n¥n”,i);

正しければYを入力して下さい!¥n”);

[82]

ehek = getehO;

if(( chek == ’Y’)11( chek == ’y’ )){ break; }

fileO;

printf{”終了しますか? 終了するならYを入力して下さい。妾n”};

ende = getchO;

}while(( ende != ’Y’)&&( ende != ’y’ ));

//Yまたはyでなければループを抜けない

[83]

本研究の遂行にあたり、終始温かい御指導と御鞭捷を頂きました諸先生方に深

く感謝致します。

特に本学・尾関徹先生には、溶液化学のみならず計算機化学の分野において

も、微に入り細にわたって御助言、ご指導を賜り心から御礼申し上げます。

また本学・木原寛先生、小和田善之先生には化学全般に関する懇切丁寧な御

助言を賜り心から御礼申し上げます。

そして大学院在学中の2年間、心の支えになって下さった多くの人々に、深く

感謝串し上げます。