大学化学, 2017, 32(10): 52-60 doi: 10.3866/PKU.DXHX201705025

自学之友

开发面向分析化学的复杂方程绘图求解软件

邵利民,

Developing a Software Package to Plot and Solve Complex Equations in Chemical Analysis

SHAO Li-Min,

通讯作者: 邵利民, Email: lshao@ustc.edu.cn

基金资助: 安徽省重大教学研究项目.  2015zdjy006

Fund supported: 安徽省重大教学研究项目.  2015zdjy006

摘要

化学平衡的精确解析会涉及复杂方程的求解,而分析化学专业人员通常不完全具备相关算法和编程知识。所以,尽管当前硬件发达、编程语言丰富,精确解析仍然难以在分析化学课程中大规模推广。为此,基于Matlab语言,开发了具有针对性的方程求解软件。该软件以简洁的界面、直观的图像和自然的人机交互,实现方程的高效求解;对用户的编程要求非常低。期望通过这种方式,显著降低化学平衡精确解析中的软件使用成本,从而为大规模推广提供进一步的支持。本文介绍了该软件的基本原理和主要特点;通过3个复杂化学平衡实例,详细说明软件的使用方法以及注意事项。另外提供Android系统版本,免费使用。

关键词: 化学平衡 ; 精确求解 ; 软件开发 ; Matlab语言 ; 安卓系统

Abstract

Accurate analysis of chemical equilibria involves solving complex equations, which requires adequate knowledge on algorithms and programming languages. People who major in analytical chemistry often lack such knowledge. As a result, it is difficult to adopt accurate analysis in analytical chemistry on a large scale. To overcome such difficulty, we developed a software package with Matlab. The software solves complex equations efficiently through an intuitive interface, a graph, and natural interactions, whilst requires little programming on users. This paper introduced theory and features of the software package, and explained its usage in detail with 3 examples of complex chemical equilibria. An Android version was also developed and provided free of charge.

Keywords: Chemical equilibrium ; Rigorous solution ; Software development ; Matlab language ; Android system

PDF (3630KB) 元数据 多维度评价 相关文章 导出 EndNote| Ris| Bibtex  收藏本文

本文引用格式

邵利民. 开发面向分析化学的复杂方程绘图求解软件. 大学化学[J], 2017, 32(10): 52-60 doi:10.3866/PKU.DXHX201705025

SHAO Li-Min. Developing a Software Package to Plot and Solve Complex Equations in Chemical Analysis. University Chemistry[J], 2017, 32(10): 52-60 doi:10.3866/PKU.DXHX201705025

分析化学作为“四大化学”之一,是国内外高校相关专业的基础课。分析化学的核心内容是化学平衡的定量解析,其中涉及到较为复杂的数学处理,例如高次代数方程的求解。在计算工具欠发达的年代,复杂数值运算是难以逾越的障碍。所以,研究者们通过近似处理,推导出一系列运算简单的近似公式;以“公式化”为特征的经典课程体系由此建立,并沿用至今[1-3]

近似求解是特定历史条件下的权宜之计。当计算机技术高度发展、数值运算不再困难时,人们自然转向精确解析。“去公式化”课程体系为化学平衡的精确解析提供了理论框架[4];技术层面上的实施也不困难。然而,在分析化学课程中大规模推广精确解析,还需要硬件和软件的进一步支持。

当前,计算机硬件不仅具有强大的运算能力,更重要的是高度普及和便携,如笔记本电脑、平板电脑和智能手机,从而为精确解析的大规模推广提供了足够支持。软件,尤其是高效易用的软件,发展相对滞后,是大规模推广的瓶颈。

编程可以实现精确解析,一些研究者通过不同语言求解化学平衡问题,如Matlab语言、C#语言[5, 6]。但是,这种方式涉及到较为专业的算法和编程知识,期望大多数分析化学师生系统掌握这些专业知识并应用于具体问题,并不现实。另外一种方式是借助应用软件,如Excel、Matlab[7, 8]。这种方式相对简单,但是应用软件在功能、易用性和使用许可等方面存在较大差异;对化学平衡问题没有针对性,用户体验较差。还有研究者针对具体化学平衡问题自行开发了应用软件[9]

