待定系数法配平化学方程式_第1页
待定系数法配平化学方程式_第2页
待定系数法配平化学方程式_第3页
待定系数法配平化学方程式_第4页
待定系数法配平化学方程式_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言我们知道,化学反应可分为两种,氧化-还原反应和非氧化-还原反应。非氧化-还原反应,各原子在反应前后不发生电子的得失,其化学方程式左右各分子之间只存在整数倍的关系,很容易配平。所以,用电脑来配平这一类化学方程式,意义不大。而氧化-还原反应,由于各原子在反应前后发生电子交换,配平时往往很复杂。人们想了很多巧妙的办法来配平这一类化学方程式。根据氧化-还原反应反应前后各离子化合价的变化及电子的得失情况,可对其化学方程式进行配平,这种配平方法称作“电子配平法”。例如,电离水的反应,其化学方程式为:H2OH2O2电离式:2H2eH22O2-)O24e配平后的两个电离式是:4H4e2H22O2O24e从

2、而2H2O=2H2O2显然,这种方法不太适合计算机,因为它涉及到离子化合价的变化、电子的得失等令计算机“头疼”的问题,不宜用来编制计算机程序。因此,我们可采用一些“笨”办法,以避免上述的“技巧”。在化学方程式中,给每一个分子预设一个未知系数,根据每一种元素反应前后物质的量不变的原理,可列出一个方程组,求得这个方程组的解,就是配平后化学方程式的系数。由此可知,用这种方法配平化学方程式,最终可转化为纯数学问题,这正好可以发挥计算机运算速度快的特长,是“好”方法,是可接受的。第一章系统实现原理下面通过一个实例来说明。在化学方程式As2s3+H2O2+(NH4)2CO3(NH4)3AsO4+(NH4)

3、2SO4+CO2+H2O中,有7个分子,左侧3个:As2s3H2O2(NH4)2CO3右侧4个:(NH4)3AsO4(NH4)2SO4CO2H20有六种元素,分别是:As,S,H,O,N,C。它正好符合我们所要求的条件:分子个数二元素个数+1。在每个分子式前添加未知系数:X1As2s3+x2H2O2+X3(NH4)2CO3-x4(NH4)3AsO4+X5(NH4)2SO4+x6CO2+X7H2O只要能求出XiX7的值,问题就解决了。根据反应前后每一种元素物质的量不变的原理,可针对每一个元素列出一个方程:As:2X1=x4S:H:2x2+8x3=12x4+8x5+2x7Q2x2+3x3=4x4+

4、4x5+2x6+x7N:2x3=3x4+2x5C:X3=X6整理、变形后,方程组的形式如下:As:S:H:ON:lC:设未知向量为2 x1-X4=03 x1-X5=02X2+8X3-12X4-8X5-2X7=02X2+3x3-4X4-4X5-2X6-X7=02X3-3x4-2X5=0X3-X6=0X,即X=XIX2X3X4X5X6a一则上述方程组的系数矩阵是:一23A=000028230201- 100-1- 12-8- 4-4- 3-200所以,此方程组写成矩阵的形式就是00000-2-2-100-101AX=Q这是一个有7个未知数,6个方程的齐次线性不定方程组。如果各个方程之间线性无关的话

5、,即各个方程相互独立,这个方程组就有无穷多个实数解。然而,我们想要的是一组无公约数的正整数解,因为配平后的化学方程式各分子的系数不能是分数或小数,也不能是负数,必须是正整数,而且这组正整数之间没有公约数。加上这样的限制条件,上述方程组的解就是唯一的了。如何才能求出这个唯一解呢?显然,方程组的自由未知数的个数为1(自由未知数的个数=未知数的个数-独立方程的个数)。我们不妨令方程组中某一个未知数等于一个正整数,这样的话,原方程组就变成6个未知数,6个独立方程的固定方程组了。这个方程组只有一组唯一的解,我们不妨设这组解对应的解向量是丫。这个解向量的各个元素是任意实数,并非肯定是正整数。但是,根据每一

