Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "一元弱酸pH值的计算机数值求解 化学系1班 殷乃宁."— Presentation transcript:

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

2 一、问题的提出: 一元弱酸溶液质子条件式: [H+] = [A-] + [OH-] 利用平衡常数式将各项变为[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 BACK 如果同号,说明所求的根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(xk)+f’(xk)(xk+1- xk) = 0, xk+1是一个 近似根。

8 下面将以某一元弱酸(设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; }

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 谢谢


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

Similar presentations


Ads by Google