1 / 16

一元弱酸 pH 值的计算机数值求解

一元弱酸 pH 值的计算机数值求解. 化学系 1 班 殷乃宁. 一、问题的提出:. 一元弱酸溶液质子条件式: [H + ] = [A - ] + [OH - ] 利用平衡常数式将各项变为 [H + ] 的函数,即 这就是一元弱酸 [H + ] 的精确表达式 . 代入 [HA] 的型体公式: 得到一元三次方程 [H + ] 3 +K a [H + ] 2 - (K a c + Kw)[H + ]-K a K w = 0 二元弱酸,精确式为四次方程。 三元弱酸,精确式为五次方程。. 二、问题的分析:.

pules
Download Presentation

一元弱酸 pH 值的计算机数值求解

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 一元弱酸pH值的计算机数值求解 化学系1班 殷乃宁

  2. 一、问题的提出: • 一元弱酸溶液质子条件式: [H+] = [A-] + [OH-] 利用平衡常数式将各项变为[H+]的函数,即 这就是一元弱酸[H+]的精确表达式

  3. 代入[HA]的型体公式: 得到一元三次方程 [H+]3+Ka[H+]2- (Kac + Kw)[H+]-Ka Kw = 0 二元弱酸,精确式为四次方程。 三元弱酸,精确式为五次方程。

  4. 二、问题的分析: 利用计算机编程来解决这个问题,主要有以下几种方法:二分法,迭代法,牛顿法。 二分法: 牛顿法:

  5. 二分法: 函数f(x)在某个区间(a,b)内连续且仅有一个根x* 取中点x0 = 1/2(a+b) 如果f(x0)=0,则1/2(a+b)即为根,否则将区间分为两半,进行扫描,检查f(x0)与f(a)是否同号。

  6. 如果同号,说明所求的根x*在x0右侧区间(x0,b),此时令a1 = x0, b1 = b。 如果异号,则x*在x0左侧区间(a,x0),则取 a1 = a, b1 = x0,得到一个新的根区间(a1,b1)。 有根区间(ak,bk)的长度小于给定的精度,则xk = 1/2(ak+bk)即为满足精度要求的方程的根。 BACK

  7. 牛顿法: 已知方程f(x) = 0的一个近似根x0 泰勒展开f(x)=f(x0)+f’(x0)(x- x0)+f’’(x0)(xx0)2+… 舍去高级项,得f(x0)+f’(x0)(x- x0) = 0 若f’(x0) 0,取x作为原方程的新近似根x1。 迭代公式为:f(xk)+f’(xk)(xk+1- xk) = 0, xk+1是一个 近似根。

  8. 下面将以某一元弱酸(设pKa=5,c=0.10mol/L,精度:0.01.)求pH值为例,使用C++语言说明两种方法的应用。下面将以某一元弱酸(设pKa=5,c=0.10mol/L,精度:0.01.)求pH值为例,使用C++语言说明两种方法的应用。

  9. 二分法 #include <iostream.h> #include <iomanip.h> #include <math.h> double Fx(double,double,double); const double Kw = 1.0E-14; int main() { double k,c,r,x0,A,B,PH; double pka; cout<<"pKa="; cin>>pka;

  10. cout<<"Ka="<<endl; cin>>k; cout<<"c="; cin>>c; cout<<"精度:"; cin>>r; k=pow(10,-pka); A=1.0E-14.0; B=1; //确定扫描范围 x0 = 0.5(A+B); while (abs(B-A)>r) { if (f(x0)*f(A))>0 A = x0; else B=x0; x0 = 0.5(A+B); }

  11. PH=-log10(B); cout<<"该一元酸的pH=" <<setprecision(2) <<setiosflags(ios::fixed|ios::showpoint)<<P<<endl; return 0; } //function definition double Fx(double s,double K,double C) { return(((s+K)*s)*s)-(K*C+Kw)*s-K*Kw); }

  12. 牛顿法 #include <iostream.h> #include <iomanip.h> #include <math.h> float Fx(float,float,float); float DFx(float,float,float); const double Kw = 1.0E-14; int main() { float k,c,x0,x1,r,PH; double pka;

  13. cout<<"pKa="; cin>>pka; cout<<"c="; cin>>c; cout<<"精度:"; cin>>r; k=pow(10,-pka); x0 = sqrt(k*c); x1 = x0-Fx(x0,k,c)/DFx(x0,k,c); while (fabs((x1-x0)/x1)>r) { x0=x1; x1=x0-Fx(x0,k,c)/DFx(x0,k,c); } PH=-log10(x1); cout<<"该一元酸的pH=" <<setprecision(2) <<setiosflags(ios::fixed|ios::showpoint)<<PH<<endl; return 0; }

  14. //function definition float Fx(float s,float K,float C) { return(((s+K)*s)*s-(K*C+Kw)*s-K*Kw); } float DFx(float t,float K,float C) { return(3*t+2*K)*t-(K*C+Kw); }

  15. 三、讨论: 利用计算机程序可以精确求算出多元酸的pH值 方法简单,快捷,准确。 为学习和研究相关问题提供方便。

  16. 谢谢

More Related