




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科生毕业论文引言我们知道,化学反应可分为两种,氧化-还原反应和非氧化-还原反应。非氧化-还原反应,各原子在反应前后不发生电子的得失,其化学方程式左右各分子之间只存在整数倍的关系,很容易配平。所以,用电脑来配平这一类化学方程式,意义不大。而氧化-还原反应,由于各原子在反应前后发生电子交换,配平时往往很复杂。人们想了很多巧妙的办法来配平这一类化学方程式。根据氧化-还原反应反应前后各离子化合价的变化及电子的得失情况,可对其化学方程式进行配平,这种配平方法称作“电子配平法”。例如,电离水的反应,其化学方程式为:电离式:配平后的两个电离式是:从而显然,这种方法不太适合计算机,因为它涉及到离子化合价的变化、电子的得失等令计算机“头疼”的问题,不宜用来编制计算机程序。因此,我们可采用一些“笨”办法,以避免上述的“技巧”。在化学方程式中,给每一个分子预设一个未知系数,根据每一种元素反应前后物质的量不变的原理,可列出一个方程组,求得这个方程组的解,就是配平后化学方程式的系数。由此可知,用这种方法配平化学方程式,最终可转化为纯数学问题,这正好可以发挥计算机运算速度快的特长,是“好”方法,是可接受的。第一章 系统实现原理下面通过一个实例来说明。在化学方程式As2S3+H2O2+(NH4)2CO3(NH4)3AsO4+(NH4)2SO4+CO2+H2O中,有7个分子,左侧3个:As2S3,H2O2,(NH4)2CO3,右侧4个:(NH4)3AsO4,(NH4)2SO4,CO2,H2O。有六种元素,分别是:As,S,H,O,N,C。它正好符合我们所要求的条件:分子个数=元素个数+1。在每个分子式前添加未知系数:As2S3+H2O2+(NH4)2CO3(NH4)3AsO4+(NH4)2SO4+CO2+H2O只要能求出的值,问题就解决了。根据反应前后每一种元素物质的量不变的原理,可针对每一个元素列出一个方程:As:2=S:3=H:2+8=12+8+2O:2+3=4+4+2+N:2=3+2C:=整理、变形后,方程组的形式如下: As:2 - =0S:3 - =0H: 2+8-12-8 -2=0O: 2+3-4 -4-2- =0N: 2-3 -2 =0C: - =0设未知向量为X,即 X= 则上述方程组的系数矩阵是:A= 所以,此方程组写成矩阵的形式就是AX=0。这是一个有7个未知数,6个方程的齐次线性不定方程组。如果各个方程之间线性无关的话,即各个方程相互独立,这个方程组就有无穷多个实数解。然而,我们想要的是一组无公约数的正整数解,因为配平后的化学方程式各分子的系数不能是分数或小数,也不能是负数,必须是正整数,而且这组正整数之间没有公约数。加上这样的限制条件,上述方程组的解就是唯一的了。如何才能求出这个唯一解呢?显然,方程组的自由未知数的个数为1(自由未知数的个数=未知数的个数-独立方程的个数)。我们不妨令方程组中某一个未知数等于一个正整数,这样的话,原方程组就变成6个未知数,6个独立方程的固定方程组了。这个方程组只有一组唯一的解,我们不妨设这组解对应的解向量是Y。这个解向量的各个元素是任意实数,并非肯定是正整数。但是,根据每一种元素反应前后物质的量不变的原理,它们之间肯定存在着整数倍的关系。也就是说,肯定存在一组正整数, 正好是Y的倍数。将这一组正整数通分,使其没有公约数。这样处理以后,就可得到我们所要求的没有公约数的正整数解X。对于上述方程组,为简单起见,可令最后一个未知数=1,再移项、整理,把常数项(即的系数)移到等号右边,可得如下所示的方程组:As:2 - =0S:3 - =0H: 2+8-12-8 =2O: 2+3-4 -4-2=1N: 2-3 -2 =0C: - =0这个方程组的系数矩阵是: A=,常数向量为:B=方程组写成矩阵的形式,就是AX=B。这个方程组就是6个方程,6个未知数的固定方程组了,它是可解的。解这个方程组,得出=0.07143, =1.0000, =0.4286, =0.1429, =0.2143, =0.4286。再加上预设的=1,就是Y=事实上,现在已经求得了原不定方程组的一组解,只不过这组解未必就是正整数而已。以后的任务是,想方设法把这一组实数解通通转化为正整数, 再使它们没有公约数。我们可以这样来做:让这些数(可能是小数,也可能是负数)连续自加,直到它正好达到某一正整数,停止自加,记下它自加的次数,就是它与这个整数相差的倍数。对这组实数解的每个元素都作这样的处理,就可得到一组与实数解元素个数相同的整数。再求得这组整数的最小公倍数m,用m乘以实数解的各个元素,得到的一组数肯定都是正整数,这就是所要求的最终结果。显然,求得的最小公倍数m,就是自由未知数的值。本例中,经运算可得出m=14,所以X=m*Y=14*Y=这样就求得了原不定方程组的一个解,而且是一组无公约数的正整数解,符合化学方程式配平的条件。配平后的化学方程式是:As2S3+14H2O2+6 (NH4)2CO32 (NH4)3AsO4+3 (NH4)2SO4+6CO2+14H2O第二章 系统设计有了上述方法,就可以编写程序了。编写程序可分为“两步走”。第一步,读入化学方程式,并对它进行分析,以获得待定系数法的“齐次线性不定方程组”。第二步,解这个不定方程组,得出最后结果。解不定方程组时,又分为两步。首先,令自由未知量=1,得到方程组AX=B。用高斯消元法,解这个方程组,求得此方程组的一组唯一实数解。其次,对这组实数解进行“整数化”,得出最终结果。以下是本系统的总结构图。图1 总结构图2.1分析、处理化学方程式事实上,化学方程式是一个包含多种字符的字符串。为了配平它,首先要对它进行标识、分析,最后从中“抽出”我们所需要的那个“齐次线性不定方程组”。为了便于标识,可以人为的在化学方程式的末尾加上一个特殊符号,例如“#”。这样,任意一个化学方程式中,可能出现的字符就只有八种:英文大写字母AZ英文小写字母az数字09前括号(后括号)加号+连字符结束标志#分析字符串,是一个很复杂的过程,要用到编译原理中词法分析的一些算法和技巧。以下是分析化学方程式的状态转换图: 图1 分析化学方程式的状态转换图以下是化学方程式的输入和识别的部分源代码。/*输入化学方程式,把它存入字符数组Equation中 */void GetEquation(char Equation)int i;char c= ;for (i=0; c!=#; i+) c=getchar(); Equationi=c; Equationi=0;/* 从n元二维字符数组Elem中删除重复元素,由函数返回数组的上限值 */int DelElem(char Elem3,int n)int i,j,flag;/* char temp3; */for (i=1; in; i+) flag=0;/* 置标志值flag=0 */ /* strcpy(temp,Elemi); */for (j=0; ji; j+)if (!strcmp(Elemj,Elemi) flag=1;break; if (flag=1) /* 如果第i个元素与它之前的某个元素相同,则置flag=1 */ for (j=i; jn-1; j+) strcpy(Elemj,Elemj+1); i-;n-; /* 将重复元素以后的元素向前移动一位,覆盖重复元素 */return n;/* 识别元素,即把已存入字符数组Equation中的化学方程式中的元素挑选出来,存入二维字符数组Element中,并由函数返回元素个数 */int IdElem(char Elements3,char Equation)int i,j=0,k;char a= ,b;for (i=0; a!=-; i+)a=Equationi;b=Equationi+1;if (isupper(a)if (islower(b) Elementsj0=a; Elementsj1=b; Elementsi2=0;j+;else Elementsj0=a; Elementsj1=0; j+;k=DelElem(Elements,j);return k;/* 将化学方程式Equation的分子式存入Molecule中,同时把化学方程式左侧的分子个数存入UB1中,右侧分子个数存入UB2中,分子总数存入UB0中。 */void StoreMol(int UB,char Molecule20,char Equation)int i,j,k;char temp20;/* 储存左边的分子式 */for (i=0,j=0,k=0; Equationi!=-; i+)if (Equationi!=+) tempj+=Equationi;else tempj+=0; j=0;strcpy(Moleculek,temp);k+; tempj=0;strcpy(Moleculek,temp);UB0=i+1;UB1=k+1;/* 储存右边的分子式 */for (i=UB0,j=0,k=UB1; Equationi!=#; i+)if (Equationi!=+) tempj+=Equationi;else tempj+=0; j=0;strcpy(Moleculek,temp); k+; tempj=0;strcpy(Moleculek,temp);UB2=k-UB1+1; UB0=k+1;/* 传递分子式,改变存储结构。由函数返回该分子所含单体(元素或数字)个数 */int PassMol(char ElemMol5,char EquMol20,int n)int i,j=0,k;for (i=0; EquMolni!=0; i+)if (isupper(EquMolni)if(islower(EquMolni+1) ElemMolj0=EquMolni;ElemMolj1=EquMolni+1;ElemMolj2=0;j+; i+; else ElemMolj0=EquMolni;ElemMolj1=0; j+; else if(isdigit(EquMolni) for(k=0; isdigit(EquMolni); k+) ElemMoljk=EquMolni+; ElemMoljk=0; j+; i-;return j;/* 从化学方程式剥离出对应的线性不定方程组的系数矩阵,存入二维实型数组ModMatrix中。*/int PassDigit(float ModMatrix20,char Molecule20, char Elements3,int UN,int EN)int i,j,k,m;char ElemMol205;for (i=1; i=EN; i+) /* 左 */for (j=1; j=UN1; j+)ModMatrixij=0;/* 初始化系数矩阵 */ m=PassMol(ElemMol,Molecule,j-1); for (k=0; km; k+) if(!strcmp(Elementsi-1,ElemMolk) if (isdigit(ElemMolk+10)ModMatrixij=atof(ElemMolk+1);/* atof()是数型转换函数 (从字符串到浮点型) */else ModMatrixij=1; /* 右 */for (j=UN1+1; j=UN0; j+) ModMatrixij=0;/* 初始化系数矩阵 */ m=PassMol(ElemMol,Molecule,j-1); for (k=0; km; k+) if(!strcmp(Elementsi-1,ElemMolk)if (isdigit(ElemMolk+10)ModMatrixij=-atof(ElemMolk+1);/* atof()是数型转换函数(从字符串到浮点型) */ else ModMatrixij=-1;return 1;2.2 解方程组 2.2.1 高斯消元法通常,在线性代数方程组的计算机算法中,有两种最基本的解法。一是直接解法,即消元法。这种方法的优点是可以预先估计计算的工作量,并且根据消元法的基本原理,可以得到有关矩阵运算的一些方法,因此其应用很广泛。但是,由于在实际计算过程中总存在着舍入误差,所以,用直接法得到的结果并不是绝对精确的,并且还存在着计算过程稳定性问题。另一个是迭代解法。这种方法的优点是简单,便于编制计算机程序。但这种方法存在着迭代是否收敛以及收敛速度快慢的问题。在迭代法中,由于极限过程一般不可能进行到底,因此,只能得到满足一定精度要求的近似解。当然,这在实际应用中是足够的。矩阵和线性代数方程组的一些基本概念及其运算在线性代数课程中已有介绍,本文主要讨论在计算机上实现的一些具体算法,对于主要的方法将给出C语言源程序。高斯(Gauss)消元法是直接法的一种。对于线性方程组AX=B大致可以分为以下两步。(1)将系数矩阵A经过一系列的初等变换变成上三角矩阵,其常数向量B也同时参与变换。即 在变换过程中,采用原地工作的方法,即经变换后的元素仍放在原来的位置上。为了实现这一步,可以对k从1开始一直到n-1作以下两步(假设对于任意的k均有0):(i) 这一步称为归一化。它的作用是将主对角线上的元素变成1,同时,第k行上的所有元素与常数向量中的都要除以。但由于变换后的元素仍放在原来的单元中,因此,为了不影响所在行的其余元素的变换,在这一步中并没有将变成1,但这是无关紧要的,因为以后的变换已经用不着这个元素了。(ii) -, i=k+1,nj=k+1,n -, i=k+1,n这一步称为消去。它的作用是将主对角线以下的元素均消成0,而其它元素与向量B中的元素也作相应的变换。与第(i)步的道理一样,在这一步中也没有真正将以下的元素变成0。这样处理的好处在于:一方面节省了计算工作量,另一方面也避免了对后面变换的影响。(2) 进行回代,依次解出,。由于在前面第一步中,k是从1到n-1,对于系数矩阵的最后一行没有进行归一化,因此,这一步又要分成两个步骤:(i) 直接解出,即:/(ii)进行回代, , i=n-1,2,1综上所述,高斯消元法求解线性方程组的步骤如下:第一步,对于k从1到n-1,先归一化:天家 再消去: -, i=k+1,nj=k+1,n -, i=k+1,n第二步,回代: / , i=n-1,2,1由上述步骤可以看出,归一化过程每执行一次需要作n-k+1次除法,消去过程每执行一次需要作(n-k+1)(n-k)次乘法。因此,第一步共作 次乘除法。而回代过程需要作 次乘法。所以,高斯消去法总的工作量为 次乘除法。另外,在归一化过程中,要用作除数,因此,当|很小时,会损失精度,并且可能会因为商太大而使计算产生溢出。特别当=0时,运算就会中断。为了避免这种情形,在每一次归一化之前,必须增加一个选主元的过程,将绝对值较大的元素交换到主对角线的位置上来。2.2.2 选主元选主元主要有列选主元和全选主元两种。1 列选主元列选主元简称为列主元。它的基本思想是在变换到第k步时,从第k列的以下(包括)的各元素中选出绝对值最大者,然后通过行交换将它交换到的位置上。在求解线性方程组的高斯消去法中,交换系数矩阵的两行(包括常数向量中的两个相应元素),只相当于两个方程的位置被交换了,因此,列选主元是不影响求解结果的。但是,列选主元还不能保证所选的是同一行中的绝对值最大者,因此,采用列选主元后,虽然变换过程不会中断,但其计算过程还是不稳定的。2 全选主元全选主元简称为全主元。全选主元的基本思想是:当变换到第k步时,从右下角(n-k+1)阶子阵中选取绝对值最大的元素,然后通过行交换和列交换将它交换到的位置上。前面提到,在求解线性方程组的高斯消去法的变换过程中,行交换不影响最后的结果。但是,列交换将会导致最后结果中对应未知数的次序混乱。即在进行第i行与第j列的交换后,最后结果中与的次序也就被交换了。因此,在使用全选主元的高斯消元法时,必须在选主元的过程中记住所进行的一切列交换,以便在最后结果中恢复。以下是本系统中实现全选主元高斯消元法的子函数。/* 全选主元高斯消元法,系数矩阵由数组Modulus代入,常数项由数组Const代入,n为未知数个数,方程的解由数组Result返回 */int DGAUSS(float Result50,float Modulus5050,float Const50,int n)int k,i,j,strange=0;int l,js50;float d;/* 全选主元,将系数矩阵变换为上三角形矩阵,常数项也作相应变换 */for (k=1; k=n-1; k+)d=0;for (i=k; i=n; i+) /* 全选主元 */for (j=k; jd) d=fabs(Modulusij); jsk=j; l=i; if(d=0.00001) return strange; /* 系数矩阵为奇异方阵,退出 */if (jsk!=k)for (i=1; i=n; i+)SWAP(Modulusik,Modulusijsk); /* 列交换 */if (l!=k)for (j=k; j=n; j+) SWAP(Moduluskj,Moduluslj); /* 行交换 */SWAP(Constk,Constl);for (j=k+1; j=n; j+)Moduluskj=Moduluskj/Moduluskk; /* 归一化 */Constk=Constk/Moduluskk;for (i=k+1; i=n; i+) /* 消去 */for (j=k+1; j=n; j+) Modulusij=Modulusij-Modulusik*Moduluskj;Consti=Consti-Modulusik*Constk;/* 回代,求出解向量 */if(fabs(Modulusnn)=1; i-)d=0;for (j=i+1; j=1; k-) /* 恢复 */if (jsk!=k) SWAP(Resultk,Resultjsk);return 1;2.2.3 整性拟合实数解用高斯消元法求得的结果,与自由未知量组合起来,是原不定方程组的一组实数解。显然,这个结果不符合我们的要求,因为它们不一定是正整数。我们可以想办法使之变成正整数,并且使它们之间没有公约数。根据第一章提到的方法,此处可分两步:先将其转化为正整数,再对它们进行通分,使其没有公约数。这样处理以后,就可得到我们所要求的没有公约数的正整数解X。具体的做法是:第一步,提取解向量Y的某个元素,让这个数不断的自加,直到正好达到某一正整数。记下它自加的次数,设为。对均作这样的处理,可得到一组正整数。第二步,求的最小公倍数m,令X=m*Y,就可得出最后结果X。实现本算法的源程序如下所示。/* 将实型数组InOut整数化,并且使所求得的一 组整数无公约数,结果存入实型数组InOut中 */int EnInteger(float InOut,int m)int i,j;int t50;float y;float temp50;for (i=1; i=m; i+) j=0;y=0;while (!kbhit() /* 将实型数组InOut中的每一个实数向某一个整数拟合,用j记录 其自加次数,即此实数与所得整数相差的倍数 */y+=InOuti; j+;if (y-floor(y)=0.99)break; /* 退出while循环 */ti=j;/* 存入ti */y=MulCommonMultiple(t,m); /* 求整型数组t中各元素的最小公倍数 */for (i=1; i=m; i+) tempi=y*InOuti; InOuti=tempi; InOuti=y; /* y就是自由未知量 */return y;第三章 系统运行以硫金沙燃烧的化学反应为例,其反应方程式是: 运行结果如下:请输入化学方程式(#表示结束):FeS2+O2-Fe2O3+SO2#此化学方程式包含了3种元素(即方程个数):Fe S O 它的左侧有2个分子式:FeS2 O2 右侧有2个:Fe2O3 SO2 分子式总数(即未知数个数)是: 4对应的系数矩阵是: 1 0 -2 0 2 0 0 -1 0 2 -3 -2方程组的解为:x1= 4x2= 11x3= 2x4= 8自由未知量的值:8配平后的化学方程式是:4FeS2+11O2-2Fe2O3+8SO2第四章 系统评价 本系统有以下几个方面的优点:1.结构合理,内聚性好。在编写程序的过程中,尽量做到代码的结构化,模块的独立化。程序中各个基本功能,全都用函数来实现,而且没有使用全局变量。非常符合结构化程序设计语言“低耦合,高内聚”的要求。2.占用内存少,稳定性高前面提到,整个程序中没有全局变量。所以,在程序运行过程中,内存是动态分配的,各个函数的代码“随叫随到”,任何一个子函数的变量都没有永驻内存。这样,整个系统占用内存少,在运行过程中就不会发生“内存溢出”的情况,使系统更稳定。3.算法先进,运算效率高化学方程式是一个包含多种字符的特殊字符串,分析它,有一定的难度。本系统所采用的方法,是高级程序设计语言的编译系统所采用的词法分析算法。这种算法的效率是很高的。解方程组,用全选主元高斯消元法,是最先进的算法之一。但是,缺点也是存在的。1. 外观欠考究,界面不友好。采用C语言作为本系统的编程语言,可以充分发挥C语言功能强大、运行速度快、善于分析字符串的特点。但是,C语言是基于DOS的操作系统,很难作出考究的外观、友好的界面。2. 系统处于试行阶段,疏漏在所难免此次编制的程序是本系统的第一版,没有经过象普通商业软件那样严格的测试,很可能会存在一些潜在性问题。况且由于时间紧迫,疏漏在所难免。如果以后深入开发本软件,可对本系统进行反复测试,以提高其健壮性和稳定性。致谢在论文写作过程中,刘忠厚老师对我认真辅导,给予全力支持。他在百忙中抽出时间多次修改论文,及时提出好的意见和合理建议,为论文的完成花费了大量的心血,在此表示衷心的感谢。感谢蔡德聪老师,刘燕飞老师,敖丽敏老师等所有在大学四年里对我悉心教诲的老师们。他(她)们严谨的治学态度、深邃幽远的见识令我受益匪浅,永生难忘。谢谢班主任贾景卫老师在“非典”时期的辛勤工作,无论生
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 时间管理培训课件讲解
- 时间的速度课件
- 小鸟造房子课件
- 时装画速写课件
- 2025餐饮业团餐配送合同集成手册
- 二零二五版城市综合体LED大屏广告租赁管理协议
- 2025版绿色金融借款合同示范文本
- 二零二五版离婚协议书:房产债务分割与处理细则
- 二零二五年度别墅借款抵押交易合同模板
- 二零二五年度商用空调安装与能耗优化合同范本
- 患者信息安全课件
- T-CDHA 20-2024 T-CAR 20-2024 供热碳排放核算和碳排放责任分摊方法
- 2024年高等职业教育社区管理与服务专业人才培养方案修订调研报告
- (2025)党史知识竞赛试题库(含答案)
- 动力电池气密性检测及故障处理
- 2025年文化产业与商业模式知识测评试卷及答案
- 中建材特种玻璃深加工一期工程项目环评报告
- T/GIEHA 013-2019商用厨房油烟管道系统清洗规范
- 河南省2024-2025学年天一大联考高三考前模拟考试历史试卷+答案
- 2025质量工程师笔试题库及答案
- 期货保密协议书
评论
0/150
提交评论