6、种元素反应前后物质的量不变的原理,它们之间肯定存在着整数倍的关系。也就是说,肯定存在一组正整数,正好是Y的倍数。将这一组正整数通分,使其没有公约数。这样处理以后,就可得到我们所要求的没有公约数的正整数解X。对于上述方程组,为简单起见,可令最后一个未知数X7=1,再移项、整理,把常数项(即X7的系数)移到等号右边,可得如下所示的方程组:As:S:2x1X4=0H:3x1X5=0X2+8x3-12X4-8X5=2x2+3x3-4x4-4x5-2x6=1N:X3-3x4-2X5=0X3X6=0这个方程组的系数矩阵是:A=230000002200008321-10-12-4-300-1-8-4-200

7、00-20_1,常数向量为:B=0012102方程组写成矩阵的形式,就是AX=B这个方程组就是6个方程,6个未知数的固定方程组了,它是可解的。解这个方程组,X5=0.2143,得出Xi=0.07143,X2=1.0000,X3=0.4286,X4=0.1429,%=0.4286。再加上预设的X7=1,就是Y=0.071431.00000.42860.14290.21430.4286事实上,现在已经求得了原不定方程组的一组解,只不过这组解未必就是正整数而已。以后的任务是,想方设法把这一组实数解通通转化为正整数,再使它们没有公约数我们可以这样来做:让这些数(可能是小数,也可能是负数)连续自加,直到

8、它正好达到某一正整数,停止自加,记下它自加的次数,就是它与这个整数相差的倍数。对这组实数解的每个元素都作这样的处理,就可得到一组与实数解元素个数相同的整数。再求得这组整数的最小公倍数R1用m乘以实数解的各个元素,得到的一组数肯定都是正整数,这就是所要求的最终结果。显然,求得的最小公倍数m就是自由未知数的值。本例中,经运算可得出m=14所以一11146X=m*Y=14*Y=236:14一这样就求得了原不定方程组的一个解,而且是一组无公约数的正整数解,符合化学方程式配平的条件。配平后的化学方程式是:As2s3+14H2O26(NH4)2CO3-2(NH4)3AsO40(NH4)2SO446CO24

9、4H2O第二章系统设计有了上述方法,就可以编写程序了。编写程序可分为“两步走”。第一步,读入化学方程式,并对它进行分析,以获得待定系数法的“齐次线性不定方程组”。第二步,解这个不定方程组,得出最后结果。解不定方程组时,又分为两步。首先,令自由未知量=1,得到方程组AX=B用高斯消元法,解这个方程组,求得此方程组的一组唯一实数解。其次,对这组实数解进行“整数化”,得出最终结果。以下是本系统的总结构图。产生最蜷结果:凰题的化学方程式获得线性不定方程组解不定方程组输出结果分析、处理化学方程式解方程组整性拟合格式化结果显示结果读入化图1总结构图2.1 分析、处理化学方程式事实上,化学方程式是一个包含多

10、种字符的字符串。为了配平它,首先要对它进行标识、分析,最后从中“抽出”我们所需要的那个“齐次线性不定方程组”。为了便于标识,可以人为的在化学方程式的末尾加上一个特殊符号,例如“#。这样,任意一个化学方程式中,可能出现的字符就只有八种:英文大写字母AZ英文小写字母az数字09前括号(后括号)加号+连字符一结束标志#分析字符串,是一个很复杂的过程,要用到编译原理中词法分析的一些算法和技巧。以下是分析化学方程式的状态转换图:图1分析化学方程式的状态转换图以下是化学方程式的输入和识别的部分源代码/*输入化学方程式,把它存入字符数组Equation中*/voidGetEquation(charEquat

