文章編號:1005-6629(2010)07-0070-03 中圖分類號:G633.67 文獻標識碼:B
當我們學習化學平衡的相關知識時,化學平衡常數(shù)的計算列出的方程,有時可能是一個難以求解的高次方程,只有通過近似估計,反復使用計算器試根,才能得出近似解。由此,我想到可以編寫一個自動執(zhí)行這一過程的電腦程序,以幫助我們完成計算。程序使用VB編寫,操作界面友好易懂,算法采用二分法、窮舉、循環(huán)等簡單的語句完成。完成了在定容這一題目常見條件下對于一般平衡計算題型的求解,也增強了同學們使用VB語言解決問題的能力。
1引言
有關化學平衡的計算題相信很多高中的學生都經(jīng)常遇到,相比于整個化學平衡對邏輯思維的高要求,這種給定初始情況和平衡常數(shù),要求計算最終平衡情況的題目,在思路上是沒有難度的,但卻常常因高次方程難以求解的問題而無法得出結果。下面,舉這樣一個例子。
已知氣相反應,2SO2+O22SO3, 在一定溫度時體積恒定為1 L的密閉容器中,充入0.4 mol的二氧化硫和1.0 mol氧氣。已知平衡常數(shù)為19,求反應平衡時二氧化硫轉化率。
解:初始濃度 二氧化硫 0.4 mol·L-1氧氣1.0 mol·L-1
設二氧化硫反應掉x mol·L-1
則氧氣反應掉 x/2 mol·L-1
由平衡常數(shù)定義計算式可列方程:
x2/[(0.4-x)2 (1-x/2)]=19
這是一個三次方程,顯然x取值范圍為0~0.4,當x等于0.3時仍然偏小,使用計算器計算x在 0.3~0.4之間左式的值,步長0.01,結果如下:
可見,當x=0.32時,左式值為19.047約等于右式,則x=0.32為方程近似解。
所以, 二氧化硫轉化率為0.32÷0.4×100%=80%
由對此題的求解過程,我們發(fā)現(xiàn),其實類似的高次方程是有特點的:
(1)對于化學平衡中我們所涉及的反應物消耗量x mol。它是有范圍的,其范圍為零到初始濃度之間。所以我們所求的高次方程解也在這個范圍間。
(2)此類化學計算中,一般用有一定近似程度的小數(shù)表示,所以,只要精確度達到要求,方程近似解可以作為最終的答案。
(3)使用計算器的時候,由于反復運算同一個方程,可以用計算機中的循環(huán)語句完成這一循環(huán)計算過程。
由此,我編寫了“定容化學平衡計算程序”我們可以借助計算機解決這個問題,既增強了同學們的學習興趣,又可促進同學們對VB語言的掌握和應用。
2 程序算法詳解
在前文中,我們得到方程x2/[(0.4-x)2(1-x/2)]=19,將其展開,設定函數(shù)F(x)=x2 -19*[(0.4-x)2 (1-x/2)], 原方程的解,轉化為求F(x)的零點。其實, 對于一個化學方程式: aA+bB+cC=dD+eE+fF A、B、C、D、E、F分別為參與反應的氣體物質(zhì),a、b、c、d、e、f為對應的系數(shù),即化學方程式計量數(shù)。假設平衡常數(shù)為K。初始濃度分別為 ca , cb , cc , cd , ce , cf 。同樣我們可以得到函數(shù):fx=((cd+x/a*d)d) * ((ce+x/a *e)e)*((cf+x/a*f)f)-k*((ca-x)a)*((cb-x/a*b)b)*((cc-x/a*c)c)這是達到平衡時, 假設A轉化x mol·L-1, 由方程式對應得出其它物質(zhì)濃度變化所列計算式。
而當給定初始條件平衡逆移時,假設D轉化x mo·L-1,則有:
fx=((cd-x)d)*((ce-x/d*e)e)*((cf-x/d*f)f)-k*((ca+x/d *a)a)*((cb+x/d*b)b)*((cc+x/d*c)c)
下面,我們對第一種情況進行具體講解,第二種情況算法是完全相同的。
x有一定范圍,所以,起始x從其最大值,即x=ca開始。
2.1二分法縮小范圍
其語句如下:
x=ca
Do
fx=((cd+x/a*d)d)*((ce+x/a*e)e)*((cf+x/a*f)f)-k*((ca-x)a)*((cb-x/a*b)b)*((cc-x/a*c)c)
x=(x/2)
Loop Until (f(x)) < 0
對于x,執(zhí)行循環(huán),每一次都將上一個x的值除以2,因為當x=ca時,fx顯然是大于零的,而不斷的等分x,當(f(x))<0時終止循環(huán),此時,前一個x所對應的函數(shù)值仍然大于零。所以,下面的循環(huán)語句,將在縮小后的范圍內(nèi)求解x,由于2分法的高效性,大大減少了運算次數(shù),相應縮短了運算時間。
2.2窮舉求出x近似值
當?shù)谝徊娇s小過范圍后,找到一個x
其后語句如下
x1=x*4
x2=x*4-0.00001
Do
fx1=((cd+x1/a*d)d)*((ce+x1/a*e)e)*((cf+x1/a*f)f)-k *((ca-x1)a)*((cb-x1/a*b)b)*((cc-x1/a*c)c)
fx2=((cd+x2/a*d)d)*((ce+x2/a*e)e)*((cf+x2/a*f)f)-k *((ca-x2)a)*((cb-x2/a*b)b)*((cc-x2/a*c)c)
x3=(x1+x2)/2
x1=x1-0.00001
x2=x2-0.00001
Loop Until ((fx1) * (fx2)) <= 0
x1=x*4,是因為前面的語句循環(huán)時,找到x后多除了一次2,所以乘2,且需要的是之前x的值,所以再乘2。同樣,x2=x*4-0.00001。設這兩個x以及兩個fx的意義如圖1:
這兩個x從初始開始在循環(huán)語句中,間隔是始終不變的,分別對應各自函數(shù)值,當我們從初始值開始遞減,兩條豎線不斷左移,fx1*fx2的值始終是大于零的,而當移動到某一位置,兩條豎線分居零點左右或者有可能剛好其中一條位居零點,此時f(x1)*f(x2)<=0,循環(huán)結束,因為x1,x2間隔始終為0.00001很小,可取x1,x2平均值x3為最終結果。
而當平衡逆移,即前文所說的第二種情況,其代碼如下:
Do
fx=((cd-x)d)*((ce-x/d*e)e)*((cf-x/d*f)f)-k*((ca+x/d*a)a)*((cb+x/d*b)b)*((cc+x/d*c)c)
x=(Int((x/2)*10000000))/10000000
Loop Until (f(x))>0
x1=x*4
x2=x*4-0.00001
Do
fx1=((cd-x1)d)*((ce-x1/d*e)e)*((cf-x1/d*f)f)-k*((ca+x1/d*a)a)*((cb+x1/d*b)b)*((cc+x1/d*c)c)
fx2=((cd-x2)d)*((ce-x2/d*e)e)*((cf-x2/d*f)f)-k*((ca+x2/d*a)a)*((cb+x2/d*b)b)*((cc+x2/d*c)c)
x3=(x1+x2)/2
x1=x1-0.00001
x2=x2-0.00001
Loop Until (f(x1)* (f(x2)) <= 0
唯一的不同就是,二分法時,判斷語句為fx>0,這是因為函數(shù)在這附近是單減的,初始X值時,fx為負。而第二步完全相同,因為兩個負數(shù)相乘的積也是正數(shù),所以判斷語句仍為fx1*fx2<0。
而對于初始反應方向的判斷,由if……then,語句完成。判斷F(X)=(cd^d)*(ce^e)*(cf^f)-k*(ca^a)*(cb^b) *(cc^c)的符號,等于零表示初始就平衡,直接輸出結果,小于零,表示反應正向進行(注意!是正向!),即第一種情況,若大于零,則反應逆向進行,即第二種情況。
在得出x結果后,六種物質(zhì)平衡時的最終濃度便都可以得解,相應的轉化率也可以求出。
3 整體程序的編寫設計及注意事項
整體程序的完成包括以下幾部分
3.1界面的設計
為了讓人更直觀的使用本程序,我們使用VB的可視化窗口形式。整個界面上半部分為用戶輸入部分,下半部分為結果顯示部分,取消和刷新分別還原上下部分。點擊確定則由輸入的數(shù)據(jù)計算出結果并在下方顯示。
3.2對于數(shù)據(jù)的讀入和輸出
在VB里,使用text.text=的語句從用戶輸入的信息中讀取數(shù)據(jù)。要注意的是,當反應物或生成物沒有達到三個時,會出現(xiàn)系數(shù)為零,此時會出現(xiàn)0^0,因此,在整個計算前,對系數(shù)判斷,若其系數(shù)等于零,濃度賦值為1,1^0=1,做乘法對計算結果無影響。當然,在輸出的時候,要將濃度重新賦為0。對于a和d,因為我默認按順序輸入,作為化學方程第一種物質(zhì)即運算中的除數(shù),都是不能等于零的。
3.3程序的不足
(1)因為需要更加直觀,化學計量數(shù)的輸入格式上已經(jīng)是方程式的形式,所以只能用于計算反應物和生成物是三個或三個以內(nèi)的化學反應方程式。而且因為以濃度計算的時候固體和純液體是沒有意義的,所以,對于反應物或生成物全是固液的方程,在程序里a,d等于零,已經(jīng)沒有意義無法計算,這是本程序最大的缺陷。但在高中所遇到的平衡題目內(nèi),化學方程達到這兩個條件的相當少見,而對于部分反應物或生成物含有固液,只要量足夠且不影響反應,將剩余部分方程式輸入仍可以計算。
(2)雖然已經(jīng)使用二分法縮小范圍,但對于初始濃度超過較大兩位數(shù)的情況程序出現(xiàn)明顯停頓,基本在30秒以上。
4總結
“定容化學平衡計算程度”只是一個小小的程序設計,它有著許多的不足,但對于高中學生日常處理平衡計算問題,老師驗證答案的正確都有一定的幫助,作為一種教學課件可以為初學者演示一些許小的變化引起平衡移動的結果,激發(fā)學生的興趣。更重要的是,這也是一種解決問題的方式,面對一個無法得出的答案,可以借助計算機的幫助,以人的邏輯思考能力與計算機強大的計算能力相結合,充分利用學過的知識,解決棘手的問題,這種思想在平常的學習中會幫助我們獲得更多的啟迪和靈感。