这是一个基于MATLAB整数规划功能的小软件

化学方程式配平目录

  • 1 效果展示
  • 2 程序原理
  • 3 完整代码
1 效果展示

输入反应物、生成物后点击按钮即可配平(注意大小写):

当前后所含元素不匹配,或者反应物生成物未填写时,会显示物质不会凭空出现或消失这句话。


2 程序原理

配平主要分为以下结果步骤

1 确定元素列表
即确定反应物和生成物一共拥有哪些元素
例如:
反应物:‘Mg(HCO3)2,Ca(OH)2’
生成物:‘CaCO3,H2O,MgCO3’
经过运算得出公有元素:
{‘C’} {‘Ca’} {‘H’} {‘Mg’} {‘O’}

2 反应物及生成物分割
就是将输入的字符串切割成一个个字符串:
例如:
输入:‘Mg(HCO3)2,Ca(OH)2’
输出:{‘Ca(OH)2’} {‘Mg(HCO3)2’}

3 构建各个物质的元素出现次数矩阵
矩阵的第i行第j列即为第i种元素在第j种物质中出现的次数
例如:
输入元素列表:{‘C’} {‘Ca’} {‘H’} {‘Mg’} {‘O’}
输入反应物列表:{‘Ca(OH)2’} {‘Mg(HCO3)2’}

输出次数矩阵

4 整数规划解线性方程组
例如:
反应物次数矩阵:

生成物次数矩阵:

需要求解方程组基础矩阵:

只需令:

由于矩阵不一定为方形,故采用整数规划的方式求解,调用MATLAB中intlinprog函数求解如下方程组:

xi即为所求比例系数


注:
感谢 蛋总的快乐生活 提醒,matlab可进行等号约束的整数规划,实际求解方程组为:



因此代码中57-60行内容:

A=[timesMat;-timesMat];
b=zeros(size(timesMat,1)*2,1);
lb=ones(size(timesMat,2),1);
[x,~,~]=intlinprog(f,ic,A,b,[],[],lb,[]);

可更改为:

Aeq=timesMat;
beq=zeros(size(timesMat,1),1);
lb=ones(size(timesMat,2),1);
[x,~,~]=intlinprog(f,ic,[],[],Aeq,beq,lb,[]);

