最新要闻
- 最新资讯:微软或提高Win12升级门槛:SSD成为刚需
- 19.48万元起 国产豪华轿车红旗H6预售:双中置排气着实罕见
- 焦点速看:赵长江:腾势D9新增订单一天破500台!别克GL8危险了
- 【世界播资讯】只差价格了 Redmi新机爆料汇总 1999元起交个朋友?
- 环球动态:市场震荡分化 软件行业红利不断
- 全球快消息!2022年度十大科学辟谣榜出炉:O型血更招蚊子是谣言、变电站很危险?
- 男子爬树看邓紫棋演唱会致手臂骨折 省1千花1万:网友直呼追星也要注意安全
- 华海诚科网上发行最终中签率为0.0363%
- 速读:票房破3亿!新海城电影《铃芽之旅》拿下2023年引进片票房冠军
- 新一轮国内油价将于3月底调整:目前分析大概率下调
- 今日播报!头部车企打架尾部遭殃 恒驰汽车北京仅剩一家门店营业
- 【热闻】95后夫妻摆摊日入9千网友让查税慌了 本人回应:当日是偶然 但生意也不错
- 院士:抗流感特效药“达菲”原料为八角茴香、附加值提升1100多倍
- 口碑并入高德:这是要和美团、抖音拼了?
- 速递!我国首次实现固态氢能发电并网!密度提高20倍
- 讯息:镗削
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点热门:计算机解决高中离子浓度计算
利用简单的化学及编程知识解决一类水溶液中各粒子浓度的计算
化学理论部分
假设氢离子浓度
假设现在有 \(n\) 元酸——\(\ce{H_nAc}\),其每一步电离的平衡常数为 \(K_{a_1},K_{a_2},...,K_{a_n}\)。(尽管 \(n\) 是个非常小的数,还是写成这种较为通用的形式)
那么如果我们知道了当前溶液中的氢离子浓度 \(c(\ce{H})\),和酸根离子(或酸)的浓度 \(c(\ce{H_yAc^{(n-y)-}})\)。可以得出以下结论。
\[c(\ce{H_xAc^{(n-x)-}})=\begin{cases}\frac{c(\ce{H^+})^{x-y}}{\prod_{i=y}^{x}K_{a_{n-i}}}\times c(\ce{H_yAc^{(n-y)-}})\quad x>y\\\frac{\prod_{i=x}^{y}K_{a_{n-i+1}}}{c(\ce{H^+})^{y-x}}\times c(\ce{H_yAc^{(n-y)-}})\quad x(相关资料图)
\[\begin{aligned}\ce{H3PO4&<=>H^+ + H2PO_4^-} \quad K_{a_1}\\\ce{H2PO4^-&<=>H^+ + HPO_4^2-} \quad K_{a_2}\\\ce{HPO4^2-&<=>H^+ + PO_4^3-} \quad K_{a_3}\\\end{aligned}\]于是得出
\[\begin{align}c(\ce{HPO4^{2-}})&=\frac{c(\ce{H^+})}{K_{a_3}}\times c(\ce{PO4^{3-}})\\c(\ce{H2PO4^{-}})&=\frac{c(\ce{H^+})}{K_{a_2}}\times c(\ce{HPO4^{2-}})\\&=\frac{c(\ce{H^+})^2}{K_{a_2}K_{a_3}}\times c(\ce{PO4^{3-}})\\c(\ce{H3PO4})&=\frac{c(\ce{H^+})^3}{K_{a_1}K_{a_2}K_{a_3}}\times c(\ce{PO4^3-})\end{align}\]那么所有存在形式的浓度均可以用 \(c(\ce{PO_4^{3-}})\) 和 \(c(\ce{H^+})\)表示。如果我们用想用 \(c(\ce{H3PO4})\) 来表示,则可以得到 \(c(\ce{PO_4^{3-}})=K_{a_1}K_{a_2}K_{a_3}\times {c(\ce{H^+})^{-3}}\times c(\ce{H3PO4})\)。
不妨设往溶液中加入的磷酸的浓度为 \(c_{总}\),就用 \(c(\ce{PO4^{3-}})\) 作为未知数,利用物料守恒可以得到方程
\[(1+\frac{c(\ce{H^+})}{K_{a_3}}+\frac{c(\ce{H^+})^2}{K_{a_2}K_{a_3}}+\frac{c(\ce{H^+})^3}{K_{a_1}K_{a_2}K_{a_3}})\times c(\ce{PO4^{3-}})=c_{总}\]显然我们如果知道了 \(c(\ce{H^+})\),和 \(c_{总}\),可以轻易地计算出 \(c(\ce{PO4^{3-}})\),进而计算出其他离子的浓度。
那么我们就可以将四种含 \(\ce{P}\) 粒子的浓度随 \(p\ce H\) 变化的图像画出来,这就是在题目中常见的图。
如果溶液中还有其他的酸或碱,其各个离子的浓度也可以根据这种方法计算出来。
考虑电荷守恒
放在实际的溶液中,其电荷一定是守恒的。我们上方只得到了各粒子浓度关于氢离子浓度的函数,正负电荷并不一定守恒。于是我们现在需要计算出一个合适的氢离子浓度,使得溶液中电荷守恒,那么这种情况就是满足的。由于各粒子浓度均非负数,那么我们应该可以证明氢离子浓度的解是唯一的(我没有证明,感觉可能是唯一的)。
程序设计部分
如何计算出氢离子浓度
我们根据电荷守恒,可以得到一个一元高次方程。如果我们尝试整理系数并利用求根公式求解,那么在程序上可能会比较难以实现。
不妨尝试试出氢离子浓度,计算出各阴阳离子的浓度之后,直接比较等式左右电荷绝对值的差,如果这个差的绝对值小于一个数,我们可以认为这个氢离子浓度是正确的。
但是如果按照浓度逐一尝试,每次为尝试的氢离子浓度增加一定的浓度,那么如果我们要保证精度,就需要尝试非常多次。
可以感性理解出正负电荷量差的绝对值随氢离子浓度的变化是一个连贯的曲线,我们的目标是找到这个曲线上的最小值点,这个点函数值为 \(0\)。这个函数上面可能有无数极值点(还是我感觉的,也有可能是单调的,这个时候可以直接使用二分法解决,显然但粒子种类非常多的时候已经很难用手证明是否在整个定义域上都是单调的了),而我们需要找到那个最小值点。这个时候可以考虑使用模拟退火算法(退火是不是本身就是化学名词)。
模拟退火就是比较常规的写法,记得比较上一个位置的答案而不是目前已经得到的最优的答案(很多模拟退火的竞赛题都是直接比较最优的答案,但是这里不行)。
一个精度问题
还是以磷酸举例,如果我们以 \(c(\ce{PO4^{3-}})\) 为中间变量计算,如果 \(c(\ce{H^+})\) 的浓度非常大,那么得到的 \(c(\ce{PO4^{3-}})\) 会非常小,由于默认的小数存储结构精度有限,一些有效数字可能会被直接省略掉,造成较大的精度丢失。那么我们可以在计算之前先找出在一定氢离子浓度下占据主导地位的粒子,然后用直接用它作为中间变量计算。(也许这点误差真的能够忽略不计吧,但是还是在这里写出来吧)
另一个大问题
磷酸 \(K_{a_1}=6.9\times 10^{-3},K_{a_2}=6.2\times 10^{-8},K_{a_3}=4.8\times 10^{-13}\),乘起来是一个非常小的数字,超过了 C 语言所能记录的浮点数精度。这意味着在计算过程中极易出现爆精度的问题,尽管可以采用先乘后除的办法,并且这些极小的数所代表的粒子浓度本身就可以忽略不计,但是还是会在一些玄学的地方带来误差,这样在比较两个浓度都非常小的粒子的时候就不能保证准确性了(我瞎猜说)。
解决的办法就是写自己写记录小数的数据结构(即高精度),但是这会浪费非常多的时间,并转化为一个彻头彻尾的代码问题。
实际上,程序中采用的课本上的平衡常数本身就可能存在着误差,所以在这里我们并不考虑解决这个问题。
一些目前版本的bug
- 对于在实际情况中浓度相同的粒子可能计算出的结果会有细微差异。
- 在我的电脑上运行程序的时候载入会有几秒钟的时间(这确实有点不太正常),可能是代码输入部分的实现问题。我不是专业的程序员,完全不会写 IO,请见谅。
一些省流
\(0.1\ce{mol\cdot L^{-1}}\ce{H3PO4}\) 溶液的计算结果:
pH: 1.6375c(H_3PO_4): 0.076956557415177c(H^+): 0.023043504584859c(H_2PO_4^-): 0.023043380585157c(HPO_4^2-): 0.000000061999666c(OH^-): 0.000000000000434c(PO_4^3-): 0.000000000000000
\(0.1\ce{mol\cdot L^{-1}}\ce{CH3COONa}\) 溶液的计算结果:
pH: 8.8785c(Na^+): 0.100000000000000c(CH_3COO^-): 0.099992441663165c(OH^-): 0.000007559670777c(CH_3COOH): 0.000007558336835c(H^+): 0.000000001322809
\(0.1\ce{mol\cdot L^{-1}}\ce{NH3\cdot H2O}\) 溶液的计算结果:
pH: 11.1247c(NH_3-H_2O): 0.098667174249750c(NH_4^+): 0.001332825750250c(OH^-): 0.001332514123592c(H^+): 0.000000000007505
代码
建立结构体记录每种弱酸或碱。结构体内有根据氢离子浓度计算出对应酸根离子们的浓度的函数。
#include #include #include using namespace std;typedef long double ld;typedef pairttfa;//这个 pair 记录答案中的离子名称及相应的浓度#define mp make_pairconst ld K_w=1e-14;mt19937 gen(chrono::system_clock::now().time_since_epoch().count());uniform_real_distributionrd(0,1);struct basecid{int n;ld c;//n 元酸或碱,以及浓度 cvectorname;//名字,按照电荷数的绝对值从小到大排vectorK;//电离平衡常数bool is_acid;//是酸(1),还是碱(0),如果是碱直接用将氢离子浓度转化成氢氧根离子浓度用同样的方法计算。inline ld getk(int loc,ld c_H){//具体原理已经讲过,系数*该粒子浓度=总离子浓度,其中系数和氢离子及选择的粒子有关,这里求出这个系数ld val=1,bas=1;for(int i=loc-1;i>=0;--i){bas=bas*c_H/K[i];val+=bas;}bas=1;for(int i=loc+1;i<=n;++i){bas=bas*K[i-1]/c_H;val+=bas;}return val;}inline ld e_it(ld c_H,ld c_all){//计算总电子数,c_all 如果为大于 0 则忽略目前结构体内的浓度,而使用这个浓度if(c_all<0)c_all=c;if(!is_acid)c_H=K_w/c_H;int key=0;ld minv=getk(0,c_H);for(int i=1;i<=n;++i){ld now=getk(i,c_H);if(now=0;--i){bas=bas*c_H/K[i];}bas=mid;for(int i=key+1;i<=n;++i){bas=bas*K[i-1]/c_H;val+=i*bas;}return is_acid?-val:val;}inline vector lis_it(ld c_H,ld c_all){//单独又写了一个函数,将对应氢离子浓度下的各离子的浓度得出if(c_all<0)c_all=c;if(!is_acid)c_H=K_w/c_H;int key=0;ld minv=getk(0,c_H);for(int i=1;i<=n;++i){ld now=getk(i,c_H);if(nowlis(n+1);lis[key]={name[key],mid};for(int i=key-1;i>=0;--i){bas=bas*c_H/K[i];lis[i]={name[i],bas};}bas=mid;for(int i=key+1;i<=n;++i){bas=bas*K[i-1]/c_H;lis[i]={name[i],bas};}return lis;}}book[100];struct normal{//在溶液中浓度不变的粒子string name;int e;ld c;inline ld e_it(ld c_all){if(c_all<0)c_all=c;return e*c_all;}};vectorother;vectormix;inline ld e_forall(double c_H){//计算出该氢离子浓度下的电荷数ld val=0;for(auto x:mix)val+=x.e_it(c_H,-1);for(auto x:other)val+=x.e_it(-1);return val+c_H-K_w/c_H;}inline ld SA(){//模拟退火,要记录 lastans。没怎么调参ld loc=1e-7,ans=abs(e_forall(loc)),lasans=ans;for(ld T=1;T>=1e-14;T*=0.995){ld nloc=max(loc+(rd(gen)*2-1.0)*T,(ld)1e-16);ld nval=abs(e_forall(nloc)),der=nval-lasans;//printf("%Lf %Lf %Lf ",nloc,nval,der);if(der<0)lasans=ans=nval,loc=nloc;else if(exp(-der/T)>rd(gen))lasans=nval,loc=nloc/*,printf("accept")*/;//puts("");}//printf("%.15Lf %.15Lf\n",loc,ans);return loc;}inline void initset(){//这个写法可能有些丑陋,可能降低了效率book[1].n=1,book[1].is_acid=1;book[1].K.push_back(1.75e-5);book[1].name.push_back("CH_3COOH");book[1].name.push_back("CH_3COO^-");book[2].n=1,book[2].is_acid=0;book[2].K.push_back(1.8e-5);book[2].name.push_back("NH_3-H_2O");book[2].name.push_back("NH_4^+");book[3].n=2,book[3].is_acid=1;book[3].K.push_back(4.5e-7);book[3].K.push_back(4.7e-11);book[3].name.push_back("H_2CO_3");book[3].name.push_back("HCO_3^-");book[3].name.push_back("CO_3^2-");book[4].n=3,book[4].is_acid=1;book[4].K.push_back(6.9e-3);book[4].K.push_back(6.2e-8);book[4].K.push_back(4.8e-13);book[4].name.push_back("H_3PO_4");book[4].name.push_back("H_2PO_4^-");book[4].name.push_back("HPO_4^2-");book[4].name.push_back("PO_4^3-");book[5].n=2,book[5].is_acid=1;book[5].K.push_back(1.4e-2);book[5].K.push_back(6.0e-8);book[5].name.push_back("H_2SO_3");book[5].name.push_back("HSO_3^-");book[5].name.push_back("SO_3^2-");book[6].n=1,book[6].is_acid=1;book[6].K.push_back(4.0e-8);book[6].name.push_back("HClO");book[6].name.push_back("ClO-");}inline bool cmp(ttfa x,ttfa y){//这个写法比较丑陋,但是我并不会比较高级的写法return x.second==y.second?x.firsty.second;}void forehead(){cout<<"English is used to avoid compatibility issues! (1.0 by BSE)"<>opt;if(opt=="auto"){int num;ld c;cin>>num>>c;basecid ac=book[num];ac.c=c;mix.push_back(ac);}else if(opt=="fixed"){normal fx;cin>>fx.name>>fx.e>>fx.c;other.push_back(fx);}else if(opt=="new"){basecid ac;cin>>ac.n>>ac.is_acid;for(int i=0;i>K;ac.K.push_back(K);}for(int i=0;i<=ac.n;++i){string tmp;cin>>tmp;ac.name.push_back(tmp);}cin>>ac.c;mix.push_back(ac);}else if(opt=="end")break;else cout<<"Non-conforming input!"<each;each.push_back(mp("H^+",c_H));each.push_back(mp("OH^-",K_w/c_H));for(auto ac:mix){vectortmp=ac.lis_it(c_H,-1);for(auto ppair:tmp){each.push_back(mp(ppair.first,ppair.second));}}for(auto li:other){//这一步虽然可以在输入的时候完成,但是还是在这里写比较清晰一些each.push_back(mp(li.name,li.c));}sort(each.begin(),each.end(),cmp);cout<<"pH: "<
后记
可能会改进一下算法,提升一下精度。最重要的是改良一下输入。
另外如果想要输入其他弱酸或弱碱,请按照下面的形式,看代码应该能知道怎么输入,下例子为 $ 0.1 \ce{mol\cdot L^{-1}}\ce{H2C2O4}$ 溶液。
new 2 15.6e-2 1.5e-4H_2C_2O_4 HC_2O_4^- C_2O_4^2-0.1
输出为
pH: 1.2836c(H^+): 0.052049217002032c(HC_2O_4^-): 0.051750936225208c(H_2C_2O_4): 0.048099923386503c(C_2O_4^2-): 0.000149140388288c(OH^-): 0.000000000000192
先写这么多吧,还有好多想写的没写。如果错误和漏洞请多多反馈,谢谢观看。\(\rm by \; BigSmall\_En\)
关键词:
Spring源码核心剖析
焦点热门:计算机解决高中离子浓度计算
最新资讯:微软或提高Win12升级门槛:SSD成为刚需
19.48万元起 国产豪华轿车红旗H6预售:双中置排气着实罕见
焦点速看:赵长江:腾势D9新增订单一天破500台!别克GL8危险了
【世界播资讯】只差价格了 Redmi新机爆料汇总 1999元起交个朋友?
环球动态:市场震荡分化 软件行业红利不断
【全球独家】你不知道的ubuntu DIY发行版
全球快消息!2022年度十大科学辟谣榜出炉:O型血更招蚊子是谣言、变电站很危险?
男子爬树看邓紫棋演唱会致手臂骨折 省1千花1万:网友直呼追星也要注意安全
华海诚科网上发行最终中签率为0.0363%
专家解读消费基础设施纳入公募REITs试点:推动消费扩容提质 并非简单为房企提供资产处置渠道
天天最新:主板注册制新股开启申购 投资者打新须适应新规则
今日观点!国际金融市场早知道:3月27日
速读:票房破3亿!新海城电影《铃芽之旅》拿下2023年引进片票房冠军
新一轮国内油价将于3月底调整:目前分析大概率下调
今日播报!头部车企打架尾部遭殃 恒驰汽车北京仅剩一家门店营业
读Java性能权威指南(第2版)笔记29_线程和同步性能下
【热闻】95后夫妻摆摊日入9千网友让查税慌了 本人回应:当日是偶然 但生意也不错
【环球新视野】ctf反序列化练题
全球新资讯:win32com操作word 第十五 Find接口的使用
院士:抗流感特效药“达菲”原料为八角茴香、附加值提升1100多倍
口碑并入高德:这是要和美团、抖音拼了?
速递!我国首次实现固态氢能发电并网!密度提高20倍
讯息:镗削
当前短讯!转注是什么_转注是什么意思
【Visual Leak Detector】QT 中 VLD 输出解析(三)
快报:北大"韦神"出难题:没想到 初二学生给出标准答案!ChatGPT被难倒
环球关注:MM32 SPIN MCU 电机 FOC 驱动 风机无传感器弦波驱动篇应用笔记
前端设计模式——路由模式
【全球新视野】Mysql 查询指定节点的所有子节点
当前动态:NVIDIA显卡突然解锁视频编码限制:9年前老卡欢呼雀跃
苹果自动驾驶数据曝光:2个月16起车祸
视觉SLAM中的三角化
计算机专业规划
最资讯丨青春期教育怎么写_青春期教育资料
胖东来回应给员工设超5000元委屈奖:鼓励做正确的事情
环球快资讯:PTA OOP第一次总结性作业
快消息!IO多路复用形象举例
新一代Java高性能构建工具Maven-mvnd【实践可行版】
全球短讯!老人的屋子里怎么总有一股怪怪的味道?小心这四种
最资讯丨AMD锐龙7000平台终于要便宜了!砍掉又贵又没用的PCIe 5.0
看热讯:gomock优化diff展示
即时:Xcode的Search Paths配置
天天速读:漫威超级大反派翻车!《蚁人3》男演员乔纳森梅杰斯被捕:攻击妇女
世界新消息丨深圳一立体车库禁停比亚迪 车主:赤裸裸歧视
环球头条:NAS容量告急 但没空余硬盘位怎么办?群晖教你换上新硬盘
天天视讯!煜邦电力: 关于向不特定对象发行可转换公司债券的审核问询函回复及募集说明书等申请文件更新财务数据的提示性公告
热门:JS 做一个简单的 Parser
【全球新视野】SCO音频采集
骁龙7+处理性能加持:Redmi Note 12 Turbo拍照加速50%
李彦宏:百度文心一言和ChatGPT差距也就一两个月
每日消息!虚幻5再次炸场!1部iPhone搞定3A大作级动作捕捉 游戏行业要变天
【全球快播报】高校回应考生因航班延误错过复试:通知合规 可按流程重新参加
天天视点!中国火箭回收新进展:每年可节省十几亿元
快看点丨yolov5训练自己的数据集
环球关注:有监督学习——决策树、集成学习
每日播报!定时任务的路径问题
视焦点讯!支持Win7运行最后版本:U盘软件Rufus 3.22正式发布
女子家中开氛围灯外面看如同着火 引来消防员场面十分尴尬
信息:003至薄套壁 杰士邦避孕套0.66元/枚狂促
世界热讯:永安林业:副董事长辞职
今日快看!简单部署halo博客
微速讯:Qt源码阅读(二) moveToThread
AES之CryptoJS加密与C#解密
环球观速讯丨肝帝玩家!《暗黑破坏神4》公测玩家达成全职业满级
男子高速奇葩操作:头上竟然套了一个“车顶”
热点评!股票除权日在什么时候
【环球新视野】软件测试--详细判断电话号码
前端设计模式——计算属性模式
世界速递!PLG SaaS 案例:如何实践外链自动增长策略?
需求分析报告(软件项目)
每日播报!Android中常见的线程池
环球观焦点:阿什莉动捕演员庆祝《生化危机4:重制版》发售 身穿黑丝超吸睛
今日精选:网络爽文改编 《赘婿》动画定档4月23日B站开播
全球球精选!加拿大旅游团费_加拿大旅游费用
小米顶级自研技术!Redmi Note 12 Turbo用上小米影像大脑
世界观点:.NET6+Quartz实现定时任务
当前观察:logback的使用和原理
【新视野】GPT已长出眼睛耳朵 周鸿祎:人工智能将会产生意识
环球看热讯:状态观测器(一)
看点:苏州天使母基金合作子基金接连完成投资
曹德旺谈人工智能:能做饭吃吗?如果大家都去研究会饿死
当前看点!南方新一轮强降雨将上线!北方大部气温“狂飙” 最高飙到25度
今日观点!12款随便挑 太平鸟印花T恤清仓:到手69元
全球观热点:苹果WWDC 2023日期曝光!iOS 17首秀来了:或不再支持iPhone X/8
广东突降冰雹 多车被砸毁容!保险给赔吗?
事关出生证明、免税购物、高铁新路线!4月一大波新规来了
精选!AMD新一代APU曝光:大小核架构终于上了
动态:我国首次实现固态氢能发电并网,“绿电”与“绿氢”灵活转换
易烊千玺代言!九号电动两轮车国内出货突破150万辆
转型电动化 韩系车在中国还有救吗?
老人故意推倒摩托车案胜诉 老人儿子需赔1.6万!车主回应
全球关注:读Java性能权威指南(第2版)笔记28_线程和同步性能中
速讯:孤芳自赏是哪一期蒙面唱将
【全球热闻】“韩国宾利”能拿下中国人吗?
焦点观察:票房破40亿中国影史第10!《流浪地球2》4月14日上线咪咕视频
焦点快看:叙利亚外交部谴责美国对叙发动敌对行动
使用 Linux dd 命令测试磁盘读写性能
国际短信平台接口调用的方法步骤,简单5步快速教程