11、ion)(inti;charc=;for(i=0;c!=#;i+)c=getchar();Equationi=c;Equationi=0;/*从n元二维字符数组Elem中删除重复元素,由函数返回数组的上限值*/intDelElem(charElem3,intn)inti,j,flag;/*chartemp3;*/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个元素与它之前的某个元素相同,则置fla

12、g=1*/for(j=i;jn-1;j+)strcpy(Elemj,Elemj+1);i-;n-;/*将重复元素以后的元素向前移动一位,覆盖重复元素*/returnn;/*识别元素,即把已存入字符数组Equation中的化学方程式中的元素挑选出来,存入二维字符数组Element中,并由函数返回元素个数*/intIdElem(charElements3,charEquation)inti,j=0,k;chara=,b;for(i=0;a!=-;i+)a=Equationi;b=Equationi+1;if(isupper(a)if(islower(b)Elementsj0=a;Elementsj

13、1=b;Elementsi2=0;j+;elseElementsj0=a;Elementsj1=0;j+;k=DelElem(Elements,j);returnk;/*将化学方程式Equation的分子式存入Molecule中,同时把化学方程式左侧的分子个数存入UB1中,右侧分子个数存入UB2中,分子总数存入UB0中。*/voidStoreMol(intUB,charMolecule20,charEquation)inti,j,k;chartemp20;/*储存左边的分子式*/for(i=0,j=0,k=0;Equationi!=-;i+)if(Equationi!=+)tempj+=Equ

14、ationi;elsetempj+=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;elsetempj+=0;j=0;strcpy(Moleculek,temp);k+;tempj=0;strcpy(Moleculek,temp);UB2=k-UB1+1;UB0=k+1;/*传递分子式,改变存储结构。由函数返回该分子所含单体(

15、元素或数字)个数*/intPassMol(charElemMol5,charEquMol20,intn)(inti,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+;elseElemMolj0=EquMolni;ElemMolj1=0;j+;elseif(isdigit(EquMolni)for(k=0;isdigit(EquMolni);k+)ElemMol皿k=EquMolni+;E

16、lemMoljk=0;j+;i-;returnj;/*从化学方程式剥离出对应的线性不定方程组的系数矩阵,存入二维实型数组ModMatrix中。*/intPassDigit(floatModMatrix20,charMolecule20,charElements3,intUN,intEN)inti,j,k,m;charElemMol205;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-

17、1,ElemMolk)if(isdigit(ElemMolk+10)ModMatrixij=atof(ElemMolk+1);/*atof()是数型转换函数(从字符串到浮点型)*/elseModMatrixij=1;)/*右*/for(j=UN1+1;j=UN0;j+)(ModMatrixij=0;/*初始化系数矩阵*/m=PassMol(ElemMol,Molecule,j-1);for(k=0;kb-aikbk=bi,i=k+1,n第二步,回代:bn/ann=Xnnbi2ajXj=Xi,i=n-1,2,1j=t1由上述步骤可以看出,归一化过程每执行一次需要作n-k+1次除法,消去过程每执行

18、一次需要作(n-k+1)(n-k)次乘法。因此,第一步共作一nO1(n-k1)=-n(n1)(2n1)kT6次乘除法。而回代过程需要作.n1(n-k)=-n(n-1)kT2次乘法。所以,高斯消去法总的工作量为1/2c八n(n3n-1)3次乘除法。另外,在归一化过程中,要用akk作除数,因此,当|akk|很小时,会损失精度,并且可能会因为商太大而使计算产生溢出。特别当akk=0时,运算就会中断。为了避免这种情形,在每一次归一化之前,必须增加一个选主元的过程,将绝对值较大的元素交换到主对角线的位置上来。2.2.2 选主元选主元主要有列选主元和全选主元两种。1 .列选主元列选主元简称为列主元。它的基

19、本思想是在变换到第k步时,从第k列的akk以下(包括akk)的各元素中选出绝对值最大者,然后通过行交换将它交换到akk的位置上。在求解线性方程组的高斯消去法中,交换系数矩阵的两行(包括常数向量中的两个相应元素),只相当于两个方程的位置被交换了,因此,列选主元是不影响求解结果的。但是,列选主元还不能保证所选的akk是同一行中的绝对值最大者,因此,采用列选主元后,虽然变换过程不会中断,但其计算过程还是不稳定的。2 .全选主元全选主元简称为全主元。全选主元的基本思想是:当变换到第k步时,从右下角(n-k+1)阶子阵中选取绝对值最大的元素,然后通过行交换和列交换将它交换到akk的位置上。前面提到,在求

20、解线性方程组的高斯消去法的变换过程中,行交换不影响最后的结果。但是,列交换将会导致最后结果中对应未知数的次序混乱。即在进行第i行与第j列的交换后,最后结果中x与Xj的次序也就被交换了。因此,在使用全选主元的高斯消元法时,必须在选主元的过程中记住所进行的一切列交换,以便在最后结果中恢复。以下是本系统中实现全选主元高斯消元法的子函数。/*全选主元高斯消元法,系数矩阵由数组Modulus代入,常数项由数组Const代入,n为未知数个数,方程的解由数组Result返回*/intDGAUSS(floatResult50,floatModulus5050,floatConst50,intn)intk,i,

21、j,strange=0;intl,js50;floatd;/*全选主元,将系数矩阵变换为上三角形矩阵,常数项也作相应变换*/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)returnstrange;/*系数矩阵为奇异方阵,退出*/if(jsk!=k)for(i=1;i=n;i+)SWAP(Modulusik,Modulusijsk);/*列交换*/if(l!=k)for(j=k;j=n;j+)SWAP(Moduluskj,Moduluslj);/*行

22、交换*/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,

23、Resultjsk);return1;2.2.3 整性拟合实数解用高斯消元法求得的结果,与自由未知量组合起来,是原不定方程组的一组实数解。显然,这个结果不符合我们的要求,因为它们不一定是正整数。我们可以想办法使之变成正整数,并且使它们之间没有公约数。根据第一章提到的方法,此处可分两步:先将其转化为正整数,再对它们进行通分,使其没有公约数。这样处理以后,就可得到我们所要求的没有公约数的正整数解X。具体的做法是:第一步,提取解向量Y的某个元素丫让这个数不断的自加,直到正好达到某一正整数。记下它自加的次数,设为h。对y1yn均作这样的处理,可得到一组正整数八jn。第二步,求j1jn的最小公倍数mX=

24、m*Y就可得出最后结果X。实现本算法的源程序如下所示。/*将实型数组InOut整数化,并且使所求得的一组整数无公约数,结果存入实型数组InOut中*/intEnInteger(floatInOut口,intm)(inti,j;intt50;floaty;floattemp50;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=Mu

25、lCommonMultiple(t,m);/*求整型数组t中各元素的最小公倍数*/for(i=1;iFe2O3SO2运行结果如下:请输入化学方程式(#表示结束):FeS2+O2-Fe2O3+SO2#此化学方程式包含了3种元素(即方程个数):FeSO它的左侧有2个分子式:FeS2O2右侧有2个:Fe2O3SO2分子式总数(即未知数个数)是:4对应的系数矩阵是:1 0-202 00-102-3-2方程组的解为:x1=4x2=11x3=2x4=8自由未知量的值:8配平后的化学方程式是:4FeS2+11O2-2Fe2O3+8SO2第四章系统评价本系统有以下几个方面的优点:1 .结构合理,内聚性好。在编

26、写程序的过程中,尽量做到代码的结构化,模块的独立化。程序中各个基本功能,全都用函数来实现,而且没有使用全局变量。非常符合结构化程序设计语言“低耦合,高内聚”的要求。2 .占用内存少,稳定性高前面提到,整个程序中没有全局变量。所以,在程序运行过程中,内存是动态分配的,各个函数的代码“随叫随到,任何一个子函数的变量都没有永驻内存。这样,整个系统占用内存少,在运行过程中就不会发生“内存溢出”的情况,使系统更稳定。3 .算法先进,运算效率高化学方程式是一个包含多种字符的特殊字符串,分析它,有一定的难度。本系统所采用的方法,是高级程序设计语言的编译系统所采用的词法分析算法。这种算法的效率是很高的。解方程

27、组,用全选主元高斯消元法,是最先进的算法之一。但是,缺点也是存在的。1 .外观欠考究,界面不友好。采用C语言作为本系统的编程语言,可以充分发挥C语言功能强大、运行速度快、善于分析字符串的特点。但是,C语言是基于DOS勺操作系统,很难作出考究的外观、友好的界面。2 .系统处于试行阶段,疏漏在所难免此次编制的程序是本系统的第一版,没有经过象普通商业软件那样严格的测试,很可能会存在一些潜在性问题。况且由于时间紧迫,疏漏在所难免。如果以后深入开发本软件,可对本系统进行反复测试,以提高其健壮性和稳定性。致谢在论文写作过程中,刘忠厚老师对我认真辅导,给予全力支持。他在百忙中抽出时间多次修改论文,及时提出好的意见和合理建议,为论文的完成花费了大量的心血,在此表示衷心的感谢。感谢蔡德聪老师,刘燕飞老师,敖丽敏老师等所有在大学四年里对我悉心教诲的老师们。他(她)们严谨的治学态度、深邃幽远的见识令我受益匪浅,永生难忘。谢谢班主任贾景卫老师在“非典”时期的辛勤工作,无论生活、学习,还是为人处事方面都教会了我很多东西,给予我巨大的帮助。感谢论文答辩小组的诸

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论