精确解析的大规模推广需要这样一种方程求解软件:功能足够强大,又如计算器般直观易用。看似矛盾,然而,当前硬件和软件发展水平已经允许我们设计出界面友好,直观易用的软件。这也是开发本软件的主导思想:为分析化学师生提供直观、高效、免费的方程求解软件,尽可能降低化学平衡精确解析中的软件使用成本。

1 软件设计要点

本软件在Matlab环境下开发和使用。Matlab是Mathworks公司出品的数据分析和数值计算的专业平台,兼有编程语言和应用软件的特点。作为编程语言,Matlab语法简单高效;作为应用软件,Matlab提供各种专业的算法程序。对于非计算机专业人员,Matlab是解决数值计算问题的有力工具。另外,越来越多的国内高校为非计算机专业学生开设Matlab课程;有些高校购买“正版全校授权” (Total Academic Headcount,TAH),供在校师生免费使用。这些措施进一步提高了Matlab在高校的普及程度。

本软件采用“二分法”求解方程。其他方程求根算法包括不动点迭代法(Picard迭代)、切线法(Newton-Raphson迭代)、割线迭代法等。与各种迭代法相比,二分法无须建立迭代公式,不必考虑迭代初值,也不必考虑迭代收敛问题,所以在易用性方面具有显著优势,对于非计算机专业用户来说尤其如此。二分法要求函数在求根区间上连续,且与x轴只有一个交点,这通过函数图像很容易判断。

本软件绘制方程对应的函数的图像,直观反映函数与x轴的相交情况。通过图像缩放或者平移,用户能够快速确定满足二分法要求的求根区间,既提高效率,又避免漏根。此外,图像便于用户查看函数特征和细节,进而判断是否存在因绘图数据点不足而未能显示的交点,文中例3介绍了这种情况。

本软件的开发重点是界面。对于非专业人员而言,界面体验直接决定了求解效率。根据人们求解方程的自然思路,规划界面布局;遵循求解过程的内在逻辑,设置软件功能以及各功能之间的逻辑关系。界面设计完全服务于功能,在满足功能性的同时,尽量简洁,所有功能均在界面上提供,没有设置菜单。

本软件从底层设计,仅使用Matlab基本运行环境,不需要任何工具箱(Toolbox)中的函数。用户不必为此另外购买任何Matlab工具箱。

2 软件安装和首次运行

用户从http://staff.ustc.edu.cn/~lshao/misc.html下载iroots2安装程序。软件尽管可以安装在任意文件夹,但是其文件操作权限可能受限(如果权限不够,软件给出提示和解决方法)。为了避免权限方面的麻烦,建议将安装程序下载到桌面,然后默认安装。

上述文件操作权限是指软件iroots2求解方程时在自身文件夹中创建和删除数据文件,不会对其他文件进行操作。

iroots2要求Matlab的最低版本是7.10.0.499 (R2010a)。如果Matlab版本太低,软件给出相应提示。

软件安装成功后,需要在Matlab中输入相应命令来运行,运行方法在软件文件夹中的The First Running.pdf有详细介绍。这种略显繁琐的手动运行方式仅需一次。首次运行时,iroots2在用户许可后,会自动创建一个快捷方式,以后通过点击快捷方式按钮,即可方便地运行该软件。

3 软件使用

软件的主界面如图1所示。上面的工具栏包含5个按钮,分别是“放大”“缩小”“平移”“帮助”和“检查更新”;前3个按钮用于函数图像的操作。主界面划分为Function和Action两个功能区,分别用于输入方程表达式,绘制对应函数图像并求解方程。

图1

图1   软件主界面

电子版为彩图


3.1 输入方程

在Function功能区,用户按照Matlab语法输入待解方程的表达式。为了简要说明语法规则,软件启动后即显示一个实例,见图1中的蓝色文本。用户点击“Syntax”按钮,可以查看另外一个复杂实例,是CaF2在0.010 mol∙L-1盐酸溶液中溶解平衡时关于[H+]的高次方程。

软件自带两个实例,是为了方便不熟悉Matlab语法的用户。事实上,Matlab语法接近自然语言,而化学平衡中的方程相对简单,所以方程输入所涉及的Matlab语法容易掌握,概况为以下要点:

