不同條件下溶液中的物質濃度?化學反應平衡?MATLAB求解非線性方程組
一種常見的化學反應平衡關係是離子在溶液中的水解平衡,由於存在平衡常數,所以在給定條件下(溫度,pH值等)能夠求出溶液中鹽離子和弱酸根離子的濃度。但是,化學平衡方程本身是非線性的,而且在一般情況下,溶液中存在眾多的平衡體系。使得該問題的求解難度很高。例如:
已知碳酸($H_{2}CO_{3}$)溶液中存在如下水解平衡關係,計算$H^{+}$濃度為$10^{-5}$mol/L,${CO_{3}}^{2-}$濃度為$10^{-9}$mol/L時,溶液中$H_{2}CO_{3}$的濃度。
$$H^{+}+OH^{-}\rightleftharpoons H_{2}O \qquad K_{w}=10^{-14}$$
$${HCO_{3}}^{-}+H^{+}\rightleftharpoons H_{2}CO_{3} \qquad K_{a1}=4.2\times 10^{-7}$$
$${CO_{3}}^{2-}+H^{+}\rightleftharpoons {HCO_{3}}^{-} \qquad K_{a2}=5.61\times 10^{-11}$$
分析:
該問題共涉及6種物質($H^{+}$,$OH^{-}$,${CO_{3}}^{2-}$,${HCO_{3}}^{-}$,$H_{2}CO_{3}$,$ H_{2}O$),其中五種物質存在濃度($H^{+}$,$OH^{-}$,${CO_{3}}^{2-}$,${HCO_{3}}^{-}$,$H_{2}CO_{3}$),除去已知濃度的$H^{+}$和${CO_{3}}^{2-}$之外,還有3種物質的濃度需要求解($OH^{-}$,${HCO_{3}}^{-}$,$H_{2}CO_{3}$)。顯然,該溶液體系共有三種化學平衡關係,可列出三個化學平衡方程,理論上可以求解出未知的三種物質的濃度。化學平衡方程如下:
$$K_{w}=\left [ H^{+} \right ]\cdot \left [ OH^{-} \right ]$$
$$K_{a1}=\frac{\left [ H^{+} \right ]\cdot \left [ {HCO_{3}}^{-} \right ]}{\left [ H_{2}CO_{3} \right ]}$$
$$K_{a2}=\frac{\left [ H^{+} \right ]\cdot \left [ {CO_{3}}^{2-} \right ]}{\left [ {HCO_{3}}^{-} \right ]}$$
將已知量帶入上述方程後,可以使用MATLAB中的solve方法求解該非線性方程組,程式碼及說明如下:
clear,clc %% matlab 求解非線性方程組 以化學反應平衡為例 num=20; CO3=10^(-9); % 已知的CO3^2-濃度 H=10^(-5); % 已知的H+濃度 kw=10^(-14); ka1=4.2*10^(-7); ka2=5.61*10^(-11); % H 和 CO3為已知量,在方程組中視為常數 syms OH HCO3 H2CO3 exp1 % 需要求解的其他3種物質(OH,HCO3,H2CO3)和需要求解的方程組(exp1)設定為符號變數 exp1=[kw==H*OH,ka1==(H*HCO3)/H2CO3,ka2==(H*CO3)/HCO3]; % 需要求解的方程組 % 非線性方程組求解方法 Y = solve(eqns,vars),eqns為需要求解的方程組,vars需要求解的變數 % 注意:該問題中共存在3個方程和3個未知數,若eqns中列舉了全部三個方程,則vars中必須全部列舉所有未知變數才能求解 % 例如,在該問題中,保持exp1不變,vars=[OH HCO3],則會導致無解。 % solution為結構體變數,需要求解的變數儲存在其中,預設儲存為解析解(分數表示)。 % 分別為:solution.OH,solution.HCO3,solution.H2CO3 solution = solve(exp1, [OH HCO3 H2CO3]); % vpa方法可以將解析解(分數表示)轉化為數值解(小數表示) % double方法可以將符號變數轉化為數值變數 H2CO3_result=double(vpa(solution.H2CO3));
該程式碼的計算結果:$H_{2}CO_{3}$的濃度為0.0042 mol/L
特別的,如果想要研究$H_{2}CO_{3}$與$H^{+}$和${CO_{3}}^{2-}$濃度的關係,也可以用類似的方法實現。
例如,可以計算出$H^{+}$濃度範圍在[$10^{-5}$ $2\times 10^{-5}$]和${CO_{3}}^{2-}$濃度範圍在[$10^{-9}$ $2\times 10^{-9}$]時對應的$H_{2}CO_{3}$濃度,以$H^{+}$濃度為x軸,${CO_{3}}^{2-}$濃度為y軸,$H_{2}CO_{3}$濃度為z軸繪製三維影象進行展示。程式碼如下:
clear,clc %% matlab 求解非線性方程組 以化學平衡繪圖為例 num=20; % 每個維度的取樣數量 H=linspace(1*10^(-5),2*10^(-5),num); % CO3^2-濃度範圍 CO3=linspace(1*10^(-9),2*10^(-9),num); % H+濃度範圍 H2CO3=zeros(num,num); for indexCO3=1:num for indexH=1:num [H2CO3(indexCO3,indexH)]=ChemicalEquilibrium(CO3(indexCO3),H(indexH)); end end [X,Y] = meshgrid(CO3,H); %將其x,y軸網格化 Fig = mesh(X,Y,H2CO3); %繪製三維曲面圖 xlabel('H^+濃度 mol/L','fontsize',10,'fontname','宋體'); ylabel('{CO_3}^{2-}濃度 mol/L','fontsize',10,'fontname','宋體'); zlabel('H_2CO_3濃度 mol/L','fontsize',10,'fontname','宋體'); function [H2CO3_result]=ChemicalEquilibrium(CO3,H) kw=10^(-14); ka1=4.2*10^(-7); ka2=5.61*10^(-11); syms OH H2CO3 HCO3 exp1 exp1=[kw==H*OH,ka2==(H*CO3)/HCO3,ka1==(H*HCO3)/H2CO3,]; solution = solve(exp1, [OH HCO3 H2CO3]); H2CO3_result=double(vpa(solution.H2CO3)); end
執行結果如圖所示:
參考資料:
Equations and systems solver - MATLAB solve - MathWorks 中國
特別感謝:
楊翠婷