比表面能算法
‘壹’ 什么是marching cubes算法具体怎么讲的
Marching Cubes算法(医学图像三维绘制中的面绘制)2007-08-16 00:50建议要看的资料
[1] Lorensen W E, Cline H E .Marching cubes: a high-resoulution 3D suface construction algorithm [J], Computer Graphics,1987, 21(4):163~169
[2]集成化医学影像算法平台理论与实践田捷,赵明昌,何晖光 清华大学出版社2004年10月
[3]Polygonising a scalar field Also known as: "3D Contouring", "Marching Cubes", "Surface Reconstruction"
http://local.wasp.uwa.e.au/~pbourke/geometry/polygonise/Marching Cubes;
[4]www.3dmed.net
Marching Cubes算法工作原理
Marching Cubes算法是三维数据场等值面生成的经典算法,是体素单元内等值面抽取技术的代表。
等值面是空间中所有具有某个相同值的点的集合。它可以表示为, ,c是常数。则称F(f)为体数据f中的等值面。
在MC算法中,假定原始数据是离散的三维空间规则数据场。用于医疗诊断的断层扫描(CT)及核磁共振成像(MRI) 等产生的图像均属于这一类型。MC算法的基本思想是逐个处理数据场中的体素,分类出与等值面相交的体素,采用插值计算出等值面与体素棱边的交点。根据体素中每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示。在计算出关于体数据场内等值面的有关参数后山常用的图形软件包或硬件提供的面绘制功能绘制出等值面。
图2.1 离散的三维空间规则数据场中的一个体素
2.1.1 MC算法的主要步骤
1. 确定包含等值面的体素
离散的三维空间规则数据场中的一个体素可以用图2.1表示。8个数据点分别位于该体素的8个角点上。MC算法的基本假设是:沿着体素的边其数据场呈局部连续线性变化,根据这个假设,可认为,如果两个相邻采样点一个为正点,一个为负点,则它们连成的边上一定存在且仅有一个等值点 (设等值面值为c)。如果得到了体素各条边上的等值点,就可以以这些点为顶点,用一系列的三角形拟合出该体素中的等值面。因此确定立方体体素中等值面的分布是该算法的基础。
首先对体素的8个顶点进行分类,以判断其顶点是位于等值面之外,还是位于等值面之内。再根据8个顶点的状态,确定等值面的剖分模式。顶点分类规则为:
1. 如体素顶点的数据值大于或等于等值面的值,则定义该顶点位于等值面之外, 记为正点,即“1“
2. 如体素顶点的数据值小于等值面的值,则定义该顶点位于等值面之内,记为负点, 即“0"
由于每个体素共有8个顶点,且每个顶点有正负两种状态,所以等值面可能以 =256种方式与一个体素相交。通过列举出这256种情况,就能创建一张表格,利用它可以查出任意体素中的等值面的三角面片表示。如果考虑互补对称性,将等值面的值和8个角点的函数值的大小关系颠倒过来,即将体素的顶点标记置反(0变为1, 1变为0),这样做不会影响该体素的8个角点和等值面之间的拓扑结构,可将256种方式简化成128种。其次,再利用旋转对称性,可将这128种构型进一步简化成15种。图3.2给出了这15种基本构型[131其中黑点标记为“1”的角点。
图2.2 分布状态表
图2.3 体素角点分布不同情况
基于上面的分析,MC算法中用一个字节的空间构造了一个体素状态表,如图2.2所示,该状态表中的每一位可表示出该体元中的一个角点的0或1的状态。根据这一状态表,就可知道当前体素属于图2.3中哪一种情况,以及等值面将与哪一条边相交。
2.求等值面与体元边界的交点
在确定体素内三角剖分模式后,就要计算三角片顶点位置。当三维离散数据场的密度较高时,即当体素很小时,可以假定函数值沿体素边界呈线性变化,这就是MC算法的基本假设。因此,根据这一基本假设,可以直接用线性插值计算等值面与体素边的交点。
对于当前被处理体素的某一条边,如果其两顶点 , 的标记值不同,那么等值面一定与此边相交,且仅有一个交点。交点为 其中P代表等值点坐标, , 代表两个端点的坐标, , 代表两个端点的灰度值,v代表域值。求出等值面与体素棱边的交点以后,就可以将这些交点连接成三角形或多边形,形成等值面的一部分。
3.等值面的法向量计算
为了利用图形硬件显示等值面图象,必须给出形成等值面的各三角面片的法向分量,选择适当的局部面光照模型进行光照计算,以生成真实感图形。
对于等值面上的每一点,其沿面的切线方向的梯度分量应该是零,因此,该点的梯度矢量的方向也就代表了等值面在该点的法向量,当梯度值非零。所幸的是等值面往往是由两种具有不同密度的物质的分解面,因此其上的每点的梯度矢量均不为零,即
Mc算法采用中心差分方法求采样点p〔m ,n, k ) 处的梯度矢量,公式如下:
Gx=〔g(i+1,j,k)-g(i-1,j,k)〕/2dx
Gy=〔g(i,j+1,k)-g(i,j-1,k)〕/2dy
Gz=〔g(i,j,k+1)-g(i,j,k-1)〕/2dz
其中D(i,j ,k)是切片k在像素(i,j)的密度, , , 是立方体边的长度。对g进行归一化,得到(gx/|g|,gy/|g|,gz/|g|)作为(i,j,k)上的单位法向量。然后,对体素八个顶点上法向量进行线性插值就可得到位于体素棱边上的三角片的各个顶点上的法向量。设计算得到的某个三角片的三个顶点上的单位法向量分别为( , 和 ),这个三角片的几何重心为 ,则该三角片的法向量起始于 ,终止于 。代入Gourand光照模型公式,就可计算出小三角片表面的光强(灰度)。将其投影在某个特定的二维平面上进行显示,从而显示出物体富有光感的整个表面形态。其中我们在内存中保留四个切片来计算立方体中所有顶点梯度。
2.1.2 MC算法流程
1、将三维离散规则数据场分层读入内存;
2、扫描两层数据,逐个构造体素,每个体素中的8个角点取自相邻的两层;
3、将体素每个角点的函数值与给定的等值面值c做比较,根据比较结果,构造
该体素的状态表;
4、根据状态表,得出将与等值面有交点的边界体素;
5、通过线性插值方法计算出体素棱边与等值面的交点;
6、利用中心差分方法,求出体素各角点处的法向量,再通过线性插值方法,求出三角面片各顶点处的法向;
7,根据各三角面片上各顶点的坐标及法向量绘制等值面图像。
========================================================
MC代码
MarchingCubes(float lowThreshold,float highThreshold,float XSpace,float YSpace,float ZSpace)
{
//记录生成的顶点数和面数初始时应该为0
m_vNumber=0;
m_fNumber=0;
//当前Cube中生成的顶点和面数
int vertPos,facePos;
//包围盒的尺寸 用于绘制程序计算整个场景的包围盒,用于调整观察位置,以使整个场景尽可能占满整个窗口。
float min[3],max[3];
min[0]=min[1]=min[2]=max[0]=max[1]=max[2]=0;//初始化
//当前扫描层的切片数据和一个临时的切片数据
short *pSliceA,*pSliceB,*pSliceC,*pSliceD,*tempSlice;
pSliceA=pSliceB=pSliceC=tempSlice=NULL;
int imageWidth,imageHeight,imageSize,sliceNumber;
imageWidth=imageHeight=512;//我们是512×512的数据
imageSize=imageWidth*imageHeight;
sliceNumber=m_FileCount-1;
if((highThreshold*lowThreshold)==0)
{
return 0;
}
pSliceD =new short [imageSize];
//因为等值面是每相邻两层切片为单位进行提取的,所以在处理后两层切片时难免生成前两层切片已经生成的顶点,这时候就用下面的数组记录哪些边上的顶点已经生成了,如果遇到已经生成的顶点就不再重复计算而是直接使用记录的索引,否则就生成新的顶点。
long *bottomXEdge=new long[imageSize];
long *bottomYEdge=new long[imageSize];
long *topXEdge=new long[imageSize];
long *topYEdge=new long[imageSize];
long *zEdge=new long[imageSize];
tempSlice=new short [imageSize];
if(bottomXEdge==NULL||bottomYEdge==NULL||
topXEdge==NULL||topYEdge==NULL||
zEdge==NULL||tempSlice==NULL)
{
return 0;//错误
}
//初始化数据
memset(bottomXEdge,-1,sizeof(long)*imageSize);
memset(bottomYEdge,-1,sizeof(long)*imageSize);
memset(topXEdge,-1,sizeof(long)*imageSize);
memset(topYEdge,-1,sizeof(long)*imageSize);
memset(zEdge,-1,sizeof(long)*imageSize);
memset(tempSlice,0,sizeof(short)*imageSize);
//计算某一层顶点和三角时所需要的一些变量
//一些循环变量
int i,j,k,w,r;
//cube类型
unsigned char cubeType(0);
//计算法向量
float dx[8],dy[8],dz[8],squaroot;
//记录某个Cube生成
float vertPoint[12][6];
int cellVerts[12]; //what use
int triIndex[5][3]; //每个cube最多生成5条边
//用于记录已生成顶点索引的临时变量
int offset;
//当前cube8个顶点的灰度值
short cubegrid[8];
long *edgeGroup;
//得到数据
pSliceD=m_volumeData;
pSliceB=tempSlice;
pSliceA=tempSlice;
int tt,tt1;
//扫描4层切片的顺序
/*
-----------------------D |
-----------------------B |
-----------------------C |
-----------------------A |
V
*/
//marching cubes 算法开始实行 ?第一次循环时,只读入一个切片?
for(i=0;i<=(sliceNumber);i++)
{
pSliceC=pSliceA;
pSliceA=pSliceB;
pSliceB=pSliceD;
if(i>=sliceNumber-2)
{
pSliceD=tempSlice;
}
else
{
pSliceD+=imageSize;
}
for(j=0;j<imageHeight-1;++j)
for(k=0;k<imageWidth-1;++k)
/* for(j=10;j<imageHeight-5;j++)//调试用
for(k=10;k<imageWidth-5;k++)*/
{
//得到八个顶点的灰度值step0
cubegrid[0]=pSliceA[j*imageWidth+k];
cubegrid[1]=pSliceA[j*imageWidth+k+1];
cubegrid[2]=pSliceA[(j+1)*imageWidth+k+1];
cubegrid[3]=pSliceA[(j+1)*imageWidth+k];
cubegrid[4]=pSliceB[j*imageWidth+k];
cubegrid[5]=pSliceB[j*imageWidth+k+1];
cubegrid[6]=pSliceB[(j+1)*imageWidth+k+1];
cubegrid[7]=pSliceB[(j+1)*imageWidth+k];
//计算cube的类型
cubeType=0;
for(w=0;w<8;w++)
{
if((cubegrid[w]>lowThreshold)&&(cubegrid[w]<highThreshold))//需要画的点
{
cubeType|=(1<<w);
}
}//end for计算cube的类型
if(cubeType==0||cubeType==255)
{
continue;
}
for(w=0;w<12;w++) //初始化cellVerts表到零
{
cellVerts[w]=-1;
}
//计算6个方向相邻点的象素差值(用于计算法向量)
if(k==0)
{
dx[0]=pSliceA[j*imageWidth+1];
dx[3]=pSliceA[(j+1)*imageWidth+1];
dx[4]=pSliceB[j*imageWidth+1];
dx[7]=pSliceB[(j+1)*imageWidth+1];
}
else
{
dx[0]=pSliceA[j*imageWidth+k+1]
-pSliceA[j*imageWidth+k-1];
dx[3]=pSliceA[(j+1)*imageWidth+k+1]
-pSliceA[(j+1)*imageWidth+k-1];
dx[4]=pSliceB[j*imageWidth+k+1]
-pSliceB[j*imageWidth+k-1];
dx[7]=pSliceB[(j+1)*imageWidth+k+1]
-pSliceB[(j+1)*imageWidth+k-1];
}
if(k==imageWidth-2)
{
dx[1]=-pSliceA[j*imageWidth+imageWidth-2];
dx[2]=-pSliceA[(j+1)*imageWidth+imageWidth-2];
dx[5]=-pSliceB[j*imageWidth+imageWidth-2];
dx[6]=-pSliceB[(j+1)*imageWidth+imageWidth-2];
}
else
{
dx[1]=pSliceA[j*imageWidth+k+2]
-pSliceA[j*imageWidth+k];
dx[2]=pSliceA[(j+1)*imageWidth+k+2]
-pSliceA[(j+1)*imageWidth+k];
dx[5]=pSliceB[j*imageWidth+k+2]
-pSliceB[j*imageWidth+k];
dx[6]=pSliceB[(j+1)*imageWidth+k+2]
-pSliceB[(j+1)*imageWidth+k];
}
if(j==0)
{
dy[0]=pSliceA[imageWidth+k];
dy[1]=pSliceA[imageWidth+k+1];
dy[4]=pSliceB[imageWidth+k];
dy[5]=pSliceB[imageWidth+k+1];
}
else
{
dy[0]=pSliceA[(j+1)*imageWidth+k]
-pSliceA[(j-1)*imageWidth+k];
dy[1]=pSliceA[(j+1)*imageWidth+k+1]
-pSliceA[(j-1)*imageWidth+k+1];
dy[4]=pSliceB[(j+1)*imageWidth+k]
-pSliceB[(j-1)*imageWidth+k];
dy[5]=pSliceB[(j+1)*imageWidth+k+1]
-pSliceB[(j-1)*imageWidth+k+1];
}
if(j==imageHeight-2)
{
dy[2]=-pSliceA[(imageHeight-2)*imageWidth+k+1];
dy[3]=-pSliceA[(imageHeight-2)*imageWidth+k];
dy[6]=-pSliceB[(imageHeight-2)*imageWidth+k+1];
dy[7]=-pSliceB[(imageHeight-2)*imageWidth+k];
}
else
{
dy[2]=pSliceA[(j+2)*imageWidth+k+1]-pSliceA[j*imageWidth+k+1];
dy[3]=pSliceA[(j+2)*imageWidth+k]-pSliceA[j*imageWidth+k];
dy[6]=pSliceB[(j+2)*imageWidth+k+1]-pSliceB[j*imageWidth+k+1];
dy[7]=pSliceB[(j+2)*imageWidth+k]-pSliceB[j*imageWidth+k];
}
dz[0]=pSliceB[j*imageWidth+k]
-pSliceC[j*imageWidth+k];
dz[1]=pSliceB[j*imageWidth+k+1]
-pSliceC[j*imageWidth+k+1];
dz[2]=pSliceB[(j+1)*imageWidth+k+1]
-pSliceC[(j+1)*imageWidth+k+1];
dz[3]=pSliceB[(j+1)*imageWidth+k]
-pSliceC[(j+1)*imageWidth+k];
dz[4]=pSliceD[j*imageWidth+k]
-pSliceA[j*imageWidth+k];
dz[5]=pSliceD[j*imageWidth+k+1]
-pSliceA[j*imageWidth+k+1];
dz[6]=pSliceD[(j+1)*imageWidth+k+1]
-pSliceA[(j+1)*imageWidth+k+1];
dz[7]=pSliceD[(j+1)*imageWidth+k]
-pSliceA[(j+1)*imageWidth+k];
//计算三角形顶点的坐标和梯度
vertPos=0;
facePos=0;
for(w=0;w<12;w++)
{
if(g_EdgeTable[cubeType]&(1<<w)) //what …..
{
//根据g_edgeTable[256]对应值判断cube的那一条边与等值面有交点
switch(w)
{
case 0:
offset=j*imageWidth+k;
edgeGroup=bottomXEdge;
break;
case 1:
offset=j*imageWidth+k+1;
edgeGroup=bottomYEdge;
break;
case 2:
offset=(j+1)*imageWidth+k;
edgeGroup=bottomXEdge;
break;
case 3:
offset=j*imageWidth+k;
edgeGroup=bottomYEdge;
break;
case 4:
offset=j*imageWidth+k;
edgeGroup=topXEdge;
break;
case 5:
offset=j*imageWidth+k+1;
edgeGroup=topYEdge;
break;
case 6:
offset=(j+1)*imageWidth+k;
edgeGroup=topXEdge;
break;
case 7:
offset=j*imageWidth+k;
edgeGroup=topYEdge;
break;
case 8:
offset=j*imageWidth+k;
edgeGroup=zEdge;
break;
case 9:
offset=j*imageWidth+k+1;
edgeGroup=zEdge;
break;
case 10:
offset=(j+1)*imageWidth+k+1;
edgeGroup=zEdge;
break;
case 11:
offset=(j+1)*imageWidth+k;
edgeGroup=zEdge;
break;
}//对应switch的{。。。end for//根据g_EdgeTable对应值判断cube的那一条边与等值面有交点
//该边上的顶点是否已经在上一层中生成
if(edgeGroup[offset]==-1)
{
int index1,index2;
short s1,s2,s;
float x1,y1,z1,nx1,ny1,nz1;
float x2,y2,z2,nx2,ny2,nz2;
//得到该边两端点的索引进而得到两点的灰度值
index1=g_CoordTable[w][3];
index2=g_CoordTable[w][4];
s1=cubegrid[index1];
s2=cubegrid[index2];
if(s1<highThreshold&&s1>lowThreshold)
{
if(s2>=highThreshold)
{
s=highThreshold;
}
else if(s2<=lowThreshold)
{
s=lowThreshold;
}
}
else if(s2<highThreshold&&s2>lowThreshold)
{
if(s1>=highThreshold)
{
s=highThreshold;
}
else if(s1<=lowThreshold)
{
s=lowThreshold;
}
}
//计算两端点实际坐标
x1=(k+g_CoordVertex[index1][0])*XSpace;
y1=(j+g_CoordVertex[index1][1])*YSpace;
z1=(i+g_CoordVertex[index1][2])*ZSpace;
x2=(k+g_CoordVertex[index2][0])*XSpace;
y2=(j+g_CoordVertex[index2][1])*YSpace;
z2=(i+g_CoordVertex[index2][2])*ZSpace;
//计算两端点的法向量
nx1=dx[index1]/XSpace;
ny1=dy[index1]/YSpace;
nz1=dz[index1]/ZSpace;
nx2=dx[index2]/XSpace;
ny2=dy[index2]/YSpace;
nz2=dz[index2]/ZSpace;
float factor=((float)(s-s1))/((float)(s2-s1));
//插值计算交点坐标
vertPoint[vertPos][0]=factor*(x2-x1)+x1;
vertPoint[vertPos][1]=factor*(y2-y1)+y1;
vertPoint[vertPos][2]=factor*(z2-z1)+z1;
//计算法向量
vertPoint[vertPos][3]=factor*(nx1-nx2)-nx1;
vertPoint[vertPos][4]=factor*(ny1-ny2)-ny1;
vertPoint[vertPos][5]=factor*(nz1-nz2)-nz1;
//法向量归一化
squaroot=sqrt(vertPoint[vertPos][3]*vertPoint[vertPos][3]+vertPoint[vertPos][4]*vertPoint[vertPos][4]
+vertPoint[vertPos][5]*vertPoint[vertPos][5]);
if(squaroot<=0)squaroot=1.0;
vertPoint[vertPos][3]/=squaroot;
vertPoint[vertPos][4]/=squaroot;
vertPoint[vertPos][5]/=squaroot;
//更新包围盒数据
if(min[0]>vertPoint[vertPos][0])
{
min[0]=vertPoint[vertPos][0];
}
if(min[1]>vertPoint[vertPos][1])
{
min[1]=vertPoint[vertPos][1];
}
if(min[2]>vertPoint[vertPos][2])
{
min[2]=vertPoint[vertPos][2];
}
if(max[0]<vertPoint[vertPos][0])
{
max[0]=vertPoint[vertPos][0];
}
if(max[1]<vertPoint[vertPos][1])
{
max[1]=vertPoint[vertPos][1];
}
if(max[2]<vertPoint[vertPos][2])
{
max[2]=vertPoint[vertPos][2];
}
//记录新生成的顶点索引
cellVerts[w]=m_vNumber;
edgeGroup[offset]=cellVerts[w];
m_vNumber++;
vertPos++;
} //end if(edgeGroup[offset]==-1) ////
else
{
//若该点已经在上一层生成,则直接得到其索引
cellVerts[w]=edgeGroup[offset];
}
} // end对应if(g_EdgeTable[cubeType]&(1<<w)) //
} //对应for(w=0;w<12;w++)
//保存当前cubes 顶点和法向量
tt1=m_vNumber-vertPos;
for(tt=0;tt<vertPos;tt++)
{
vPointNomal[tt1+tt][0]=vertPoint[tt][0];
vPointNomal[tt1+tt][1]=vertPoint[tt][1];
vPointNomal[tt1+tt][2]=vertPoint[tt][2];
vPointNomal[tt1+tt][3]=vertPoint[tt][3];
vPointNomal[tt1+tt][4]=vertPoint[tt][4];
vPointNomal[tt1+tt][5]=vertPoint[tt][5];
}
// memcpy(vPointNomal+6*(m_vNumber-vertPos) ,vertPoint,sizeof(float)*6*vertPos);
//记录新生成的三角面片数据
w=0;
while (g_TriTable[cubeType][w]!=-1)
{
for(r=0;r<3;r++)
{
triIndex[facePos][r]=cellVerts[g_TriTable[cubeType][w++]];
if(triIndex[facePos][r]<0)
{
AfxMessageBox("有问题",MB_OK,0);
}
}
facePos++;
m_fNumber++;
} //end 对应while (g_TriTable[cubeType][w]!=-1)
//保存面数据
tt1=m_fNumber-facePos;
for(tt=0;tt<facePos;tt++)
{
pFace[tt1+tt][0]=triIndex[tt][0];
pFace[tt1+tt][1]=triIndex[tt][1];
pFace[tt1+tt][2]=triIndex[tt][2];
}
// memcpy(pFace+3*(m_fNumber-facePos)*sizeof(long),triIndex,sizeof(int)*3*facePos);
} memcpy(bottomXEdge,topXEdge,sizeof(short)*imageSize);
memcpy(bottomYEdge,topYEdge,sizeof(short)*imageSize);
memset(topXEdge,-1,sizeof(short)*imageSize);
memset(topYEdge,-1,sizeof(short)*imageSize);
memset(zEdge,-1,sizeof(short)*imageSize);
}
delete []tempSlice;
delete []bottomXEdge;
delete []bottomYEdge;
delete []topXEdge;
delete []topYEdge;
delete []zEdge;
return 1;
}
在OnDraw
glBegin(GL_TRIANGLES);
for(i=0;i<pDoc->m_fNumber;i++)
{
glNormal3fv(&(pDoc->vPointNomal[pDoc->pFace[ i][0]][3]));
glVertex3fv(&(pDoc->vPointNomal[pDoc->pFace[ i][0]][0]));
glNormal3fv(&(pDoc->vPointNomal[pDoc->pFace[ i ][1]][3]));
glVertex3fv(&(pDoc->vPointNomal[pDoc->pFace[ i ][1]][0]));
glNormal3fv(&(pDoc->vPointNomal[pDoc->pFace[ i ][2]][3]));
glVertex3fv(&(pDoc->vPointNomal[pDoc->pFace[ i ][2]][0]));
}
glEnd();
以上代码只用于理解,未测试
‘贰’ 三维Delaunay算法
将Delaunay剖分算法推广到三维具有重要意义。三维Delaunay剖分构成的Delaunay四面体是进一步构成任意块体的中间工具。三维空间的四面体对于三维射线追踪非常方便。三维Delaunay算法基本原理与二维Delaunay算法十分相似,但编制起来更为复杂。它也要用一个n×8维数组记录四面体构成点和相邻四面体信息,它大致也分为以下几步:
(1)判断哪些四面体的外接球包含新加入的点;
(2)将这些四面体汇总到一块,形成一个凸多面体;
(3)找到这多面体外表面,用一个二维三角形相邻关系数组记录下来;
(4)由多面体表面的三角形与新加入的点构制新四面体,用一个三维四面体数据结构数组,存贮新形成的四面体信息;
(5)用新四面体信息去更新原来总的四面体数据结构信息。
其中第(3)步是比二维Delaunay剖分复杂。待修改的四面体的外表面不再能够用环表示,而要用一个二维Delaunay三角形数据结构来表示。这种三角形的相邻关系要从原四面体的数据结构关系中去寻找。A、C面是多面体的外表面。B是其内表面须寻找A的一个棱的相邻三角形B,从B找到下一个四面体,再从四面体上找到与B三角形棱相邻的面C。
在三维Delaunay算法中,在通过外接球找到所有待修改的四面体后,将其排成一个待修改四面体数据结构数组,将待修改四面体的所有面全部排列起来,其中包含各个四面体的相互公共面和这些四面体组成的多面体的外表面,构成一个关于面的数据结构数组。从这个数据结构中删去相互相邻的三角形面,这样就构成了外表面的数据结构数组。
三维Delaunay剖分时,我们总利用三角形网格中的数量关系,来检查所形成的四面体的正确性。如果待删四面体数目为T,外表面三角形的数目为F,则
地质模型计算机辅助设计原理与应用
‘叁’ 高一化学常用计算方法,比如说十字交叉法,差量法等等,都帮我详细讲解一下
一、差量法
在一定量溶剂的饱和溶液中,由于温度改变(升高或降低),使溶质的溶解度发生变化,从而造成溶质(或饱和溶液)质量的差量;每个物质均有固定的化学组成,任意两个物质的物理量之间均存在差量;同样,在一个封闭体系中进行的化学反应,尽管反应前后质量守恒,但物质的量、固液气各态物质质量、气体体积等会发生变化,形成差量。差量法就是根据这些差量值,列出比例式来求解的一种化学计算方法。该方法运用的数学知识为等比定律及其衍生式:或。差量法是简化化学计算的一种主要手段,在中学阶段运用相当普遍。常见的类型有:溶解度差、组成差、质量差、体积差、物质的量差等。在运用时要注意物质的状态相相同,差量物质的物理量单位要一致。
1.将碳酸钠和碳酸氢钠的混合物21.0g,加热至质量不再变化时,称得固体质量为14.8g。求混合物中碳酸钠的质量分数。
2.实验室用冷却结晶法提纯KNO3,先在100℃时将KNO3配成饱和溶液,再冷却到30℃,析出KNO3。现欲制备500g较纯的KNO3,问在100℃时应将多少克KNO3溶解于多少克水中。(KNO3的溶解度100℃时为246g,30℃时为46g)
3.某金属元素R的氧化物相对分子质量为m,相同价态氯化物的相对分子质量为n,则金属元素R的化合价为多少?
4.将镁、铝、铁分别投入质量相等、足量的稀硫酸中,反应结束后所得各溶液的质量相等,则投入的镁、铝、铁三种金属的质量大小关系为( )
(A)Al>Mg>Fe (B)Fe>Mg>Al (C)Mg>Al>Fe (D)Mg=Fe=Al
二、十字交叉法
凡能列出一个二元一次方程组来求解的命题,即二组分的平均值,均可用十字交叉法,此法把乘除运算转化为加减运算,给计算带来很大的方便。
十字交叉法的表达式推导如下:设A、B表示十字交叉的两个分量,表示两个分量合成的平均量,xA、xB分别表示A和B占平均量的百分数,且xA+xB=1,则有:
A•xA+B•xB= (xA+xB) 化简得:
若把 放在十字交叉的中心,用A、B与其交叉相减,用二者差的绝对值相比即可得到上式。
十字交叉法应用非常广,但不是万能的,其适用范围如表4—2:
含 化学
义 量
类型 A、B
xA、xB
1 溶液中溶质
质量分数 混合溶液中溶质质量质量分数 质量分数
2 物质中某元素
质量分数 混合物中某
元素质量分数 质量分数
3 同位素相对
原子质量 元素相对
原子质量 同位素原子
百分组成
4 某物质相对
分子质量 混合物平均相对分子质量 物质的量分数
或体积分数
5 某物质分子
组成 混合物的平均
分子组成 物质的量分数
6 用于某些综合计算:如十字交叉法确定某些盐的组成、有机物的组成等
正确使用十字交叉法解题的关键在于:(1)正确选择两个分量和平均量;(2)明确所得比为谁与谁之比;(3)两种物质以什么为单位在比。尤其要注意在知道质量平均值求体积或物质的量的比时,用此法并不简单。
1. 现有50g 5%的CuSO4溶液,把其浓度增大一倍,可采用的方法有:(1)可将原溶液蒸发掉 g水;(2)可向原溶液中加入12.5% CuSO4溶液 g;(3)可向原溶液中加入胆矾 g;(4)可向原溶液中加入CuSO4白色粉末 g。
2 . 今有NH4NO3和CO(NH2)2混合化肥,现测得含氮质量分数为40%,则混合物中NH4NO3和CO(NH2)2的物质的量之比为( )
(A)4∶3 (B)1∶1 (C)3∶4 (D)2∶3
三、平均法
对于含有平均含义的定量或半定量习题,利用平均原理这一技巧性方法,可省去复杂的计算,迅速地作出判断,巧妙地得出答案,对提高解题能力大有益处。平均法实际上是对十字交叉所含原理的进一步运用。解题时,常与十字交叉结合使用,达到速解之目的。原理如下:
若A>B,且符合 ,则必有A> >B,其中是A、B的相应平均值或式。xA•xB分别是A、B的份数。
常见的类型有:元素质量分数、相对原子质量、摩尔电子质量、双键数、化学组成等平均法。有时运用平均法也可讨论范围问题。
1. 某硝酸铵样品中氮的质量分数25%,则该样品中混有的一组杂质一定不是( )
(A)CO(NH2)2和NH4HCO3 (B)NH4Cl和NH4HCO3
(C)NH4Cl和(NH4)2SO4 (D)(NH4)2SO4和NH4HCO3
2. 把含有某一种氯化物杂质的氯化镁粉末95mg溶于水后,与足量的硝酸银溶液反应,生成氯化银沉淀300mg,则该氯化镁中的杂质可能是( )
(A)氯化钠 (B)氯化铝 (C)氯化钾 (D)氯化钙
3. 某含杂质的CaCO3样品只可能含有下列括号中四种杂质中的两种。取10g该样品和足量盐酸反应,产生了2.24L标准状况下的CO2气体。则该样品中一定含有 杂质,可能含有 杂质。(杂质:KHCO3、MgCO3、K2CO3、SiO2)
4 .(1)碳酸氢铵在170℃时完全分解,生成的混和气体平均相对分子质量是 。
(2)某爆鸣气中H2和O2的质量分数分别为75%和25%,则该爆鸣气对氢气的相对密度是 。
(3)体积为1 L的干燥容器充入HCl气体后,测得容器中气体对氧气相对密度为1.082,用此气体进行喷泉实验,当喷泉停止后,进入容器中液体的体积是 。
附:平均摩尔质量( )的求法:
① m总—混和物叫质量 n总—混和物总物质的量
② =M1•n1%+M2•n2%+… M1、M2……各组分的摩尔质量,n1%、n2%……各组分的物质的量分数。(注: 如是元素的摩尔质量,则M1、M2……是各同位素的摩尔质量,n1%、n2%……是各同位素的原子分数(丰度)。)
③ 如是气体混合物的摩尔质量,则有 =M1•V1%+M2•V2%+…(注:V1%、V2%……气体体积分数。)
④ 如是气体混合物的摩尔质量,则有 =d•MA (注:MA为参照气体的摩尔质量,d为相对密度)
四、 守恒法
在化学反应中存在一系列守恒现象,如:质量守恒(含原子守恒、元素守恒)、电荷守恒、电子得失守恒、能量守恒等,利用这些守恒关系解题的方法叫做守恒法。电荷守恒即对任一电中性的体系,如化合物、混和物、溶液、胶体等,电荷的代数和为零,即正电荷总数和负电荷总数相等。电子得失守恒是指在发生氧化-还原反应时,氧化剂得到的电子数一定等于还原剂失去的电子数,无论是自发进行的氧化-还原反应还是以后将要学习的原电池或电解池均如此。
a. 质量守恒
1 . 有0.4g铁的氧化物, 用足量的CO 在高温下将其还原,把生成的全部CO2通入到足量的澄清的石灰水中得到0.75g固体沉淀物,这种铁的氧化物的化学式为( )
A. FeO B. Fe2O3 C. Fe3O4 D. Fe4O5
2. 将几种铁的氧化物的混合物加入100mL、7mol•L―1的盐酸中。氧化物恰好完全溶解,在所得的溶液中通入0.56L(标况)氯气时,恰好使溶液中的Fe2+完全转化为Fe3+,则该混合物中铁元素的质量分数为 ( )
A. 72.4% B. 71.4% C. 79.0% D. 63.6%
b. 电荷守恒法
3. 将8g Fe2O3投入150mL某浓度的稀硫酸中,再投入7g铁粉收集到1.68L H2(标准状况),同时,Fe和Fe2O3均无剩余,为了中和过量的硫酸,且使溶液中铁元素完全沉淀,共消耗4mol/L的NaOH溶液150mL。则原硫酸的物质的量浓度为( )
A. 1.5mol/L B. 0.5mol/L C. 2mol/L D. 1.2mol/L
4. 镁带在空气中燃烧生成氧化镁和氮化镁,将燃烧后的产物全部溶解在50mL 1.8 mol•L-1盐酸溶液中,以20mL 0.9 mol•L-1的氢氧化钠溶液中和多余的酸,然后在此溶液中加入过量碱把氨全部释放出来,用足量盐酸吸收,经测定氨为0.006 mol,求镁带的质量。
c. 得失电子守恒法
5 . 某稀硝酸溶液中,加入5.6g铁粉充分反应后,铁粉全部溶解,生成NO,溶液质量增加3.2g,所得溶液中Fe2+和Fe3+物质的量之比为( )
A. 4∶1 B. 2∶1 C. 1∶1 D. 3∶2
6. (1)0.5mol铜片与足量的浓HNO3反应,收集到的气体经干燥后(不考虑损耗),测知其密度在标准状况下为2.5 g•L-1,其体积为 L。
(2)0.5mol铜片与一定量的浓HNO3反应,收集到的气体经干燥后(不考虑损耗)在标准状况下的体积为17.92L,则参加反应的硝酸物质的量为 ;若将这些气体完全被水吸收,则应补充标准状况下的氧气体积为 L。(不考虑2NO2 N2O4反应)
7. 已知:2 Fe2++Br2 = 2 Fe3++2Br-,若向100mLFeBr2溶液中缓缓通入2.24L标准状况下的氯气,结果有三分之一的Br-离子被氧化成Br¬2单质,试求原FeBr2溶液的物质的量浓度。
五、极值法
“极值法”即 “极端假设法”,是用数学方法解决化学问题的常用方法,一般解答有关混合物计算时采用。可分别假设原混合物是某一纯净物,进行计算,确定最大值、最小值,再进行分析、讨论、得出结论。
1. 常温下,向20L真空容器中通a mol H2S和b mol SO2(a、b都是正整数,且a≤5,b≤5),反应完全后,容器内可能达到的最大密度约是( )
(A)25.5 g•L-1 (B)14.4 g•L-1 (C)8 g•L-1 (D)5.1 g•L-1
2. 在标准状况下,将盛满NO、NO2、O2混合气的集气瓶,倒置于水槽中,完全溶解,无气体剩余,其产物不扩散,则所得溶液的物质的量浓度(C)数值大小范围为( )
(A) (B)
(C) (D)
3. 当用m mol Cu与一定量的浓HNO3反应,在标准状况下可生成nL的气体,则m与n的数值最可能的关系是( )
(A) (B) (C) (D)无法判断
4. 将一定质量的Mg、Zn、Al混合物与足量稀H2SO4反应,生成H2 2.8 L(标准状况),原混合物的质量可能是( )
A. 2g B. 4g C. 8g D. 10g
计算方法》详细答案:
一、1. 解析 混合物质量减轻是由于碳酸氢钠分解所致,固体质量差21.0g-14.8g=6.2g,也就是生成的CO2和H2O的质量,混合物中m(NaHCO3)=168×6.2g÷62=16.8g,m(Na2CO3)=21.0g-16.8g=4.2g,所以混合物中碳酸钠的质量分数为20%。
2.分析 本例是涉及溶解度的一道计算题。解答本题应具备理解透彻的概念、找准实际的差量、完成简单的计算等三方面的能力。题中告知,在100℃和30℃时,100g水中分别最多溶解KNO3246g和46g,由于冷却时溶剂的质量未变,所以温度从100℃下降到30℃时,应析出晶体246g-46g=200g(溶解度之差)。由题意又知,在温度下降过程中溶质的析出量,据此可得到比例式,求解出溶剂水的质量。再根据水的质量从而求出配制成100℃饱和溶液时溶质KNO3的质量。
解 设所用水的质量为x,根据题意,可列下式:
解得:x=250g
又设100℃时饱和溶液用KNO3的质量为y,根据溶质与溶剂的对应关系,列式如下:
解得:y=615g
答 将615KNO3溶解于250g水中。
3. 解 若金属元素R的化合价为偶数x,则其相同价态的氧化物、氯化物的化学式分别为、RClx。根据关系式 ~RClx,相对分子质量差值为 ,所以n-m=27.5x,。若金属元素R的化合价为奇数x,则其相同价态的氧化物、氯化物的化学式分别为R2Ox、RClx。由关系式R2Ox~2RClx可知,相对分子质量的差值为2×35.5x-16x=55x,所以2n-m=55x,x= 。
答 金属元素R的化合价为 或 。
二、1.分析 本例是将稀溶液浓缩的一道填空题。若按通常方法,根据溶质守恒,列方程进行求解,则解题繁。若运用十字交叉法,运算简洁,思路流畅。但应处理好蒸发掉水,或加入CuSO4粉末时CuSO4的质量分数,前者可视为0,后者视为100%。
解 (1) (负号代表蒸发) 说明水蒸发掉的质量为原溶液质量的,即25g。
(2) 说明加入12.5% CuSO4溶液的质量为原溶液质量的2倍,即100g。
(3)胆矾中CuSO4的质量分数为
说明加入胆矾的质量为原溶液质量的 ,即 。
(4) 说明加入CuSO4的质量为原溶液质量的,即 。
答 25 100 4.63 2.78
2. 解 方法1:NH4NO3中N%= =35%,CO(NH2)2中N%= =46.7%
说明NH4NO3与CO(NH2)2的物质的量之比为。
方法2:设混合物中NH4NO3的物质的量为1 mol,CO(NH2)2的物质的量为x。
根据题意,列式如下:
解得:x=1 mol
方法3:由于NH4NO3和CO(NH2)2分子中均含有2个N原子,根据混合物中N%=40%,可知该混合物的平均相对分子质量为。
说明NH4NO3与CO(NH2)2的物质的量之比为1∶1。
答 本题正确选项为(B)。
三、1. 解 NH4NO3中氮的质量分数是,而CO(NH2)2、NH4Cl、NH4HCO3和(NH4)2SO4中氮的质量分数分别是46.7%、26.2%、17.7%和21.1%,其中只有(NH4)2SO4和NH4HCO3一组氮的质量分数都小于25%。
因此,该样品中混有的一组杂质一定不是(NH4)2SO4和NH4HCO3。
答 本题正确选项为(D)。
2. 解 若95mg全是MgCl2,则其反应后产生AgCl的质量为 g•mol-1
=287mg<300mg。
根据平均含义可推知:95mg杂质与足量AgNO3溶液反应生成AgCl的质量应大于300mg。这就要求杂质中Cl元素的质量分数比MgCl2中高才有可能。因此本题转换成比较Cl元素含量的高低。现将每种的化学式作如下变形:MgCl2、Na2Cl2、Al Cl2、K2Cl2、CaCl2。显然,金属式量低的,Cl元素含量高,因此,只有AlCl3才有可能成为杂质。
答 本题正确选项为(B)。
3.略
4. 解 (1)NH4HCO3 NH3↑+H2O↑+CO2↑
根据质量守恒可知:n(NH4HCO3)•M(NH4HCO3)=n(混)• (混),故 (混)= 79
g•mol-1,即混和气体的平均相对分子质量为26.3。
(2)设爆鸣气100g,则H2的物质的量为100g×75%÷2g•mol-1=37.5mol,O2物质的量为100g×25%÷32g•mol-1=0.78mol。
故爆鸣气的平均摩尔质量为100g÷(37.5+0.78)mol=2.619g•mol-1,即对氢气的相对密度为2.619 g•mol-1÷2 g•mol-1=1.31。
(3)干燥容器中气体的平均相对分子质量为1.082×32=34.62,由34.62<36.5,故该气体应为HCl和空气的混和气体。
说明HCl与空气的体积比为5.62∶1.88=3∶1,即混和气体中HCl的体积为1L =0.75L。由于HCl气体极易溶于水,所以当喷泉结束后,进入容器中液体的体积即为HCl气体的体积0.75L。
答 (1)26.3 (2)1.31 (3)0.75L
四、1. 解析 由题意得知,铁的氧化物中的氧原子最后转移到沉淀物CaCO3中。且n(O)=n(CaCO3)=0.0075mol, m(O)=0.0075mol×16g/mol=0.12g。m(Fe)=0.4g-0.12g=0.28g,n(Fe)=0.005mol。n(Fe)∶n(O)=2:3,选B
2. 解析 铁的氧化物中含Fe和O两种元素,由题意,反应后,HCl中的H全在水中,O元素全部转化为水中的O,由关系式:2HCl~H2O~O,得:n(O)= ,m(O)=0.35mol×16g•mol―1=5.6 g;
而铁最终全部转化为FeCl3,n(Cl)=0.56L ÷22.4L/mol×2+0.7mol=0.75mol,n(Fe)= ,m(Fe)=0.25mol×56g•mol―1=14 g,则 ,选B。
3. 解析 粗看题目,这是一利用关系式进行多步计算的题目,操作起来相当繁琐,但如能仔细阅读题目,挖掘出隐蔽条件,不难发现,反应后只有Na2SO4存在于溶液中,且反应过程中SO42―并无损耗,根据电中性原则:n(SO42―)= n(Na+),则原硫酸的浓度为:2mol/L,故选C。
4. 分析 本例是镁及其化合物有关性质应用的一道计算题。本题涉及的反应较多,有2Mg+O2 2MgO,3Mg+N2 Mg3N2,MgO+2HCl = MgCl2+H2O,Mg3N2+8HCl = 3MgCl2+2NH4Cl,NaOH+HCl = NH4Cl等反应。若用常规方法审题和解题,则分析要求高,计算难度大,思维易混乱,很难正确解答本题。现运用图示法审题如下:
发现:MgCl2、NH4Cl、NaCl溶液中,阴阳离子电荷浓度(或物质的量)相等即电荷守恒,再根据相关微粒的物质的量守恒,列出等式,从而一举突破,从容解答本题。
解 根据图示,对MgCl2、NH4Cl、NaCl溶液分析,由电荷守恒得知:
式中:
解得: ,即
5. 解析 设Fe2+为xmol,Fe3+为ymol,则:
x+y= =0.1(Fe元素守恒)
2x+3y= (得失电子守恒)
得:x=0.06mol,y=0.04mol。则x∶y=3∶2。故选D。
6. 解 (1)Cu与浓HNO3反应的化学方程式为:Cu+4HNO3(浓) = Cu(NO3)2+2NO2↑+2H2O,因是足量的浓硝酸,故还原产物只是NO2。理论上讲,0.5mol Cu可得1mol NO2气体。由于气体的密度在标准状况下为2.5g•L-1,即摩尔质量M= g•L-1 22.4 L•mol-1=56g•mol-1。显然,56g•mol-1大于M(NO2)(46 g•mol-1),因此,不能认为收集到的气体全是NO2,应考虑平衡2NO2 N2O4的存在。所以收集到的气体是NO2和N2O4的混合气体。根据质量守恒,混合气体的质量应等于1 mol NO2气体的质量即为46g,所以混和气体的体积为46g 2.5g•L-1=18.4L。
(2)Cu与浓HNO3反应的化学方程式为:Cu+4HNO3(浓) = Cu(NO3)2+2NO2↑+2H2O,因是一定量的浓HNO3,随着反应的进行,浓HNO3逐渐变成了稀HNO3,此时反应的化学方程式为:3Cu+8HNO3(稀)=3Cu(NO3)2+2NO↑+4H2O,故收集到的气体应是NO和NO2的混合气体。无法得知NO和NO2各自的物质的量,但它们物质的量之和为17.92L 22.4 L•mol-1=0 .8mol。根据N元素守恒,参加反应的硝酸的物质的量为2n[Cu(NO3)2]+n(NO)+
n(NO2)=2 0.5mol+0.8mol=1.8mol。
补充O2,NO和NO2被水吸收的化学方程式为:4NO+3O2+2H2O=4HNO3,4NO2+O2+2H2O = 4HNO3,从整个氧化还原过程来看,HNO3并没有参加反应,参加的只是Cu与O2。因此,根据电子守恒,可列下式:
解得:V=5.6L
答 (1)18.4L;(2)1.8mol,5.6L
7. 分析 本例是有关氧化还原反应的一道计算题,涉及氧化还原的选择性(即反应的先后顺序)、进程性(即氧化剂或还原剂的量控制着反应的进程)和整体性(即无论有几个氧化还原反应发生,始终存在氧化剂所得电子数等于还原剂所失电子数,或称电子守恒)。根据题意分析,可知Fe2+与Br-还原能力大小为Fe2+ >Br-。因此,在FeBr2溶液中通入Cl2时,首先发生:Cl2+2Fe2+ = 2Fe3++2Cl -,然后再发生:Cl2+2 Br- = Br2+2Cl -。根据Cl2用量控制反应进程,所以Fe2+和Br-失去电子数目应等于Cl2得到电子数目。据此守恒关系,列出等式,很易求解。
解 设FeBr2物质的量浓度为C,由电子守恒可知:
解得:C=1.2 mol•L-1
答 原FeBr2溶液的物质的量浓度为1.2mol•L-1。
五、1. 本题提供的思路是运用极限法来分析求解。因为M(SO2)>M(H2S),要达到最大密度,必然剩余SO2气体,且物质的量为最多,因此极端考虑,起始时,SO2物质的量取最大(5mol),H2S物质的量取最小(1 mol),故反应后剩余SO2为 ,密度为 。所以(B)选项为本题正确答案。
答 本题正确选项为(B)。
2. (B) 3.略
4. 解析本题给出的数据不足,故不能求出每一种金属的质量,只能确定取值范围。三种金属中产生等量的氢气质量最大的为锌,质量最小的为铝。故假设金属全部为锌可求的金属质量为8.125g,假设金属全部为铝可求的金属质量为2.25g,金属实际质量应在2.25g ~8.125g之间。故答案为B、C。
六、1. 解析 根据化学方程式,可以找出下列关系:FeS2~2SO2~2SO3~2H2SO4,本题从FeS2制H2SO4,是同种元素转化的多步反应,即理论上FeS2中的S全部转变成H2SO4中的S。得关系式FeS2~2H2SO4。过程中的损耗认作第一步反应中的损耗,得可制得98%硫酸的质量是 =3.36 。
七、1. 解析 CO和H2都有两步反应方程式,量也没有确定,因此逐步计算比较繁。Na2O2足量,两种气体完全反应,所以将每一种气体的两步反应合并可得H2+Na2O2=2NaOH,CO+ Na2O2=Na2CO3,可以看出最初的气体完全转移到最后的固体中,固体质量当然增加2.1g。选A。此题由于CO和H2的量没有确定,两个合并反应不能再合并!
八、1. 解析 变化主要过程为:
由题意得:Fe2O3与合金的质量相等,而铁全部转化为Fe2O3,故合金中Al的质量即为Fe2O3中氧元素的质量,则可得合金中铝的质量分数即为Fe2O3中氧的质量分数,O%= ×100%=30%,选B。
九、1. 解析 。由题意,生成0.5mol H2,金属失去的电子即为1mol,即合金的平均摩尔电子质量为10g/mol,镁、铝、铁、锌的摩尔电子质量分别为:12、9、28、32.5(单位:g/mol),由平均值可知,混合物中一种金属的摩尔电子质量小于10g/mol,另一种大于10g/mol。故选A、C
十、1. 分析 本例是一道结合讨论分析的天平平衡题,考查了在化学解题过程中的有序思维和问题解决的完整性。反应后天平仍然平衡,说明天平左右两端加入金属的质量与放出氢气的质量数差值应相等。但不知镁粉、铝粉与盐酸的量相对大小,所以必须通过讨论判断谁过量,从而以另一方计算产生H2的质量。因此如何判断谁过量是解决本题的关键,另外,还需时刻注意调整a的取值范围(由b的取值范围及a和b的关系确定),才能得到本题完整解答,这一点在解题过程中是被常疏忽的。
解 根据题意,题中发生的两个反应为:
Mg+2HCl = MgCl2+H2↑ 2Al+6HCl = 2AlCl3+3H2↑
若盐酸完全反应,所需Mg粉质量为 ,所需铝粉质量为 。
(1)当a≥12g,b≥9g,即盐酸适量或不足,产生H2的质量应以HCl的量计算,因HCl的量是一定的,故产生H2的质量相等,要使天平平衡,即要求金属的质量相等,所以a=b,此时b的范围必须调整为b≥12g。
(2)当a<12g,b<9g,即Mg、Al不足,应以其计算产生H2的量。要使天平平衡,即要有:,解得: ,此时a的范围必须调整为a<8.7g。
(3)当a<12g,b≥9g,即Mg不足,应以Mg算;Al过量或适量,以HCl算。要使天平平衡,必须满足:
,解得: ,据(1)、(2)调整a的范围为8.7g≤a<12g。
答 (1)当a≥12g时,a=b;(2)当8.7g<a<12g时,;(3)当0<a<8.7g时, 。
《常见化学计算方法》答案
一、1. 20% 2. 将615KNO3溶解于250g水中 3. R的化合价为 或。
4. 解:设Mg、Al、Fe的质量分别为x、y、z,故三者反应结束后,溶液质量增加为 x、 y、 z且相等,故有:,所以y>x>z。
5. 解 (1)水参加反应的质量为0.9g,则Na2CO3的质量为,NaHCO3的质量为9.5-5.3g=4.2g。(2)碱石灰中CaO的质量为,NaOH的质量为9.6g-5.6g=4.0g。 6. 原混和物中CuSO4和Fe的质量分别为8.0g,4.8g。
二、1. 答 25 100 4.63 2.78 2. B
3.(1)等体积混和后,所得溶液质量分数应大于10x%。
(2) %的氨水物质的量浓度应大于 mol•L-1。
4. 该产物中Na2O的物质的量分数为20%。
5. n(Na2CO3)= 0.8 mol=0.2 mol,n(NaHCO3)= 0.8 mol=0.6 mol。
三、1. D 2.B 3.略
4. (1)26.3 (2)1.31 (3)0.75L
四、1. B 2. B 3. C
4. ,即 5. D
6. (1)18.4L;(2)1.8mol,5.6L
7. 原FeBr2溶液的物质的量浓度为1.2mol•L-1。
五、1. B 2. B 3.略 4. B C
‘肆’ HFSS算法及应用场景介绍
安氏
前言
相信每一位使用过HFSS的工程师都有一个疑问或者曾经有一个疑问:我怎么才能使用HFSS计算的又快又准?对使用者而言,每个工程师遇到的工程问题不一样,工程经验不能够直接复制;对软件而言,随着HFSS版本的更新,HFSS算法越来越多,针对不同的应用场景对应不同的算法。因此,只有实际工程问题切合合适的算法,才能做到速度和精度的平衡。工程师在了解软件算法的基础上,便能够针对自己的需求进行很好的算法选择。
由于当今世界计算机的飞速发展,让计算电磁学这门学科也有了很大的发展,如图1所示,从大的方面来看,我们将计算电磁学分为精确的全波算法和高频近似算法,在每一类下面又分了很多种算法,结合到HFSS软件,通过ANSYS公司40余年来坚持不懈的研发和战略性的收购,到目前为止,HFSS有FEM、IE(MoM)、DGTD、PO、SBR+等算法,本文会针对每种算法和应用场景逐一介绍,相信你看完这篇文章应该对HFSS算法和应用场景会有更深的认识。
算法介绍
全波算法-有限元算法( FEM)
有限元算法是ANSYS HFSS的核心算法,已有二十多年的商用历史,也是目前业界最成熟稳定的三维电磁场求解器,有限元算法的优点是具有极好的结构适应性和材料适应性,充分考虑材料特性:趋肤效应、介质损耗、频变材料;是精确求解复杂材料复杂结构问题的最佳利器,有限元算法采用四面体网格,对仿真物体能够很好的进行还原。
FEM算法的支配方程见下图:
HFSS有限元算法在网格划分方面能够支持自适应网格剖分、网格加密、曲线型网格,在求解时支持切向矢量基函数、混合阶基函数和直接法、迭代法、区域分解法的强大的矩阵求解技术。
在应用领域,HFSS主要针对复杂结构进行求解,尤其是对于一些内部问题的求解,比高速信号完整性分析,阵列天线设计,腔体问题及电磁兼容等应用场景,非常适合有限元算法求解。
有限元算法结合ANSYS公司的HPC模块,ANSYS HFSS有限元算法可以进行电大尺寸物体的计算,大幅度提升仿真工程师的工作效率。针对宽带问题,FEM推出了宽带自适应网格剖分,大大提升了仿真精度。
全波算法-积分方程算法( IE)
积分方程算法基于麦克斯维方程的积分形式,同时也基于格林函数,所以可自动满足辐射边界条件,对于简单模型及材料的辐射问题,具有很大的优势,但原始的积分方程法计算量太大,很难用于实际的数值计算中,针对此问题, HFSS 中的 IE算法提供了两种加速算法,一种是 ACA 加速,一种是 MLFMM,分布针对不同的应用类型。 ACA 方法基于数值层面的加速技术,具有更好的普适性,但效率相比 MLFMM 稍差, MLFMM 算法基于网格层面的加速,对金属材料,松散结构,具有更高的效率。
IE算法的支配方程见下图:
IE算法是三维矩量法积分方程技术,支持三角形网格剖分。IE算法不需要像FEM算法一样定义辐射边界条件,在HFSS中主要用于高效求解电大尺寸、开放结构问题。与HFSS FEM算法一样,支持自适应网格技术,也可以高精度、高效率解决客户问题,同时支持将FEM的场源链接到IE中进行求解。HFSS-IE算法对金属结构具有很高的适应性,其主要应用领域天线设计、天线布局、 RCS、 EMI/EMC仿真等方向。
高频近似算法-PO算法
FEM算法和IE算法是精确的全波算法,在超大电尺寸问题上,使用精确全波算法会造成效率的降低。针对超大电尺寸问题,ANSYS推出PO(物理光学法)算法,PO 算法属于高频算法,非常适合求解此类问题,在适合其求解的问题中,具有非常好的效率优势。
PO算法主要原理为射线照射区域产生感应电流,而且在阴影区域设置为零电流,不考虑射线追迹或多次反射,以入射波作为激励源,将平面波或链接FEM(IE)的场数据作为馈源。但由于不考虑射线的多次反射和绕射等现象,一般针对物理尺寸超大,结构均匀的物体电磁场计算,在满足精度的要求,相比全波算法效率明显提高。比如大平台上的天线布局,大型反射面天线等等。
高频近似算法-SBR+算法
PO算法可以解决超大电尺寸问题的计算,但由于未考虑到多次反射等物理物体,主要用于结构均匀物理的电磁场计算。针对复杂结构且超大电尺寸问题,ANSYS通过收购Delcross公司(Savant软件)引入了SBR+算法, SBR+是在SBR算法(天线发射出射线,在表面“绘制” PO电流)的基础上考虑了爬行波射线(沿着表面追迹射线)、物理绕射理论PTD(修正边缘处的PO电流)、一致性绕射理论UTD(沿着边缘发射衍射射线,绘制阴影区域的电流),因此SBR+算法是高频射线方法,具有非常高效的速度,同时具有非常好的精度,在大型平台的天线布局中效果非常好。
SBR+支持从FEM、IE中导入远场辐射方向图或者电流源,也支持导入相应的测试数据,SBR+算法主要用于天线安装分析,支持多核、GPU等并行求解方式并且大多数任务可在低于8 GB内存下完成。
混合算法( FEBI, IE-Region,PO-Region,SBR+ Region)
前面对频率内的各种算法做了介绍并说明了各种算法应用的场景,很多时候碰到的工程问题既包括复杂结构物理也包括超大尺寸物理,如新能源汽车上的天线布局问题,对仿真而言,最好的精度是用全波算法求解,最快的速度是采用近似算求解,针对该问题,ANSYS公司将FEM算法、 IE 算法、PO 算法、SBR+算法等融合起来,推出混合算法。在一个应用案例中,采用不同算法的优点而回避不同算法的缺点,可极大限度的提高算法的效率,以及成为频域内解决大型复杂问题的必备算法。
HFSS中FEM与IE可以通过IE Region与FEBI边界进行混合求解,FEM与PO、SBR+算法可以通过添加PO Region及SBR+ Region进行混合,混合算法的使用扩大了HFSS的使用范围。
时域算法-transient算法
HFSS时域求解是基于间断伽略金法(discontinuous Galerkin method, DGTD)的三维全波电磁场仿真求解器,采用基于四面体有限元技术,能得到和HFSS频域求解器一样的自适应网格剖分精度,该技术使得HFSS的求精精度成为电磁场行业标准。这项技术完善了HFSS的频域求解器技术,帮助工程师对更加深入详细了解其所设计器件的电磁性能。
Transient算法支配方程见下图:
采用HFSS-Transient算法,工程师可利用短脉冲激励对静电放电、电磁干扰、雷击和等应用问题开展研究,还包括时域反射阻抗以及短时激励下的瞬态场显示也可以借助它来完成。
谐振分析-Eigenmode算法
谐振特性是每个结构都存在固有的电磁谐振,谐振的模式、频率和品质因子,与其结构尺寸相关,这些谐振既可能是干扰源的放大器,也可能是敏感电路的噪声接收器。谐振会导致信号完整性、电源完整性和电磁兼容问题,因而了解谐振对加强设计可靠性很有帮助。
Eigenmode算法支配方程见下图:
在HFSS中,使用eigenmode算法可计算三维结构谐振模式,并可呈现图形化空间的谐振电压波动,分析结构的固有谐振特性。依据谐振分析的结果,指导机箱内设备布局和PCB层叠布局,改善电磁兼容特性。
总结
HFSS里面有各种不同的算法,有全波算法、近似算法以及时域算法,工程师可以格局需要选择不同算法(最高的精度和最高的效率)。首先针对频域算法,使用范围见图14,通常FEM算法和IE算法非常适合于中小尺寸问题,对大型问题,FEM/IE运行时间/内存需求非常巨大; PO方法适合解决超大电尺寸问题,但对问题复杂度有限制,通常通常不能提供客户所期望的精度,但对于均匀物体是一个很好的选择;SBR+算法适合解决超大电尺寸问题,对复杂结构也能够提供很好的精度和速度;针对既有电小尺寸复杂结构计算问题,又有电大尺寸布局计算问题,混合算法是一个很好的选择。Transient算法适合解决与时间相关的电磁场问题,如ESD、TDR等;Eigenmode算法专门针对谐振仿真。
想要更多,点击此处,关注技术邻官网
‘伍’ 不锈钢板的计算方法
Steel GradeDensity(g/cm3)钢 号密 度304,304L,305,321
201,202,301,3027.93316,316L,347
309S,310S7.98405,410,4207.75409,430,4347.7
以下用实例来解析不锈钢板重量计算方法
例如要计算一块2mm厚度,规格为1220mm*2440mm,材质是304不锈钢板的重量是多少?可以这样计算
重量=2mmx1220mmx2440mm,2x1.22x2.44x7.93=47.21公斤
钢板是用钢水浇注,冷却后压制而成的平板状钢材。钢板是平板状,矩形的,可直接轧制或由宽钢带剪切而成。那么,你知道不锈钢板重量计算公式是什么吗?不了解的朋友可以看看下面的介绍。
不锈钢板重量计算公式大全
钢板重量计算公式:
钢板重量(公斤)=7.85×厚度×长×宽(表示法:δ厚度×宽×长=几件)
钢管重量(公斤)=0.00617×直径×直径×长度
方钢重量(公斤)=0.00785×边宽×边宽×长度
六角钢重量(公斤)=0.0068×对边宽×对边宽×长度
八角钢重量(公斤)=0.0065×对边宽×对边宽×长度
螺纹钢重量(公斤)=0.00617×计算直径×计算直径×长度
角钢重量(公斤)=0.00785×(边宽+边宽-边厚)×边厚×长度
扁钢重量(公斤)=0.00785×厚度×边宽×长度
钢管重量(公斤)=0.02466×壁厚×(外径-壁厚)×长度
不锈钢板重量计算公式大全
园紫铜棒重量(公斤)=0.00698×直径×直径×长度
园黄铜棒重量(公斤)=0.00668×直径×直径×长度
园铝棒重量(公斤)=0.0022×直径×直径×长度
方紫铜棒重量(公斤)=0.0089×边宽×边宽×长度
方黄铜棒重量(公斤)=0.0085×边宽×边宽×长度
方铝棒重量(公斤)=0.0028×边宽1×边宽×长度
六角紫铜棒重量(公斤)=0.0077×对边宽×对边宽×长度
六角黄铜棒重量(公斤)=0.00736×边宽×对边宽×长度
六角铝棒重量(公斤)=0.00242×对边宽×对边宽×长度
紫铜板重量(公斤)=0.0089×厚×宽×长度
不锈钢板重量计算公式大全
黄铜板重量(公斤)=0.0085×厚×宽×长度
铝板重量(公斤)=0.00171×厚×宽×长度
园紫铜管重量(公斤)=0.028×壁厚×(外径-壁厚)×长度
园黄铜管重量(公斤)=0.0267×壁厚×(外径-壁厚)×长度
园铝管重量(公斤)=0.00879×壁厚×(外径-壁厚)×长度
园钢重量(公斤)=0.00617×直径×直径×长度
注:公式中长度单位为米,面积单位为平方米,其余单位均为毫米
长方形的面积=长×宽 正方形的面积=边长×边长 三角形的面积=底×高÷2 圆的面积=圆周率×半径×半径 三角形的面积=底×高÷2
1吨(t)=1000千克(kg) 1米=100厘米 1 米=1000毫米
钢板理论重量表及规格表
简单而言,钢板就是厚度与宽度、长度比相差较大的平板钢材。它可直接轧制或由宽钢带剪切而成,在建筑中用途广泛。这里,我们将以表格的形式给出钢板的理论重量表和规格表
‘陆’ excel求和公式
在EXCEL工作表中可以用SUM函数或“+”符号进行求和运算。
如:=A1+A2+A3+B1+B2+B3用SUM函数可以写成:=SUM(A1:B3)
操作方法如下:
1、首先点击excl
功能简介:
SUM函数是一个数学和三角函数,可将值相加。 可以将单个值、单元格引用或是区域相加,或者将三者的组合相加。
(1)语法:SUM(number1,[number2],...)
number1 (必需参数)要相加的第一个数字。 该数字可以是 数字,或Excel中A1 之类的单元格引用或 A2:A8 之类的单元格范围。
number2,这是要相加的第二个数字。
(2) 说明
1、逻辑值及数字的文本表达式将被计算;
2、如果参数为数组或引用,只有其中的数字将被计算。数组或引用中的空白单元格、逻辑值、文本将被忽略;
3、如果参数中有错误值或为不能转换成数字的文本,将会导致错误。
以上内容参考:网络--sum
‘柒’ 想问一下有没有比较方便的人脸识别算法,求推荐
主流的人脸识别技术基本上可以归结为三类,即:基于几何特征的方法、基于模板的方法和基于模型的方法。
1. 基于几何特征的方法是最早、最传统的方法,通常需要和其他算法结合才能有比较好的效果;
2. 基于模板的方法可以分为基于相关匹配的方法、特征脸方法、线性判别分析方法、奇异值分解方法、神经网络方法、动态连接匹配方法等。
3. 基于模型的方法则有基于隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。
1. 基于几何特征的方法
人脸由眼睛、鼻子、嘴巴、下巴等部件构成,正因为这些部件的形状、大小和结构上的各种差异才使得世界上每个人脸千差万别,因此对这些部件的形状和结构关系的几何描述,可以做为人脸识别的重要特征。几何特征最早是用于人脸侧面轮廓的描述与识别,首先根据侧面轮廓曲线确定若干显着点,并由这些显着点导出一组用于识别的特征度量如距离、角度等。Jia 等由正面灰度图中线附近的积分投影模拟侧面轮廓图是一种很有新意的方法。
采用几何特征进行正面人脸识别一般是通过提取人眼、口、鼻等重要特征点的位置和眼睛等重要器官的几何形状作为分类特征,但Roder对几何特征提取的精确性进行了实验性的研究,结果不容乐观。
可变形模板法可以视为几何特征方法的一种改进,其基本思想是 :设计一个参数可调的器官模型 (即可变形模板),定义一个能量函数,通过调整模型参数使能量函数最小化,此时的模型参数即做为该器官的几何特征。
这种方法思想很好,但是存在两个问题,一是能量函数中各种代价的加权系数只能由经验确定,难以推广,二是能量函数优化过程十分耗时,难以实际应用。 基于参数的人脸表示可以实现对人脸显着特征的一个高效描述,但它需要大量的前处理和精细的参数选择。同时,采用一般几何特征只描述了部件的基本形状与结构关系,忽略了局部细微特征,造成部分信息的丢失,更适合于做粗分类,而且目前已有的特征点检测技术在精确率上还远不能满足要求,计算量也较大。
2. 局部特征分析方法(Local Face Analysis)
主元子空间的表示是紧凑的,特征维数大大降低,但它是非局部化的,其核函数的支集扩展在整个坐标空间中,同时它是非拓扑的,某个轴投影后临近的点与原图像空间中点的临近性没有任何关系,而局部性和拓扑性对模式分析和分割是理想的特性,似乎这更符合神经信息处理的机制,因此寻找具有这种特性的表达十分重要。基于这种考虑,Atick提出基于局部特征的人脸特征提取与识别方法。这种方法在实际应用取得了很好的效果,它构成了FaceIt人脸识别软件的基础。
3. 特征脸方法(Eigenface或PCA)
特征脸方法是90年代初期由Turk和Pentland提出的目前最流行的算法之一,具有简单有效的特点, 也称为基于主成分分析(principal component analysis,简称PCA)的人脸识别方法。
特征子脸技术的基本思想是:从统计的观点,寻找人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以此近似地表征人脸图像。这些特征向量称为特征脸(Eigenface)。
实际上,特征脸反映了隐含在人脸样本集合内部的信息和人脸的结构关系。将眼睛、面颊、下颌的样本集协方差矩阵的特征向量称为特征眼、特征颌和特征唇,统称特征子脸。特征子脸在相应的图像空间中生成子空间,称为子脸空间。计算出测试图像窗口在子脸空间的投影距离,若窗口图像满足阈值比较条件,则判断其为人脸。
基于特征分析的方法,也就是将人脸基准点的相对比率和其它描述人脸脸部特征的形状参数或类别参数等一起构成识别特征向量,这种基于整体脸的识别不仅保留了人脸部件之间的拓扑关系,而且也保留了各部件本身的信息,而基于部件的识别则是通过提取出局部轮廓信息及灰度信息来设计具体识别算法。现在Eigenface(PCA)算法已经与经典的模板匹配算法一起成为测试人脸识别系统性能的基准算法;而自1991年特征脸技术诞生以来,研究者对其进行了各种各样的实验和理论分析,FERET'96测试结果也表明,改进的特征脸算法是主流的人脸识别技术,也是具有最好性能的识别方法之一。
该方法是先确定眼虹膜、鼻翼、嘴角等面像五官轮廓的大小、位置、距离等属性,然后再计算出它们的几何特征量,而这些特征量形成一描述该面像的特征向量。其技术的核心实际为“局部人体特征分析”和“图形/神经识别算法。”这种算法是利用人体面部各器官及特征部位的方法。如对应几何关系多数据形成识别参数与数据库中所有的原始参数进行比较、判断与确认。Turk和Pentland提出特征脸的方法,它根据一组人脸训练图像构造主元子空间,由于主元具有脸的形状,也称为特征脸 ,识别时将测试 图像投影到主元子空间上,得到一组投影系数,和各个已知人的人脸图像比较进行识别。Pentland等报告了相当好的结果,在 200个人的 3000幅图像中得到 95%的正确识别率,在FERET数据库上对 150幅正面人脸象只有一个误识别。但系统在进行特征脸方法之前需要作大量预处理工作如归一化等。
在传统特征脸的基础上,研究者注意到特征值大的特征向量 (即特征脸 )并不一定是分类性能好的方向,据此发展了多种特征 (子空间 )选择方法,如Peng的双子空间方法、Weng的线性歧义分析方法、Belhumeur的FisherFace方法等。事实上,特征脸方法是一种显式主元分析人脸建模,一些线性自联想、线性压缩型BP网则为隐式的主元分析方法,它们都是把人脸表示为一些向量的加权和,这些向量是训练集叉积阵的主特征向量,Valentin对此作了详细讨论。总之,特征脸方法是一种简单、快速、实用的基于变换系数特征的算法,但由于它在本质上依赖于训练集和测试集图像的灰度相关性,而且要求测试图像与训练集比较像,所以它有着很大的局限性。
基于KL 变换的特征人脸识别方法
基本原理:
KL变换是图象压缩中的一种最优正交变换,人们将它用于统计特征提取,从而形成了子空间法模式识别的基础,若将KL变换用于人脸识别,则需假设人脸处于低维线性空间,且不同人脸具有可分性,由于高维图象空间KL变换后可得到一组新的正交基,因此可通过保留部分正交基,以生成低维人脸空间,而低维空间的基则是通过分析人脸训练样本集的统计特性来获得,KL变换的生成矩阵可以是训练样本集的总体散布矩阵,也可以是训练样本集的类间散布矩阵,即可采用同一人的数张图象的平均来进行训练,这样可在一定程度上消除光线等的干扰,且计算量也得到减少,而识别率不会下降。
4. 基于弹性模型的方法
Lades等人针对畸变不变性的物体识别提出了动态链接模型 (DLA),将物体用稀疏图形来描述 (见下图),其顶点用局部能量谱的多尺度描述来标记,边则表示拓扑连接关系并用几何距离来标记,然后应用塑性图形匹配技术来寻找最近的已知图形。Wiscott等人在此基础上作了改进,用FERET图像库做实验,用 300幅人脸图像和另外 300幅图像作比较,准确率达到 97.3%。此方法的缺点是计算量非常巨大 。
Nastar将人脸图像 (Ⅰ ) (x,y)建模为可变形的 3D网格表面 (x,y,I(x,y) ) (如下图所示 ),从而将人脸匹配问题转化为可变形曲面的弹性匹配问题。利用有限元分析的方法进行曲面变形,并根据变形的情况判断两张图片是否为同一个人。这种方法的特点在于将空间 (x,y)和灰度I(x,y)放在了一个 3D空间中同时考虑,实验表明识别结果明显优于特征脸方法。
Lanitis等提出灵活表现模型方法,通过自动定位人脸的显着特征点将人脸编码为 83个模型参数,并利用辨别分析的方法进行基于形状信息的人脸识别。弹性图匹配技术是一种基于几何特征和对灰度分布信息进行小波纹理分析相结合的识别算法,由于该算法较好的利用了人脸的结构和灰度分布信息,而且还具有自动精确定位面部特征点的功能,因而具有良好的识别效果,适应性强识别率较高,该技术在FERET测试中若干指标名列前茅,其缺点是时间复杂度高,速度较慢,实现复杂。
5. 神经网络方法(Neural Networks)
人工神经网络是一种非线性动力学系统,具有良好的自组织、自适应能力。目前神经网络方法在人脸识别中的研究方兴未艾。Valentin提出一种方法,首先提取人脸的 50个主元,然后用自相关神经网络将它映射到 5维空间中,再用一个普通的多层感知器进行判别,对一些简单的测试图像效果较好;Intrator等提出了一种混合型神经网络来进行人脸识别,其中非监督神经网络用于特征提取,而监督神经网络用于分类。Lee等将人脸的特点用六条规则描述,然后根据这六条规则进行五官的定位,将五官之间的几何距离输入模糊神经网络进行识别,效果较一般的基于欧氏距离的方法有较大改善,Laurence等采用卷积神经网络方法进行人脸识别,由于卷积神经网络中集成了相邻像素之间的相关性知识,从而在一定程度上获得了对图像平移、旋转和局部变形的不变性,因此得到非常理想的识别结果,Lin等提出了基于概率决策的神经网络方法 (PDBNN),其主要思想是采用虚拟 (正反例 )样本进行强化和反强化学习,从而得到较为理想的概率估计结果,并采用模块化的网络结构 (OCON)加快网络的学习。这种方法在人脸检测、人脸定位和人脸识别的各个步骤上都得到了较好的应用,其它研究还有 :Dai等提出用Hopfield网络进行低分辨率人脸联想与识别,Gutta等提出将RBF与树型分类器结合起来进行人脸识别的混合分类器模型,Phillips等人将MatchingPursuit滤波器用于人脸识别,国内则采用统计学习理论中的支撑向量机进行人脸分类。
神经网络方法在人脸识别上的应用比起前述几类方法来有一定的优势,因为对人脸识别的许多规律或规则进行显性的描述是相当困难的,而神经网络方法则可以通过学习的过程获得对这些规律和规则的隐性表达,它的适应性更强,一般也比较容易实现。因此人工神经网络识别速度快,但识别率低 。而神经网络方法通常需要将人脸作为一个一维向量输入,因此输入节点庞大,其识别重要的一个目标就是降维处理。
PCA的算法描述:利用主元分析法 (即 Principle Component Analysis,简称 PCA)进行识别是由 Anderson和 Kohonen提出的。由于 PCA在将高维向量向低维向量转化时,使低维向量各分量的方差最大,且各分量互不相关,因此可以达到最优的特征抽取。