1)变量区分大小写。

2)字母xy是指定的自变量和因变量,不能他用。

3)以%开始的行是注释。建议进行必要的注释,以备参考,因为所有用户输入的方程都被自动保存在一个数据库中。

4)如果方程表达式比较复杂,可以使用一些临时变量,参见“Syntax”按钮提供的实例。

5)每条语句应该以分号结束(用户如果忽略,软件会智能添加)。

6)运算符+、-、*、/、^分别代表加、减、乘、除、和乘方。对于开n次方,可以使用^(1/n)。负数开奇数次方Matlab给出复数结果,如(-8)^(1/3) = 1.0000 + 1.7321i,为了避免这一点,建议使用nthroot,如nthroot(-8, 3) = -2。

(7)如果表达式较长,输入时会自动折行。用户也可以自己断行,断行处添加省略号…。

方程输入完成后,用户需要点击“Finish”按钮,进行下一步。“Clear”按钮清除所有输入。“Function DB”按钮进入方程库,在3.3节详细介绍。

3.2 图像绘制和方程求解

函数图像的绘制和方程求解在Action功能区完成。如图1所示,功能区下方是显示函数图像的坐标系。功能区上方是按钮、文本和编辑框等控件,这些控件组成一句完整表述:Plot the function from 1e-14 to 1, or around 0.0, with 10000 points, solve it。期望以这种扁平化方式既解释方程求解的过程,又完成相应功能,同时保持界面的简洁清晰。

区间端点的缺省值为10-14和1,是为了方便化学平衡中组分浓度的求解,因为浓度通常处于这个区间。区间端点的具体数值并不重要,只需满足“函数在区间内与x轴只有一个交点”的要求即可。用户如果知道方程的近似解,还可以选择在这个近似解附近绘图,软件会自动搜索一个满足要求的求根区间。当区间端点的数量级相差太大时,软件自动选择对数坐标。

用户单击“Plot the function”按钮来绘制函数图像。如果坐标系背景为绿色,说明函数与x轴只有一个交点——满足“二分法”要求,然后单击“solve it”按钮,即显示求根结果,结果同时也复制到剪贴板。如果坐标系背景为红色,表明“二分法”的求根条件不满足(没有交点或者有多个交点),“solve it”按钮为不可点击状态。如果存在多个交点,通过工具栏上的按钮对图像进行缩放或者平移,改变横坐标的范围,直到坐标系重新变为绿色(“solve it”按钮同时变为可点击状态),然后进行求解。通过这种方式,可以求出所有交点。

3.3 方程库

用户输入的方程如果正确,会自动保存在一个数据库中。单击“Function DB”按钮进入数据库。数据库缺省界面如图2(a)所示。按钮“Previous”和“Next”用于浏览数据库中的方程,方程的位置和创建时间显示为图中的蓝色文本。鼠标右键单击蓝色文本,文本消失,取而代之的是一个滑动条,见图2(b)。滑动条的功能与按钮“Previous”和“Next”相同,但是操作更加快捷,适用于方程较多时浏览和定位;滑动条的提示信息是方程位置和创建时间。鼠标右键单击滑动条,滑动条消失,蓝色文本复原。

图2

图2   方程库界面

(a)缺省界面;(b)鼠标右键单击蓝色文本后的界面
电子版为彩图


用户如果想再次求解数据库中的某个方程,定位到该方程后单击“Choose”。软件将返回方程求解界面,并自动完成方程的输入(“Finish”按钮处于不可点击状态),用户直接在Action功能区实施求解。

单击按钮“Delete”或者“Purge”,可以删除当前方程或者数据库中所有方程。按钮“Undo”用于撤销“Purge”或者一次“Delete”操作。如果用户删除了多个方程,那么按钮“Undo”无法复原数据库,此时单击窗口右上角的X退出软件(而不是“Close”按钮退出数据库),那么原数据库不受影响。

数据库以二进制格式保存。可以通过按钮“Export”将数据库中方程导出到一个文本文件。

3.4 软件其他功能

软件提供一定的界面定制:用户可以修改窗口大小,文本和按钮的字体大小。这样,在不同屏幕分辨率下,特别是高分屏,也能获得较好的界面体验。