3 完整代码
function balanceEquation
%使用实例:
%=========================================
%反应物:Mg(HCO3)2,Ca(OH)2
%生成物:CaCO3,H2O,MgCO3
%配平:Ca(OH)2+Mg(HCO3)2==CaCO3+2H2O+MgCO3global beFig
global reactantLabel reactantEditfield
global productLabel productEditfield
global reactionButton beLabel
global resultEditfieldbeFig=uifigure('units','pixels',...'position',[10 400 400 210],...'Numbertitle','off',...'menubar','none',...'resize','off',...'name','化学方程式配平器',...'color',[1,1,1].*0.98);
reactantLabel=uilabel(beFig,'Text','  反应物','HorizontalAlignment','left',...'BackgroundColor',[0,0.49,0.76],'FontColor',[1 1 1],'FontWeight','bold','Position',[10,170,140+230,30],'FontSize',13);
reactantEditfield=uieditfield(beFig,'Value','','Position',[10+52,170,95+230,30]);
productLabel=uilabel(beFig,'Text','  生成物','HorizontalAlignment','left',...'BackgroundColor',[0,0.49,0.76],'FontColor',[1 1 1],'FontWeight','bold','Position',[10,130,140+230,30],'FontSize',13);
productEditfield=uieditfield(beFig,'Value','','Position',[10+52,130,95+230,30]);reactionButton=uibutton(beFig,'Text','配平方程式','BackgroundColor',[0.31 0.58 0.80],'FontColor',[1 1 1],...'FontWeight','bold','Position',[10,70,95,30],'FontSize',13,'ButtonPushedFcn',@reactionFcn);
beLabel=uilabel(beFig,'Text',' 使用“,”或“;”隔开反应物及生成物,配平结果如下','HorizontalAlignment','left',...'BackgroundColor',[0.95 0.95 0.95],'Position',[110,70,280,30],'FontSize',12.5,'FontColor',[0.35 0.35 0.35],'FontWeight','bold');resultEditfield=uieditfield(beFig,'Value','','Position',[10,10,140+240,50],'Editable','off');%reactionFcn:调用主函数,替换结果展示框信息function reactionFcn(~,~)reactant=reactantEditfield.Value;product=productEditfield.Value;result=mainFcn(reactant,product);resultEditfield.Value=result;end%mainFcn:主函数,将各处理函数结合,并调用MATLAB整数规划功能function result=mainFcn(reactant,product)if ~(isempty(reactant)||isempty(product))elementList=elementDetection([reactant,product]);materialSet_r=materialDection(reactant);materialSet_p=materialDection(product);timesMat_r=getTimesMat(elementList,materialSet_r);timesMat_p=getTimesMat(elementList,materialSet_p);if ~(any(~sum(timesMat_r,2))||any(~sum(timesMat_p,2)))timesMat=[timesMat_r,-timesMat_p];f=ones(1,size(timesMat,2));ic=1:size(timesMat,2);A=[timesMat;-timesMat];b=zeros(size(timesMat,1)*2,1);lb=ones(size(timesMat,2),1);[x,~,~]=intlinprog(f,ic,A,b,[],[],lb,[]);result='';for ir=1:length(materialSet_r)if round(x(ir))~=1result=[result,num2str(x(ir))];endresult=[result,materialSet_r{ir},'+'];endresult(end)=[];result=[result,'=='];for ip=1:length(materialSet_p)if round(x(ip+length(materialSet_r)))~=1result=[result,num2str(x(ip+length(materialSet_r)))];endresult=[result,materialSet_p{ip},'+'];endresult(end)=[];elseresult='物质不会凭空出现或消失';endelseresult='物质不会凭空出现或消失';endend%getTimesMat:主函数,获取各种物质的各种元素出现次数function timesMat=getTimesMat(elementList,materialSet)timesMat=zeros(length(elementList),length(materialSet));for i=1:length(elementList)for j=1:length(materialSet)timesMat(i,j)=elementOccurrence(materialSet{j},elementList{i});endendend%elementOccurrence:计算反应物生成物总共含有哪些元素function times=elementOccurrence(string,element)elementPos=regexp(string,element);elementPos=elementPos+length(element)-1;lowerPos=string~=upper(string);for i=length(elementPos):-1:1if elementPos(i)~=length(string)&&lowerPos(elementPos(i)+1)elementPos(i)=[];endendnumberPos=string<=57&string>=48;earSet_L=string=='('|string=='(';earSet_R=string==')'|string==')';earSet_LL=string=='['|string=='[';earSet_RR=string==']'|string==']';times=0;for i=elementPostimesLayer1=1;timesLayer2=1;timesLayer3=1;if (i~=length(string))&&numberPos(i+1)notNumberPos=find([~numberPos,1]);notNumberPos=notNumberPos(notNumberPos>i);notNumberPos=notNumberPos(1);timesLayer1=str2num(string(i+1:notNumberPos-1));end earLPos=find(earSet_L);earRPos=find(earSet_R);earLPos(earLPos>i)=[];earRPos(earRPos<i)=[];if (~isempty(earLPos))&&(~isempty(earRPos))&&(~isempty(earLPos(end)))&&(~isempty(earRPos(1)))j=earRPos(1);if (j~=length(string))&&numberPos(j+1)notNumberPos=find([~numberPos,1]);notNumberPos=notNumberPos(notNumberPos>j);notNumberPos=notNumberPos(1);timesLayer2=str2num(string(j+1:notNumberPos-1));endendearLLPos=find(earSet_LL);earRRPos=find(earSet_RR);earLLPos(earLLPos>i)=[];earRRPos(earRRPos<i)=[];if (~isempty(earLLPos))&&(~isempty(earRRPos))&&(~isempty(earLLPos(end)))&&(~isempty(earRRPos(1)))k=earRRPos(1);if (k~=length(string))&&numberPos(k+1)notNumberPos=find([~numberPos,1]);notNumberPos=notNumberPos(notNumberPos>k);notNumberPos=notNumberPos(1);timesLayer3=str2num(string(k+1:notNumberPos-1));endendtempNum=timesLayer1*timesLayer2*timesLayer3;times=times+tempNum;end end%materialDection:将反应物或生成物分割function materialSet=materialDection(string)strtrim(string);sep=string==' '|string==','|string==';'|string=='·'|string=='、'|string==','|string==';';deletePos=[0 diff(sep)]==0&sep;string(deletePos)=[];sep(deletePos)=[];materialSet(sum(sep)+1)={[]};sepPos=[-1,find(sep)-1,length(string)];for i=2:length(sepPos)tempStr=string(sepPos(i-1)+2:sepPos(i));tempIndex=find(~(tempStr<=57&tempStr>=48));tempIndex=tempIndex(1);tempStr(1:tempIndex-1)=[];materialSet(i-1)={tempStr};end materialSet=unique(materialSet);endfunction elementSet=elementDetection(string)CHAR.upper=string~=lower(string);CHAR.notLetter=string==lower(string)&string==upper(string);elementSet(sum(CHAR.upper))={[]};for i=find(CHAR.upper)endingIndexs=find([CHAR.notLetter|CHAR.upper,1]);endingIndexs=endingIndexs(endingIndexs>i);endingIndexs=endingIndexs(1);elementStr=string(i:endingIndexs-1);elementSet(sum(CHAR.upper(1:i)))={elementStr};end elementSet=unique(elementSet);endend

