一、编程语言的选择
能完成数字矿床模型专家系统的软件实现的编程语言必须满足计算能力强、描述能力强、可视化能力强、兼容性和移植性强的特点。
Visual C++是Microsoft公司杰出的开发工具,满足上述特点,同时Microsoft公司的Office系列产品同时作为COM组件,与Visual C++提供了无缝连接。
Dephi是Borland公司杰出的开发工具,满足上述特点,丰富的控件 *** 作简单,有很大的优势。
综合考虑,决定利用Visual C++作为数字矿床模型专家系统开发工具。
二、知识库数据结构
(一)地质事实数据结构
每一个地质事实是推理树上的一个结点,每个结点是类CNode的一个实例。
CNode
{
数据对象:
strNote含义:结点的中文解释。
sName含义:结点的名称;
nType含义:结点的类型。取值-1表示该结点为顶极结点或根,取值0表示该结点为分支结点或分叉,取值>1表示该结点为终端结点或叶子。
fUnderPro含义:结点的后验概率值,也就是推理过程中的修正概率值,随着推理过程在时间上的延续而不断修正直至不再变化为止。顶极结点的后验概率值是推理结果的体现。
fPrePro含义:顶极结点、分支结点的先验概率值。这是一个由领域专家给出的经验值。
fReliability含义:终端结点的可信度值,取值范围是-5至5的11个整数。这是一个用户在一定的观察下提供给系统的主观值。
IsSelected含义:结点是否被激活的标志信息。顶极结点或分支结点的先验概率值一旦发生变化,则该结点激活标志是TRUE,终端结点一旦被选中,则该结点激活标志是TRUE;否则该结点激活标志是FALSE。
基本 *** 作:
CNode(name,type,prepro,reliability)
*** 作结果:构造一个名称为name,类型为type,先验概率值为prepro,可信度值为reliability的结点。
~CNode( )
初始条件:相应结点已经存在。
*** 作结果:销毁相应结点。
setName(name)
初始条件:相应结点已经存在。
*** 作结果:设置结点的名称为name。
setNote(note)
初始条件:相应结点已经存在。
*** 作结果:设置结点的中文解释为note。
setType(type)
初始条件:相应结点已经存在。
*** 作结果:设置结点的类型为type。
setPrePro(prepro)
初始条件:相应结点已经存在。
*** 作结果:设置结点的先验概率值为prepro。
setReliability(re)
初始条件:相应结点已经存在。
*** 作结果:设置结点的可信度值为re。
setUnderPro(underpro)
初始条件:相应结点已经存在。
*** 作结果:设置结点的后验概率值为underpro。
setStatus(selected)
初始条件:相应结点已经存在。
*** 作结果:设置结点的激活标志为selected。
getName( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的名称。
getNote( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的中文解释。
getType( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的类型。
getPrePro( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的先验概率值。
getReliability( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的可信度值。
getUnderPro( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的后验概率值。
getStatus( )
初始条件:相应结点已经存在。
*** 作结果:返回结点的激活状态。
}
(二)推理规则数据结构
每一条推理规则就是关联结点之间的一个二元关系。每一个二元关系是类CRule的一个实例。
CRule
{
数据对象:
ruleName含义:规则的名称。
premiseNode含义:规则的前件。
actionNode含义:规则的结论。
LS含义:规则的充分性度量值。这是一个由领域专家给出的经验值。这个值反映的是前件的出现对结论为真的影响程度,取值范围[1,+∞),这个值离1越远表示越充分。
LN含义:规则的必要性度量。这是一个由领域专家给出的经验值。这个值反映的是前件不存在时对结论为真的影响程度,取值范围(0,1],这个值离1越远表示越必要。
IsActive含义:规则的激活标志。一旦规则被使用,激活标志是 TRUE,否则是FALSE。
基本 *** 作:
CRule( )
*** 作结果:构造一个规则。
~CRule( )
初始条件:相应的规则已经存在。
*** 作结果:销毁相应规则。
setMember(name,premise,action,Ls,Ln)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的名称为name,前件为premise,结论为action,充分性度量值为Ls,必要性度量值为Ln。
setName(name)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的名称为name。
setPremise(premise)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的前件为premise。
setAction(action)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的结论为action。
setLs(ls)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的充分性度量值为ls。
setLn(ln)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的必要性度量值为ln。
SetStatus(status)
初始条件:相应的规则已经存在。
*** 作结果:设置相应规则的激活标志为status。
getRuleName( )
初始条件:相应结点已经存在。
*** 作结果:返回相应规则的名称。
getPremise( )
初始条件:相应结点已经存在。
*** 作结果:返回相应规则的前件。
getAction( )
初始条件:相应结点已经存在。
*** 作结果:返回相应规则的结论。
getLS( )
初始条件:相应结点已经存在。
*** 作结果:返回相应规则的充分性度量值。
getLN( )
初始条件:相应结点已经存在。
*** 作结果:返回相应规则的必要性度量值。
getStatus( )
初始条件:相应结点已经存在。
*** 作结果:返回相应规则的激活标志。
};
(三)主要变量
矿床模型数 int m_Mode 1 Num;
地质事实结点数 int g_iNodeNum;
地质事实结点指针 CNode*g_pNode;
每一种矿床模型推理规则数 int*m_pRule-Num;
推理规则二重指针 CRule**m_ppRule。
三、推理模型的软件实现
数字矿床模型专家系统推理流程如图6-14。
图6-14 数字矿床模型专家系统推理流程图
(一)正向推理流程
图6-15是数字矿床模型专家系统正向推理流程图。正向推理部分代码释义如下:
1.解析析取式
strPremise=m_ppRule[k][i].getPremise( );
ipor=strPremise.Find(".OR.");
if(ipor>-1){
qq=0;
for(p=0;p<strPremise.GetLength( );p++)
if(strPremise.GetAt(p)==ˊ.ˊ)
qq++;
qq/=2;
num=qq;
CString*pstr=new CString[num+1];
qq=0;
p=0;
r=0;
strPremise+=ˊ.ˊ;
while(p<strPremise.GetLength( )){
if(strPremise.GetAt(p)==ˊ.ˊ){
pstr[qq]=strPremise.Mid(r,p-r);
qq++;
图6-15 数字矿床模型专家系统正向推理流程图
p+=4;
r=p;
}
else
p++;
}
imax=-6.0 f;
flg=TRUE;
for(mm=0;mm<=num;mm++){
nn=0;
while(flg&&nn<m iNodeNum){
if(g_pNode[nn].getStatus( )
g_pNode[nn].getName( )==pstr[mm]){
if(g_pNode[nn].getReliability( )>imax){
imax=g_pNode[nn].getReliability( );
strPremise=g_pNode[nn].getName( );
}
flg=FALSE;
}
nn++;
}
}
delete[]pstr;
}
2.前件为叶子结点的推理
if(g_pNode[j].getType( )>=1){
ph=g_pNode[l].getPrePro( );
oh=computeP2O(ph);
ces=g_pNode[j].getReliability( );
phs=0.0 f;
if(ces>0.0){
phe=float(ls*oh/(1.0+ls*oh));
phs=float(ph+(phe-ph)*ces*0.2);
}
else{
ph_e=float(ln*oh/(1.0+ln*oh));
phs=float(ph_e+(ph-ph_e)*(ces*0.2+1.0));
}
ohs=computeP2O(phs);
if(g_pNode[l].getUnderPro( )==0.0)
g_pNode[l].setUnderPro(phs);
else
g_pNode[l].setUnderPro(
computeO2P(
computeP2O(
g_pNode[l].getUnderPro( )
)
*ohs/oh
)
);
}
3.前件为非叶子结点的推理
if(g_pNode[j].getType( )==0){
pe=g_pNode[j].getPrePro( );
pes=g_pNode[j].getUnderPro( );
ph=g_pNode[l].getPrePro( );
oh=computeP2O(ph);
phs=0.0 f;
if(pes>=pe){
phe=float(ls*oh/(1.0+ls*oh));
phs=float(ph+(phe-ph)*(pes-pe)/(1.0-pe));
}
else{
ph_e=float(ln*oh/(1.0+ln*oh));
phs=float(ph_e+(ph-ph_e)*pes/pe);
}
if(g_pNode[l].getUnderPro( )==0.0)
g_pNode[l].setUnderPro(phs);
else{
float ohs=computeP2O(phs);
g_pNode[l].setUnderPro(
computeO2P(
computeP2O(
g_pNode[l].getUnderPro( )
)
*ohs/oh
)
);
}
}
4.BP模型或典型铜矿匹配出发的推理
if(g_pNode[i].getName( )=="bp"∣∣g_pNode[i].getName( )=="typical"){
if(g_pNode[i].getNote( )==g_pNode[remember].getName( )){
float PH=g_pNode[remember].getPrePro( );
float OH=computeP2O(PH);
float CES=5.Of;
BOOL flags=TRUE;
int ffff=0;
float LS,LN;
while(flags&&ffff<m pRuleNum[k]){
if(m_ppRule[k][ffff].getPremise( )==g_pNode[i].getName( )
&&m_ppRule[k][ffff].getAction( )==g_pNode[remember].getName( )){
m_ppRule[k][ffff].setStatus(TRUE);
LS=m_ppRule[k][ffff].getLS( );
LN=m_ppRule[k][ffff].getLN( );
flags=FALSE;
}
ffff++;
}
float PHE=float(LS*OH/(1.0+LS*OH));
float PHS=float(PH+(PHE-PH)*CES*0.2);
float OHS=computeP2O(PHS);
if(g_pNode[remember].getUnderPro( )==0.0){
g_pNode[remember].setUnderPro(PHS);
}
else{
g_pNode[remember].setUnderPro(
computeO2P(
computeP2O(
g_pNode[remember].getUnderPro( )
)
*ohs/oh
)
);
}
}
}
(二)反向推理流程
图6-16是数字矿床模型专家系统反向推理流程图。反向推理部分代码释义如下:
1.抽取未激活的相关地质事实(含析取式)
if(l=strPremise.Find(".OR.")>-1){
qq=0;
for(p=0;p<strPremise.GetLength( );p++)
if(strPremise.GetAt(p)==ˊ.ˊ)
图6-16 数字矿床模型专家系统反向推理流程图
qq++;
qq/=2;
num=qq;
CString*pstr=new CString[num+1];
qq=0;
p=0;
r=0;
strPremise+=ˊ.ˊ;
while(p<strPremise.GetLength( )){
if(strPremise.GetAt(p)==ˊ.ˊ){
pstr[qq]=strPremise.Mid(r,p-r);
qq++;
p+=4;
r=p;
}
else
p++;
}
for(mm=0;mm<=num;mm++){
for(k=0;k<g iNodeNum;k++){
if(g_pNode[k].getName( )==pstr[mm]
&&!g_pNode[k].getStatus( )){
g_pNode[k].setUnderPro(-100);
break;
}
}
}
delete[]pstr;}
2.抽取未激活的相关地质事实(含合取式)
if(l=strPremise.Find(".AND.")>-1){
qq=0;
for(p=0;p<strPremise.GetLength( );p++)
if(strPremise.GetAt(p)==ˊ.ˊ)
qq++;
qq/=2;
num=qq;
CString*pstr1=new CString[num+1];
qq=0;
p=0;
r=0;
strPremise+=ˊ.ˊ;
while(p<strPremise.GetLength( )){
if(strPremise.GetAt(p)==ˊ.ˊ){
pstr1[qq]=strPremise.Mid(r,p-r);
qq++;
p+=5;
r=p;
}
else
p++;
}
for(mm=0;mm<=num;mm++){
for(k=0;k<g iNodeNum;k++){
if(g_pNode[k].getName( )==pstr1[mm]
&&!g_pNode[k].getStatus( )){
g_pNode[k].setUnderPro(-100);
break;
}
}
}
delete[]pstr1;
}
四、解释系统的软件实现
(一)推理报告的结构
系统为每一次推理生成一份推理报告,为MS WORD文档。报告分为两个部分:正向推理报告和反向推理报告,每一部分又由用户提供证据清单和推理过程描述组成,推理过程描述采用三段论格式,并附有相关概率值、规则的充分性度量及必要性度量值。
(二)推理报告实现原理
推理报告的实现采用了基于COM的OLE自动化技术(图6-17)。
图6-17 COM组件、COM对象和COM接口之间的关系图
Windows系统平台上,一个COM组件可以是一个DLL文件,也可以是一个EXE 文件。一个组件程序可以包含多个COM对象,并且每个COM对象可以实现多个接口。
MS OFFICE的类型库文件提供了COM功能的子集,更重要的是,类型库文件提供了类,一个类描述一个COM对象。类型库标识了自动化客户区需要调用的COM对象属性和方法的全部信息,类型库描述了属性接受或返回的值,也提供了方法能够接收参数的类型和是否必需的。类型库可以是DLL文件、EXE文件或TLB文件。每一个MS OFFICE应用程序在DLL文件中都提供多个类型库资源,带有类型库资源的DLL通常叫做对象库(.OLB文件)。其中MS WORD 97的对象库文件是Msword8.olb,MS WORD 2000的对象库文件是 Msword9.olb。
(三)生成推理报告部分代码释义
1.COM初始化
if(!AfxOleInit( ))
{
AfxMessageBox("Could not initialize COM dll");
return FALSE;
}
2.创建WORD实例初始化文档
_Application oWord;
if(!oWord.CreateDispatch("Word.Application")){
AfxMessageBox("Word failed to start!");
}
else{
oWord.SetVisible(TRUE);
Documents oDocs;
_Document oDoc;
oDocs=oWord.GetDocuments( );
oDoc=oDocs.Add(vtOptional,vtOptional,vtOptional,vtOptional);
}
3.设置文档格式、字体并输出
Selection oSelection;
Paragraphs oParagraphs;
oSelection=oWord.GetSelection( );
oParagraphs=oSelection.GetParagraphs( );
oParagraphs.SetAlignment(1);
_Font oFont;
oFont=oSelection.GetFont( );
oFont.SetSize(18);
oSelection.TypeText(StrToAdd);
InsertLines(&oSelection,1);
oParagraphs.SetAlignment(0);
oParagraphs=oSelection.GetParagraphs( );
oParagraphs.SetAlignment(3);
4.超级链接和日期
Hyperlinks oHyperlinks;
oHyperlinks=oSelection.GetHyperlinks( );
oHyperlinks.Add(oSelection.GetRange( ),
COleVariant("http://www.cags.net.cn"),vtOptional,vtOptional,vtOptional,vtOptional);
InsertLines(&oSelection,1);
oSelection.InsertDateTime(COleVariant("dddd,mmmmdd,yyyy"),
vtFalse,vtOptional,vtOptional,vtOptional);
五、知识获取机制的软件实现
数字矿床模型专家系统知识获取机制界面如图6-18所示。相关类说明代码如下:
#include "GridCtrl.h"
classcmodifyRule:public CDialog
{
public:
int GetTypeNo(int row);
—CModifyRule( );
CString**m_ppstrCell;
CString*m_pstrColName;
图6-18 数字矿床模型专家系统知识获取机制界面图
int m_iColNum;
int*m_piTypeNum;
int m_iTypeNum;
bool ReadRule( );
void OnTitletips( );
void OnItalics( );
void OnListmode( );
CModifyRule(CWnd*pParent=NULL);
//{{AFX DATA(CModifyRule)
enum{ IDD=IDD_MODIFY_RULE};
int m_nFixCols;
int m_nFixRows;
int m_nCols;
int m_nRows;
BOOL m_bEditable;
BOOL m_bHorzLines;
BOOL m_bListMode;
BOOL m_bVertLines;
BOOL m_bSelectable;
BOOL m_bAllowColumnResize;
BOOL m_bAllowRowResize;
BOOL m_bHeaderSort;
BOOL m_bReadOnly;
BOOL m_bItalics;
BOOL m_btitleTips;
//}}AFX DATA
CGridCtrl m Grid;
CSize m OldSize;
//ClassWizard generated virtual function overrides
//{{AFX VIRTUAL(CModifyRule)
protected:
virtual void DoDataExchange(CDataExchange*pDX);
//}}AFX VIRTUAL
protected:
//{{AFX MSG(CModifyRule)
afx_msg void OnInsertRow( );
afx_msg void OnDeleteRow( );
virtual BOOL OnInitDialog( );
afx_msg void OnSize(UINT nType,int cx,int cy);
afx_msg void OnClose( );
afx_msg BOOL OnHelpInfo(HELPINFO*pHelpInfo);
//}}AFX MSG
DECLARE MESSAGE MAP( )
};
六、知识数据的组织
(一)知识库文件格式
1.结点数据文件格式
结点总数n;
结点属性数m;
结点属性1名称…结点属性m名称;
结点1属性1值…结点1属性m值;
…
结点n属性1值…结点n属性m值。
2.规则数据文件格式;
矿床类型种数n;
矿床1推理规则数m1;
…
矿床n推理规则数mn;
属性数c;
属性1名称…属性c名称;
矿床1规则1属性1值…矿床1规则1属性c值;
…
矿床1规则m1属性1值…矿床1规则m1属性c值;
…
矿床n规则1属性1值…矿床n规则1属性c值;
…
矿床n规则mn属性1值…矿床n规则mn属性c值。
七、知识库文件的安全
知识库文件加密保存,加密方式是对字符与密钥进行按位异或运算。
static void ApplyKeyToFile(FILE*in,FILE*out,unsigned char key)
{
int ch;
while((ch=getc(in))!=EOF)
putc(ch ^ key,out);
}
7.2.1.1 分解性侵蚀的计算公式及评价标准
分解性侵蚀的鉴定按表7-2-1 中“分解性侵蚀”中的pHs、pH、游离CO2(mg/L)3个指标来判断:
表7-2-1 水对混凝土的侵蚀性鉴定标准
注:该表引自文献[27]。表中A为硅酸盐水泥,B为火山灰质、含砂火山灰质、矿渣硅酸盐水泥;表中系数a和b另查表7-2-2。
(1)分解性侵蚀指数pHs是分解性侵蚀总指标:
供水水文地质计算
式中: 为水中 含量(mmol/L);K1为按表7-2-1查得的数值。当地下水实测的pH≥pHs时,水无pHs分解性侵蚀。
当地下水实测的pH<pHs时,则有分解性侵蚀:
实测pH <pHs时有pHs分解性侵蚀,即
供水水文地质计算
(2)pH值为酸性侵蚀指标。当地下水的pH值小于表中所列pH数值时,则地下水有酸性侵蚀。
(3)游离CO2为碳酸侵蚀指标。碳酸侵蚀指标[CO2]s的计算公式为:
[CO2]s=a[Ca2+]+b+K2 (7-2-2)
式中:Ca2+为水中实测的Ca2+含量(mg/L);a和b为按表7-2-2查取的系数值;K2为按表7-2-1查取的常数值;
表7-2-2 公式(7-2-2)中的系数a、b之值
当地下水中实测的游离CO2含量(mg/L)大于计算值[CO2]s时,则地下水有碳酸性侵蚀:
实测的游离CO2>[CO2]s时有碳酸性侵蚀,即
实测的游离CO2>a[Ca2+]+b+K2时有碳酸性侵蚀
根据以上3个指标来判断,如果(1)、(2)、(3)中的任一种侵蚀性存在,则均应评价为该地下水具有分解性侵蚀。
为了叙述方便,把表7-2-1中的“大块碎石类土含水介质”取代号D,“砂类土含水介质”取代号S,“粘性土”取代号N;并把“大块碎石类土含水介质D”-“A类水泥”组合简称DA组合,“大块碎石类土含水介质D”-“B类水泥”组合简称DB组合,“砂类土含水介质S”-“A类水泥”组合简称SA组合,“砂类土含水介质S”-“B类水泥”组合简称SB组合,“粘性土N”-“A类水泥”组合简称NA组合,“粘性土N”-“B类水泥”组合简称NB组合。
7.2.1.2 分解性侵蚀鉴定指标的判别表达式
用表7-2-1 中“分解性侵蚀”的3个指标pHs、pH、游离[CO2](mg/L)来鉴定分解性侵蚀时,其中的酸性侵蚀用地下水的pH值作为鉴定指标非常易于判断,只要判断一下地下水的pH值是否小于6.2、6.4、5.2、5.5,就鉴定出了DA组合、DB组合、SA组合、SB组合是否具有酸性侵蚀作用,同时也便于在平面图上圈划出具有酸性侵蚀的分布区、不具酸性侵蚀的分布区。
但是,另外两个指标“分解性侵蚀总指标”—pHs、“碳酸性侵蚀指标”—游离[CO2],用现有的计算公式(7-2-1)、(7-2-2)却难以统一实现上述鉴定。
例如,“分解性侵蚀总指标”—pHs的计算:
第一次先针对DA组合选用 K1=0.5代入公式计算出pHs,再在(7-2-1)式中与地下水的实测pH值进行对比,来鉴定DA组合是否具有pHs分解性侵蚀作用;
第二次再针对DB组合选用K1=0.3代入公式计算出pHs,再在(7-2-1)式中与地下水的实测pH值进行对比,来鉴定DB组合是否具有pHs分解性侵蚀作用;
第三次再针对SA组合选用K1=1.3代入公式计算出pHs,再在(7-2-1)式中与地下水的实测pH值进行对比,来鉴定SA组合是否具有pHs分解性侵蚀作用;
第四次再针对SB组合选用K1=1.0代入公式计算出pHs,再在(7-2-1)式中与地下水的实测pH值进行对比,来鉴定SB组合是否具有pHs分解性侵蚀作用;
因为K1的取值不同,所以尽管前后四次计算pHs均使用的是同一个公式,但是,同一个水样计算出的四个pHs在公式(7-2-1)中却不具有可比性,不能使用统一的判别指标数值来对上述四种情况进行统一的鉴定、统一的绘制区域分区图。
“碳酸性侵蚀指标”—游离[CO2]使用公式(7-2-2)的计算面临的也是同样的困惑,同样是因为K2的取值不同,同一个水样前后四次使用同一个公式计算出的四个游离[CO2]值在公式(7-2-2)中不具有可比性,不能使用统一的判别指标数值来对上述四种情况进行统一的鉴定、统一的绘制区域分区图。并且公式(7-2-2)的计算较之公式(7-2-1)的计算还要复杂得多,因为公式(7-2-2)中除K2的取值不同外,还涉及查表7-2-2确定a、b两个待定系数。
为了解决这种鉴定指标不统一的矛盾,本书引进了“分解性侵蚀鉴定指标的判别表达式”,简称“判别式”,一个是针对pHs的,称作“pHs分解性侵蚀判别式”,简称“pHs判别式”,另一个是针对“碳酸性侵蚀指标”—游离[CO2]的,称作“碳酸性侵蚀判别式”。两个判别式的构成原理是相同的,这里以公式(7-2-1)为例推导出“pHs判别式”:
把公式(7-2-1)移项整理为:
供水水文地质计算
把该不等式的左端用代号sk1代替,即令:
供水水文地质计算
则公式(7-2-1)最终被整理成为:
供水水文地质计算
把公式(7-2-4)称作“pHs分解性侵蚀判别式”,把计算值sk1称作“pHs分解性侵蚀判别值”。
同理,把公式(7-2-2)移项整理为:
实测的游离CO2-a[Ca2+]-b>K2时有碳酸性侵蚀
把该不等式的左端用代号sk2代替,即令:
sk2=实测的游离CO2-α[Ca2+]-b (7-2-5)
则公式(7-2-2)最终被整理成为:
sk2=实测的游离CO2-a[Ca2+]-b>K2时有碳酸性侵蚀
简明的表达式为:
sk2>K2时有碳酸性侵蚀 (7-2-6)
把公式(7-2-6)称作“碳酸性侵蚀判别式”,把计算值sk2称作“碳酸性侵蚀判别值”。
可以看出,这两个判别式的构成均是把地下水样检测数据作为已知数放在判别式的左侧,用代号sk1、sk2代替之,把计算出的判别值sk1、sk2与取值不同的常数项K1或K2进行比较,来鉴定对上述“第一次”至“第四次”的四种组合是否具有该项分解性侵蚀。
用计算出的判别值sk1还可以实现在同一张图上用sk1等值线绘制出sk1>0.3、0.5、1.0、1.3的四个pHs分解性侵蚀分布区,用计算出的判别值sk2在另一张图上用sk2等值线绘制出sk2>15、20、60、80的四个碳酸性侵蚀分布区。
对于地下水酸性侵蚀鉴定指标的pH值,本身已经具备了“判别值”的功能,不需要另外构成“酸性侵蚀判别式”,但是,为了与另外两个判别表达式的表述采用统一的命名原则,这里把“实测的pH值<表中的pH值”就直接称之为“酸性侵蚀判别式”、把“实测的pH值”用代号sk3代替,就直接称之为“酸性侵蚀判别值”。
除了可以用sk1等值线单图幅绘制pHs侵蚀分区图、用sk2等值线单图幅绘制碳酸性侵蚀分区图、用sk3等值线单图幅绘制酸性侵蚀分区图之外,还可以很方便地实现用sk1、sk2、sk3三判别值分别针对DA组合(或DB组合、或SA组合、或SB组合)的叠加同图绘制3种分解性侵蚀的综合叠加图。这3种分解性侵蚀的综合叠加图,只能分别按DA、DB、SA、SB四种组合分成四幅图来单独绘制。
把计算出的判别值sk1用判别式(7-2-4)鉴定pHs侵蚀作用的使用方法如下:
(1)当sk1>K1=0.5时,DA组合具有pHs分解性侵蚀作用;
(2)当sk1>K1=0.3时,DB组合具有pHs分解性侵蚀作用;
(3)当sk1>K1=1.3时,SA组合具有pHs分解性侵蚀作用;
(4)当sk1>K1=1.0时,SB组合具有pHs分解性侵蚀作用;
把计算出的判别值sk2用判别式(7-2-6)鉴定碳酸性侵蚀作用的使用方法如下:
(1)当sk2>K2=20时,DA组合具有碳酸性侵蚀作用;
(2)当sk2>K2=15时,DB组合具有碳酸性侵蚀作用;
(3)当sk2>K2=80时,SA组合具有碳酸性侵蚀作用;
(4)当sk2>K2=60时,SB组合具有碳酸性侵蚀作用。
7.2.1.3 分解性侵蚀的计算程序
c fenjieqinshi.for 对工业建设3 种“分解性侵蚀”pHs、[CO2]、pH 逐一进行计算评价,读进表7-2-2 的数据
c 输出分解性侵蚀评价结果文件sk.txt文件,该文件包括水样点x、y坐标,sk1、sk2、sk3值,水样点编号id
c sk1—“pHs判别值”计算结果、sk2—“碳酸性侵蚀判别值”计算结果、sk3—即pH值作为“酸性侵蚀判别值”
c fenxi(ndian,mxiang)—水质分析数据,ndian—水样点个数 mxiang—分析成分项数(6个)
c 表7-2-1中的:phs(ndian,4)-待计算的分解性侵蚀指数,即表7-2-1中的pHs
c hco(22)-表7-2-2中的HCO3meq/L
c a(22,6),b(22,6)-表7-2-2中的a、b系数,第1列为a(i,1),b(i,1),第2列为a(i,2),b(i,2)
c da1(ndian)-a1代表“普通的”“A硅酸盐水泥”,da2(ndian)-a2代表“抗硫酸盐的”“A硅酸盐水泥”
c x(ndian)-水样点的x坐标,y(ndian)-水样点的y坐标,id(ndian)-水样点编号
c hcomeq(ndian)-HCO根的毫克当量浓度hcomeq(i)=(HCO mg/L)/61.0159(meq/L)
parameter(mxiang=6,ndian=16)
dimension fenxi(ndian,mxiang),sk1(ndian),sk2(ndian),id(ndian)
dimension hco(22),a(22,6),b(22,6),x(ndian),y(ndian)
dimension co(ndian,4),phs(ndian,4),ph0(ndian),hcomeq(ndian)
c 从fenxi.dat读取水质分析数据,排序:1游离CO2 2Ca+3Cl-4SO42-5HCO3-6pH值
open(1,file=’fenxi.dat’)
do 20 i=1,ndian
20 read(1,*)id(i),x(i),y(i),(fenxi(i,j),j=1,mxiang)
close(1)
c 从biao7-2.dat读取表7-2-2的数据
open(1,file=’biao7-2-2.dat’)
do 30 i=1,22
30 read(1,*)hco(i),(a(i,j),b(i,j),j=1,6)
close(1)
c 计算HCO根的毫克当量浓度hcomeq(i)=(HCO mg/L)/61.0159(meq/L):
do 40 i=1,ndian
40 hcomeq(i)=fenxi(i,5)/61.0159
c 200句循环体最终用公式(2)对ndian个水样逐个计算“pHs侵蚀判别值”—sk1(ndian)
do 200 i=1,ndian
c ph0是公式(1)的“分式”一项,即还没有减 k1之前的计算值
ph0(i)=hcomeq(i)/(0.15*hcomeq(i)-0.025)
c pHs(i,1)~phs(i,4)是公式(1)分别减去k1=0.5,0.3,1.3,1.0之后的4个pHs计算值,图上标注用
pHs(i,1)=ph0(i)-0.5
pHs(i,2)=ph0(i)-0.3
pHs(i,3)=ph0(i)-1.3
pHs(i,4)=ph0(i)-1.0
200 sk1(i)=ph0(i)-fenxi(i,6)
c 400句循环体是用公式(7-2-5)对ndian个水样逐个计算“碳酸性侵蚀判别值”—sk2(ndian)
do 400 i=1,ndian
c 先计算碳酸性侵蚀指数co2s(ndian)的前2项之和:a*[Ca]+b
hcox=hcomeq(i)
c 240句循环体是用HCO3meq/L查出在表7-2-2中的行位置,查出位于k行与k+1行之间
do 240 k=1,22
k1=k
if(hcox.ge.hco(k).and.hcox.le.hco(k+1))goto 250
240 continue
c 计算k1行与k1+1行之间距d12,内插计算点的HCO3meq/L在k1行与k1+1行之间的位置dab
250 d12=hco(k1+1)-hco(k1)
d1=hcox-hco(k1)
dab=d1/d12
c 计算表7-2-2的第一行 Cl和 SO根的总含量 cs(mg/L):
cs=fenxi(i,3)+fenxi(i,4)
c 一直到360句是查Cl和SO根的总含量cs(mg/L)属于表7-2-2的哪一列(属于第j列)
if(cs-200)310,310,260
260 if(cs-400)320,320,270
270 if(cs-600)330,330,280
280 if(cs-800)340,340,290
290 if(cs-1000)350,350,360
310 j=1
goto 370
320 j=2
goto 370
330 j=3
goto 370
340 j=4
goto 370
350 j=5
goto 370
360 j=6
c 计算第j列的k1行与k1+1行a、b值之间距da、db
370 da=a(k1+1,j)-a(k1,j)
db=b(k1+1,j)-b(k1,j)
c 用HCO3的位置dab确定a、b的位置,内差得到系数a、b值,即a1、b1:
a1=a(k1,j)+da*dab
b1=b(k1,j)+db*dab
c 计算碳酸性侵蚀指数co2s(ndian)的前2项之和:a*[Ca]+b
co2=a1*fenxi(i,2)+b1
c 计算A、B、A、B四种砼的碳酸性侵蚀指数co2s(ndian)
co(i,1)=co2+20
co(i,2)=co2+15
co(i,3)=co2+80
co(i,4)=co2+60
c 计算表7-2-1中的碳酸性侵蚀判别值sk2(ndian),当用k2=20、15、60、80为阀值绘制sk2的等值线图时
c 该等值线分区即为A、B、A、B四种砼的碳酸性侵蚀分区
sk2(i)=fenxi(i,1)-co2
400 continue
c 输出3种分解性侵蚀评价结果:x坐标、y坐标、sk1、sk2、pH值、点编号
c sk1—“pHs判别值”、sk2—“碳酸性侵蚀判别值”、pH值—即“酸性侵蚀判别值”
open(1,file=’sk.txt’)
do 500 i=1,ndian
write(1,501)x(i),y(i),sk1(i),sk2(i),fenxi(i,6),id(i)
500 continue
close(1)
501 format(1x,2f12.2,3f10.2,3x,i4)
c 输出pHs分解性侵蚀评价结果:x坐标、y坐标、sk1、pH值(图上标注用)、砼的4种pHs侵蚀总指数(图上标注用),点编号
c sk1—“pHs侵蚀判别值”
open(1,file=’sk1.txt’)
do 510 i=1,ndian
write(1,511)x(i),y(i),sk1(i),fenxi(i,6),phs(i,1),phs(i,2),
* phs(i,3),phs(i,4),id(i)
510 continue
close(1)
511 format(1x,2f12.2,6f10.2,3x,i4)
c 输出碳酸性侵蚀评价结果:x坐标、y坐标、sk2、游离CO2(图上标注用)、砼的4种碳酸性侵蚀指数(图上标注用),点编号 c sk2—“碳酸性侵蚀判别值”
open(1,file=’sk2.txt’)
do 520 i=1,ndian
write(1,511)x(i),y(i),sk2(i),fenxi(i,1),co(i,1),co(i,2),co(i,3),
* co(i,4),id(i)
520 continue
close(1)
stop
end
7.2.1.4 分解性侵蚀的计算实例
某研究区长宽各100km,在潜水含水层中采集16个地下水样,点位置坐标及游离CO2(mg/L)、Ca2+(mg/L)、Cl-(mg/L)、 (mg/L)、 (mg/L)、pH值的检测结果列入表7-2-3中,现计算并鉴定其分解性侵蚀作用,并绘制分解性侵蚀作用分区图。
上小节的计算程序fenjieqinshi.for已设定为16个水样数据。首先按照程序fenjieqin⁃shi.for的数据要求逐个录入数据文件,共有fenxi.dat、biao7-2-2.dat两个数据文件。
表7-2-3 某研究区潜水采样点位置及有关的检测结果一览表
录入数据文件fenxi.dat如下:
1 10 10 4.0 86.17 21.91 60.04 328.17 8.5
2 20 30 4.5 46.32 10.92 30.41 232.06 8.1
3 40 30 4.6 64.45 9.10 56.96 216.79 7.9
4 60 30 81.0 44.31 21.85 42.48 216.79 6.1
5 80 30 115.0 79.55 43.70 93.16 287.02 5.2
6 99 10 6.0 55.39 14.57 37.65 250.38 8.2
7 20 60 7.0 65.46 17.30 42.48 302.29 7.9
8 40 60 5.0 39.68 10.03 30.93 196.06 8.2
9 60 60 118.0 71.16 12.78 4960.00 243.87 5.1
10 80 60 5.0 54.55 10.95 35.64 223.40 8.2
11 50 50 95.0 40.28 7.28 28.00 207.63 6.0
12 10 99 80.0 43.90 54.00 13.50 180.00 6.1
13 20 80 90.0 87.00 65.00 5.31 186.00 6.6
14 40 80 105.0 98.00 1100.00 5100.00 420.00 5.2
15 70 80 83.0 114.00 3600.00 7700.00 450.00 6.1
16 99 99 120.0 102.00 6100.00 7940.00 460.00 4.9
录入查表数据文件biao7-2-2.dat如下:
1.4 0.01 16 0.01 17 0.01 17 0 17 0 17 0 17
1.8 0.04 17 0.04 18 0.03 17 0.02 18 0.02 18 0.02 18
2.1 0.07 19 0.08 19 0.05 18 0.04 18 0.04 18 0.04 18
2.5 0.1 21 0.09 20 0.07 19 0.06 18 0.06 18 0.05 18
2.9 0.13 23 0.11 21 0.09 19 0.08 18 0.07 18 0.07 18
3.2 0.16 25 0.14 22 0.11 20 0.1 19 0.09 18 0.08 18
3.6 0.2 27 0.17 23 0.14 21 0.12 19 0.11 18 0.1 18
4 0.24 29 0.2 24 0.16 22 0.15 20 0.13 19 0.12 19
4.3 0.28 32 0.24 26 0.19 23 0.17 21 0.16 20 0.14 20
4.7 0.32 34 0.28 27 0.22 24 0.2 22 0.19 21 0.17 21
5 0.36 36 0.32 29 0.25 26 0.23 23 0.22 22 0.19 22
5.4 0.4 38 0.36 30 0.29 27 0.26 24 0.24 23 0.22 23
5.7 0.44 41 0.4 32 0.32 28 0.29 25 0.27 24 0.25 24
6.1 0.48 43 0.43 34 0.36 30 0.33 26 0.3 25 0.28 25
6.4 0.54 46 0.47 37 0.4 32 0.36 28 0.33 27 0.31 27
6.8 0.61 48 0.51 39 0.44 33 0.4 30 0.37 29 0.34 28
7.1 0.67 51 0.55 41 0.48 35 0.44 31 0.41 30 0.38 29
7.5 0.74 53 0.6 43 0.53 37 0.48 33 0.45 31 0.41 31
7.8 0.81 55 0.65 45 0.58 38 0.53 34 0.49 33 0.44 32
8.2 0.88 58 0.7 47 0.63 40 0.58 35 0.53 34 0.48 33
8.6 0.96 60 0.76 49 0.68 42 0.63 37 0.57 36 0.52 35
9 1.04 63 0.81 51 0.73 44 0.67 39 0.61 38 0.56 37
然后运行应用程序fenjieqinshi.exe 得到输出的计算结果文件之一sk.txt为:
10.00 10.00 -1.62 -68.17 8.50 1
20.00 30.00 -1.13 -33.72 8.10 2
40.00 30.00 -.91 -34.75 7.90 3
60.00 30.00 .89 45.58 6.10 4
80.00 30.00 1.71 55.47 5.20 5
99.00 10.00 -1.25 -38.09 8.20 6
20.00 60.00 -1.00 -51.86 7.90 7
40.00 60.00 -1.17 -26.47 8.20 8
60.00 60.00 1.86 90.48 5.10 9
80.00 60.00 -1.22 -33.55 8.20 10
50.00 50.00 1.01 61.72 6.00 11
10.00 99.00 .97 50.74 6.10 12
20.00 80.00 .45 53.41 6.60 13
40.00 80.00 1.63 42.31 5.20 14
70.00 80.00 .72 6.95 6.10 15
99.00 99.00 1.92 46.65 4.90 16
在计算结果文件sk.txt 中,第一列为横坐标(km)、第二列为纵坐标(km),第三列为sk1,第四列为sk2,第五列为sk3,第六列为水样点编号。
用sk1.txt文件把sk1>0.5、0.3、1.3、1.0的四个pHs分解性侵蚀分布区在同一张图上用sk1等值线绘制出(图7-2-1)。图7-2-1a中实心圆点表示水样点的位置,圆点上方标注该点的编号,圆点下方标注该点水样的pHs分解性侵蚀判别值sk1数据。
图7-2-1 用判别值鉴定三种分解性侵蚀作用分区图
阅读图7-2-1时需要注意的是,图中所用的四种填充符号,分别代表DA组合、DB组合、SA组合、SB组合的pHs分解性侵蚀分布范围。按照“pHs分解性侵蚀判别式”的定义,sk1>0.3时DB组合具pHs分解性侵蚀(同理,sk1>0.5 时DA组合具pHs分解性侵蚀、sk1>1.0时SB组合具pHs分解性侵蚀、sk1>1.3 时SA组合具pHs分解性侵蚀),这里应注意区别sk1>0.3与0.5>sk1>0.3的不同,sk1>0.3在分布图上的效果是,出现了DB组合的横线符号延伸到DA组合的竖线符号之下的双重符号重叠区域,这种符号重叠区域则代表该区域既有DA组合的pHs分解性侵蚀,又有DB组合的pHs分解性侵蚀,以此类推,四种符号全部叠加在一起的区域,则代表是四种组合均有 pHs分解性侵蚀的区域。
图7-2-2 各组合3种分解性侵蚀综合叠加图
用碳酸性侵蚀作用判别值sk2绘制碳酸性侵蚀作用分区图(图7-2-1b),圆点上方标注该点的编号,圆点下方标注该点水样的碳酸性侵蚀判别值sk2数据。
用酸性侵蚀作用判别值sk3绘制酸性侵蚀作用分区图(图7-2-1c),圆点上方标注该点的编号,圆点下方标注该点水样的酸性侵蚀判别值sk3(即pH值)数据。
用sk1、sk2、sk3(即pH值)三判别值分别针对DA组合(或DB组合、或SA组合、或SB组合)的叠加同图绘制三种分解性侵蚀(“pHs分解性侵蚀分布区”、“碳酸性侵蚀分布区”、“酸性侵蚀分布区”)的综合叠加图,按照“分解性侵蚀”的判断原则:三种分解性侵蚀性作用其中任何一种侵蚀性存在,就判断为具有“分解性侵蚀”,因此,在三种分解性侵蚀的综合叠加图上,按“取大为准”的方法圈定出“分解性侵蚀”的总分布区,即:在综合叠加图上,三种分解性侵蚀中只要有其中一种在某区段存在,则就认为该区段具分解性侵蚀。
分别用sk1、sk2、sk3三判别值同图叠加绘制成图7-2-2a DA组合三种分解性侵蚀综合叠加图、图7-2-2 b DB组合三种分解性侵蚀综合叠加图、图7-2-2 c SA组合三种分解性侵蚀综合叠加图、图7-2-2 d SB组合三种分解性侵蚀综合叠加图。
是哪个厂家生产的,在哪个点测量不准确,误差是多少,先要了解清楚。其次,就测量不准确提出几点原因作为参考:一,仪器一般要求每天校正一次,或者是是你感觉测量的值有偏差的时候就要校正了,
二,校正错误,没有按照仪器程序所规定的程序校正,比如一般国内的三点校正的顺序是6.86 4.00 9.18,而很多客户将6.86和4.00交换了,这样就导致测试值的错误,
三,仪器的配套电极寿命已到就会不准确了,一般电极的寿命是一年,但实际上远远达不到,比如测强酸强碱电极的寿命是3个月左右,正常使用也在半年到七个月左右,如果时间已经到了,建议更换!
谢谢,供参考!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)