界面定制与Matlab版本相关。一台计算机上如果安装了多个版本的Matlab,可以在不同版本下对软件界面进行分别定制,互不干扰。不同版本Matlab对图形窗口的设置以及字体渲染有时略有差异,而针对Matlab版本的界面定制可以克服这种差异对于界面体验的影响。

软件提供新版本查询功能。用户点击工具栏上的“U”按钮,可以手动查询新版本;软件会定期自动查询新版本(不会上传任何用户信息)。如果有新版本,在得到用户允许后,软件会自动完成更新,用户数据(界面定制和方程库)不受影响。

3.5 进一步说明

在方程输入面板,用户通过右键菜单或者常规快捷键进行文本的复制、粘贴、剪切和全选。但是,面板不支持撤销操作以及相应快捷键ctrl+z,这是Matlab的限制。

本软件有意降低对用户Matlab编程知识的要求,以突出易用性,代价是无法利用Matlab在矩阵运算方面的优势。

限于条件,本软件没有在Mac系统和Linux系统下进行检测,尤其是文件创建、删除等操作。

针对具有一定Matlab编程知识的用户,还开发了另一个功能基本相同的求解软件,名为iroots,这也是文献[4]附录4中的版本,下载地址是http://staff.ustc.edu.cn/~lshao/misc.html。iroots的易用性不如iroots2,但是更加灵活,并且不依赖于操作系统和屏幕分辨率。

软件保留版权。对于非商业用户,软件免费使用,免费升级。iroots同样是免费软件,并且提供源代码。

还开发了Android版本,用户可以在“小米应用商店”通过搜索equation solver安装使用,也可以从上述地址下载apk文件。

4 软件应用

分析化学中的方程一般不太复杂,而且多是求解浓度,例如常见的求pH问题。所以,只要方程输入正确,使用软件默认的求根区间[10-14, 1],通常可以顺利求解,而且只需两步:单击“Plot the function”绘图,图像背景绿色时单击“solve it”。

如果涉及多个化学平衡,方程求解可能存在某些困难,包括:①方程比较复杂,有时甚至难以得到y = f(x)这样的显式方程,因此输入繁琐、易错;②难以确定求根区间;③存在多个解。对于第1个困难,输入表达式时适当使用辅助变量。对于第2和第3个困难,要充分利用图像,并结合具体问题中的信息,综合判断。下面通过3个例题进行说明,例题全部选自文献[4],解题过程突出软件的使用,省略方程推导。

例1 0.050 mol∙L-1的I2溶液作为滴定剂(含1.0 mol∙L-1 KI),滴定0.10 mol∙L-1的Na2S2O3溶液。以淀粉为指示剂,当溶液中I3-的浓度为5.0 ×10-6 mol∙L-1时,溶液由无色变为蓝色,计算终点误差。(电对I3-/I-和S4O62-/S2O32-的条件电势$E_1^{\Theta '} $$E_2^{\Theta '} $分别为0.545 V和0.080 V)

解:解题关键在于RR = Vep/Vsp,其中VepVsp分别表示滴定终点和化学计量点时加入I3-溶液的体积。通过推导,得到以下方程:

方程形式复杂,编程时将其中的某些项表示为辅助变量,这样可以使表达式简洁可靠。下面是参考代码,在Function功能区输入后单击“Finish”按钮。

const = 10 ^ (2 * (0.08 -0.545)/0.059 + 6);

aux1 = 5 * (x + 1)^2 * (0.10001 -0.09999 * x)^2;

aux2 = (1.09999 * x -1e-5)^3;

aux3 = (0.049995 * x -5e-6);

y = const * aux2 * aux3 -aux1;

对于该问题,R ≈ 1,所以选择在1.0附近绘图。图像背景红色,说明求根区间内函数与x轴没有交点或者有多个交点——不满足“二分法”求解要求。放大图像进行查看,见图3(a)。从图3(a)中没有看到明显的交点,显然是因为数据点数不够。解决这个问题的有效办法是缩小求根区间。

图3

图3   例1方程的图像

(a)在1.0附近的图像;(b) 0.999-1.001上的图像
电子版为彩图