matlab 化学方程式配平相关推荐

  1. 用python实现化学方程式配平

    化学方程式配平是指调整化学反应的化学方程式,使得反应中所有的化学元素的原子数目在反应开始和反应结束时相等. 下面是一个简单的 Python 代码,用于配并化学方程式: ``` python 输入化学方 ...

  2. 【自己的小玩具程序】化学方程式配平【测试中】【未完成】

    化学元素周期表(Element.txt): 1    H    氢    1 2    He    氦    4 3    Li    锂    7 4    Be    铍    9 5    B  ...

  3. 有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)

    题目要求 P1994题目链接 分析 我太菜了,亏得我高中时期还虐(or被虐)生化,如今多年过去竟然没分析出来坑点,我太菜了. 我开始盲目认为"元素守恒",所以对HHH原子数求和, ...

  4. CCF 2019-12 第三题 化学方程式配平(100分)

    题解: 字符串模拟   题目意思很明确就是判断化学方程式是否配平. 基本思路:就是对化学方程式左边和右边的元素进行计数,然后判断所有的元素的数量是否相等即可.   第一步:对字符串进行拆分       ...

  5. ccf化学方程式配平检验

    样例输入: 11 H2+O2=H2O 2H2+O2=2H2O H2+Cl2=2NaCl H2+Cl2=2HCl CH4+2O2=CO2+2H2O CaCl2+2AgNO3=Ca(NO3)2+2AgCl ...

  6. Day9 化学方程式配平

    该题的难点在于括号的嵌套,如Na6((OH)(OH)2)3,比如OH在跳出嵌套之后需乘以紧接着其外的嵌套下标,我的解法是先一遍处理以下找到每个左括号和与之配置的右括号的位置,然后使用递归,每遇到左括号 ...

  7. Python趣用—配平化学方程式

    不知不觉已经毕业多年了,不知道大家是否还记得怎么配平化学方程式呢?反正小编我是已经记不太清了,所以今天的文章除了分享如何用python配平化学方程式,顺带着还会复习一些化学方程式的知识,希望广大化学爱 ...

  8. Matlab配平操作trim

    参考:Matlab配平函数trim 1.simulink模型 2. trim函数 iy:对应序号 options(10):迭代计算次数

  9. 配平化学方程式的C++代码实现

    配平化学方程式的C++代码实现 纪念一下我今天写过了 20171006. (去年的这个时候我就有了这个大胆的想法, 当时的思路是:字符串处理->暴力搜系数,可是太年轻写不对,我那会还是个只会模拟 ...

  10. 用Python配平化学方程式

    可以使用 Python 的第三方库 Pybel 来配平化学方程式. 首先,需要安装 Pybel,可以使用以下命令进行安装: pipinstall pybel

最新文章

  1. java设置可信任站点_通过网页修改activex安全设置,添加信任站点,禁用弹出窗口阻止程序...
  2. 同域内测试蠕虫的一种方法
  3. jquery中$.post()方法的简单实例
  4. 【MFC】具有提示功能的工具栏
  5. 树莓派编译一个C程序
  6. Kilim实现浅析(一)
  7. 逍遥模拟器配置burpsuite抓包环境
  8. 遍历strs数组,并判断数组中每一个元素的长度, * 将长度为偶数的元素和长度为奇数的元素分别存放在两个集合中,
  9. boost stacktrace堆栈打印
  10. ASP.NET Web API简单学习
  11. sql 过滤空值_图解 SQL,这简直太形象了吧!
  12. C#中,两个事件的叠加,结果会如何?
  13. POJ 1365 Prime Land
  14. SQL Server里的闩锁介绍
  15. 电脑同时安装python2和3_电脑上同时安装Python2和Python3
  16. 用什么软件测试固态硬盘坏没坏,SSD能用多久在哪看 检测固态硬盘寿命方法
  17. Windows中如何对电脑硬盘进行分区
  18. 2022高仿twitter社区推特PHP源码修复版
  19. iOS开发之自定义的framework添加第三方framework,lipo和ar命令看.o文件
  20. Google map API3 标注、添加事件、地图查询

热门文章

  1. 转载:凯明事件背后:TD的煎熬
  2. 电脑键盘注册表已损坏导致无法输入信息的修复方式
  3. 如何批量将 jpg 图片转换为 png 格式
  4. 适用于 Linux 系统的 11 款图像查看器
  5. python爬虫实战(七) 爬取B站柯南弹幕+Gephi绘制人物画像
  6. 荣耀9igoogle模式_将您的iGoogle主页导出到另一个帐户
  7. python爬虫代理ip
  8. python爬虫 requests使用代理ip
  9. 2022年全球与中国一次性内窥镜市场现状及未来发展趋势
  10. 计算机行业的未来10年发展前景,未来10年,这4大工作就业前景好,发展前途超过公务员...