以求解浓度为c mol/L的任意一元弱酸溶液pH值为例,该类溶液都可以根据弱酸的解离方程、水溶液质子平衡、水的离解常数等化学平衡知识,经过推导,将氢离子浓度x表达为如下方程:
x3+Kax2-(Kac+Kw)x-KaKw=0
其中Ka是一元弱酸的电离常数,对给定的酸是固定值,Kw是水的电离常数,值为10-14。
可见,基于化学理论的推导,化学问题可转换为一个数学问题。这是一个关于x的非线性方程,在两维空间中可以表达为一条曲线,而曲线与横轴的交点就是方程的根。
此类问题的求解,可参见图3.2.1。由于f(x)连续,如果找到两个点a,b,使得f(a)×f(b)<0,则可以断定,函数在[a,b]中必定存在一个根。在此基础上,如果找到一种办法,不断缩小这个区间,并且始终保持f(a)×f(b)<0,当a和b无限接近时,则认为找到了解。
快速缩小区间的一种办法是取a、b中点m,判别f(m)与f(a)是否同号,若同号,则令a=m,否则令b=m,从而将区间缩小为原来的一半。将该过程一直进行下去即可求解,该方法被称为二分法。
图3.2.1 非线性方程的求解图示
程序:二分求醋酸浓度
【例3.2.3】 已知醋酸的Ka为10-4.56,0.01 mol/L的醋酸溶液的氢离子方程为:
x3+10-4.56x2-(10-4.56×0.01+10-14)x-10-4.56×10-14=0
求解算法可以描述为:
上述算法转化为Python程序如下:
上述程序中,为fa和fb赋值1,目的是让第一次循环成立。为了提高程序的可读性,代码书写遵循了原公式的表达,所以定义了Ka,Kw,c等变量。(www.daowen.com)
但上述代码中,有一些地方让人感觉非常烦琐,它们就是计算fa、fb和fm的语句。至少,在中学代数方程的学习中,我们已经学过了约简的概念,程序中可以这么做吗?这里暂时留下这个悬念,留待“归纳与抽象”一节中解释。
程序的运行结果为:
请输入醋酸浓度:0.01
请输入左区间:1
请输入右区间:10
请输入左区间:0.001
请输入右区间:1
请输入左区间:0.000001
请输入右区间:1
氢离子浓度为:0.000511216937082063
【例3.2.4】 求任意高次方程的解
例3.2.3中提供的代码只能求解固定的高次方程的根。有没有可能编写一段通用代码,可以求解任意的高次方程的根?答案是肯定的,它就是借助Python的eval函数。程序如下:
程序:求任意高次方程的根
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。