将区间端点设为0.999和1.001,重新绘制函数图像,并再次放大,见图3(b)。从图3(b)中可以清楚地看到两个交点。明确交点后,求解就比较简单。通过工具栏的平移按钮,将一个交点移出坐标系后(图像背景变为绿色,按钮“solve it”变为可点击状态),即可求解。由此得到两个根,分别是1.000208和1.000192。根据具体问题的分析[4]R应该取值1.000192,由此计算出终点误差Et = (R -1) × 100% = 0.019%。

例2 将CdS置于cNaCN = 0.10 mol∙L-1的碱性溶液中,沉淀溶解平衡后pH = 10.0。需要考虑沉淀溶解对溶液原有[CN-]的影响,计算CdS的溶解度。(CdS:Ksp = 1.0×10-27;H2S:Ka1 = 1.3×10-7Ka2 = 7.1×10-15;HCN:Ka = 6.2×10-10;Cd2+-CN-配离子:β1 = 3.0×105β2 = 4.0×1010β3 = 1.7× 1015β4 = 6.0×1018)

解:解题关键在于[CN-]。通过推导,得到以下方程,其中x表示[CN-]。

类似于例1,输入方程表达式时使用辅助变量。下面是参考代码,在Function功能区输入后单击“Finish”按钮。

k1 = 1.3e-7; k2 = 7.1e-15; k = 6.2e-10; h = 1e-10; ksp = 1e-27;

b1 = 3e5; b2 = 4e10; b3 = 1.7e15; b4 = 6e18;

aux1 = 1 + b1 * x + b2 * x^2 + b3 * x^3 + b4 * x^4;

aux2 = b1 * x + 2 * b2 * x^2 + 3 * b3 * x^3 + 4 * b4 * x^4;

aux3 = k1 * k2 / (h^2 + k1 * h + k1 * k2);

aux4 = k / (h + k);

y = ksp * aux2 / (0.1 -x / aux4) / aux3 -(0.1 -x / aux4) * aux1 / aux2;

Cd2+-CN-配合物的生成致使[CN-] < 0.10;但是CdS非常难溶,释放出的Cd2+很少,故[CN-]也不会太小。这样,未知数[CN-]很有可能处于软件默认的求根区间10-14 -1之中,于是直接点击“Plot the function”进行绘图。

图像背景为红色,放大后查看函数与x轴似乎只有一个交点,如图4(a)所示。连续放大数次后发现其实不只一个交点,如图4(b)所示。明确了交点后,通过工具栏的平移按钮,分别将其他交点移出坐标系(图像背景变为绿色,按钮“solve it”变为可点击状态),然后求解得到两个根8.5877×10-2和8.6347×10-2。两个根很接近,所以图4(a)中看起来只有一个交点。

图4

图4   例2方程的图像

(a)放大图像;(b)交点附近的放大图像
电子版为彩图


方程中的项0.10 -x/δCN-应该大于零,将相应数值代入,得到x < 0.08611。所以,符合题意的根是8.5877×10-2 mol∙L-1

值得指出的是,图4(b)中并没有3个交点,中间的其实是函数在0.08611附近的一个间断点。如果整理原方程,在等号两侧同时乘以(0.10 -x/δCN-),再进行求解,那么图像中就只有两个交点。当然,这种整理对于本软件来说并非必要,而且还增加了求解时间。

例3 配制0.050 mol∙L-1的H2C2O4溶液用于酸碱滴定,由于失误使用了自来水。自来水的硬度较大,其中Ca2+的浓度约为0.0070 mol∙L-1。计算该溶液的pH。(CaC2O4Ksp = 2.3×10-9;H2C2O4K1 = 5.9×10-2K2 = 6.4×10-5)

解:通过推导,得到以下两个方程:

$\left[{{{\rm{H}}^ + }} \right] + 2\frac{{{K_{{\rm{sp}}}}}}{{\left[{{{\rm{C}}_2}{\rm{O}}_4^{2-}} \right]}} = \frac{{{K_1}\left[{{{\rm{H}}^ + }} \right] + 2{K_1}{K_2}}}{{{{\left[{{{\rm{H}}^ + }} \right]}^2} + {K_1}\left[{{{\rm{H}}^ + }} \right] + {K_1}{K_2}}}\left( {0.043 + \frac{{{K_{{\rm{sp}}}}}}{{\left[{{{\rm{C}}_2}{\rm{O}}_4^{2-}} \right]}}} \right) + 0.014 + \frac{{{K_{\rm{w}}}}}{{\left[{{{\rm{H}}^ + }} \right]}}$

$\left[{{{\rm{C}}_2}{\rm{O}}_4^{2-}} \right] = \frac{{{K_1}{K_2}}}{{{{\left[{{{\rm{H}}^ + }} \right]}^2} + {K_1}\left[{{{\rm{H}}^ + }} \right] + {K_1}{K_2}}}\left( {0.043 + \frac{{{K_{{\rm{sp}}}}}}{{\left[{{{\rm{C}}_2}{\rm{O}}_4^{2-}} \right]}}} \right)$

方程组中的未知数是[H+]和[C2O42-]。将式(1)代入式(2)以消去[C2O42-],即可得到关于[H+]的方程。使用本软件时,其实没有必要推导出方程的显式形式,通过辅助变量即可。下面是参考代码,其中辅助变量aux3是通过式(1)得到的[C2O42-]。在Function功能区输入后单击“Finish”按钮。

ksp = 2.3e-9; k1 = 5.9e-2; k2 = 6.4e-5;

aux1 = x^2 + k1 * x + k1 * k2;

aux2 = (k1 * x + 2 * k1 * k2) * 0.043 / aux1 + 0.014 + 1e-14 / x -x;

aux3 = (2 * ksp -ksp * (k1 * x + 2 * k1 * k2)/aux1)/aux2;

y = aux3 -k1 * k2/aux1 * (0.043 + ksp/aux3);

在软件默认的求根区间10-14-1内绘图,见图5(a)。图像背景为绿色,单击“solve it”按钮,得到x = 0.1004。但是,这个结果与实际情况不符,因为0.050 mol∙L-1的H2C2O4即使完全离解,[H+]才是0.10。

图5

图5   例3方程的图像

(a)原图像;(b)放大图像
电子版为彩图


放大图像仔细检查函数与x轴的相交情况,结果见图5(b)。从中可以发现,在0.04附近函数值趋向正值,但是由于默认求根区间端点的数量级相差太大,致使0.04附近的数据点分配不足,正函数值最终没有能够出现。

基于上述分析,缩小求根区间,如0.03-0.04,重新绘图,即可求得[H+] = 3.97×10-2,这才是符合题意的解,所以pH = 1.40。

5 结语

在分析化学课程中大规模推广精确解析已经可行。“去公式化”课程体系提供了理论框架;计算设备的高性能和高度普及提供了硬件支持。为了提高效率,基于Matlab语言开发了一款方程求解软件。该软件突出易用性,对用户的编程要求非常低;针对化学平衡特点设计,提供简洁的界面、直观的图像和自然的人机交互,从而实现复杂方程的高效求解。还开发了Android系统版本,同样免费使用。该方案能够显著降低方程求解的软件使用成本,为化学平衡精确解析的大规模推广提供进一步支持。

参考文献

武汉大学. 分析化学, 第5版 北京: 高等教育出版社, 2006.

[本文引用: 1]

华中师范大学; . 分析化学, 第4版 北京: 高等教育出版社, 2011.

李龙泉; 朱玉瑞; 金谷; 江万权; 邵利民. 定量化学分析, 第2版 合肥: 中国科学技术大学出版社, 2005.

[本文引用: 1]

邵利民. 分析化学, 北京: 科学出版社, 2016.

[本文引用: 4]

薛泽春; 程晓东; 李连之; 张宪玺; 李大成. 大学化学, 2015, 30 (3), 80.

[本文引用: 1]

赵鑫; 王殿书; 丛培盛; 朱仲良. 计算机与应用化学, 2010, 27 (2), 257.

[本文引用: 1]

黄千姿; 唐美华; 张之翼; 边敏; 卜洪忠; 孙尔康; 陈国松. 大学化学, 2016, 31 (3), 78.

[本文引用: 1]

岳宣峰; 张智娟; 张延妮. 大学化学, 2016, 31 (8), 89.

[本文引用: 1]

甘峰; 李攻科. 大学化学, 2005, 20 (3), 51.

[本文引用: 1]

/