认真思考,给出下列题目的答案。1.Cr的晶格常数a=0.2884nm,密度p=7.19g/cm3,试...
बनाया गया: 13 मार्च 2025
बनाया गया: 13 मार्च 2025
认真思考,给出下列题目的答案。1.Cr的晶格常数a=0.2884nm,密度p=7.19g/cm3,试确定Cr的晶体结构。(Cr的相对原子质量为52)
2.面心立方晶体中(100)(110)(111)的面致密度分别为多少?
pythonimport math # Given data a_nm = 0.2884 # nm a_cm = a_nm*1e-7 # convert nm to cm M = 52 # g/mol (atomic mass) Na = 6.022e23 # Avogadro constant rho_known = 7.19 # g/cm^3 def density(n, a_cm, M): return (n*M)/(Na*(a_cm**3)) # check for bcc => n=2 rho_bcc = density(2, a_cm, M) rho_bcc 7.199574332640786
pythonimport numpy as np a=1.0 # define fcc lattice points inside the cell [0,1]^3 with basis basis = np.array([[0,0,0], [0.5,0.5,0], [0.5,0,0.5], [0,0.5,0.5]]) # We'll replicate the cell in a range of -1..2 in integer steps: coords=[] for i in range(-1,2): for j in range(-1,2): for k in range(-1,2): for b in basis: p = b + np.array([i,j,k],dtype=float) coords.append(p) coords = np.array(coords) def in_plane(coords, normal, d=0.0, tol=1e-6): # normal dot coords = d ndot = coords.dot(normal) return np.abs(ndot - d)<tol def reduce_2d_lattice(pts, v1, v2): # We want to get the distinct points modulo integer combos of v1,v2 # We'll represent each point in the basis of v1,v2, find fractional coords in [0,1). # Then collect unique points by rounding. # first form the 2x2 matrix M with columns v1,v2 (in 2D but we have them in 3D) # We'll do: alpha,beta = solve( [v1,v2], p ), we only need projection in plane V = np.array([v1, v2]).T # 3x2 # we can't invert a 3x2, but we can do a least-squares solve or maybe a pseudo-inverse Vpinv = np.linalg.pinv(V) # shape 2x3 frac = [] for p in pts: # project p onto v1,v2 ab = Vpinv.dot(p) # reduce into [0,1) ab_mod = ab - np.floor(ab) # or we can keep them in 0..1. frac.append(ab_mod) frac = np.array(frac) # round them to some tolerance # then find unique frac_rounded = np.round(frac,5) # 5 decimal digits unique_frac = np.unique(frac_rounded, axis=0) return unique_frac def area_parallelogram(v1, v2): # area = ||v1 x v2|| return np.linalg.norm(np.cross(v1, v2)) # We'll define a function to compute planar density for a plane (h,k,l) in an FCC lattice: def fcc_planar_density(h,k,l): # normal in integer ratio normal = np.array([h,k,l],dtype=float) # pick a plane through origin => d=0 # gather all points that lie in that plane plane_pts = coords[in_plane(coords, normal, 0.0, tol=1e-6)] # next we want to find 2D lattice vectors that span that plane # we can pick two vectors orthonormal to normal # for convenience we pick e1,e2 using Gram-Schmidt n = normal / np.linalg.norm(normal) # pick some vector not parallel to n # for example for (h,k,l) let's pick x-axis if not parallel test = np.array([1,0,0],dtype=float) if abs(np.dot(test,n))>0.99: test = np.array([0,1,0],dtype=float) e1 = test - np.dot(test,n)*n e1 = e1/np.linalg.norm(e1) e2 = np.cross(n, e1) # now e1,e2 is an orthonormal basis for the plane # But we want the 2D lattice vectors in real space that generate the entire lattice in that plane # We can attempt to find the shortest nonzero lattice vectors among plane_pts that connect them # This might get complicated. Let's do a simpler approach: # We'll attempt to find the 2D primitive cell by searching among plane_pts for small difference vectors # We'll only look in a certain range diffs = [] for i in range(len(plane_pts)): for j in range(i+1,len(plane_pts)): diff = plane_pts[j]-plane_pts[i] # project diff onto plane diff_in_plane = diff - np.dot(diff,n)*n length = np.linalg.norm(diff_in_plane) if length>1e-6 and length<2.0: diffs.append(diff_in_plane) diffs = np.array(diffs) # now we want to find a pair that forms a primitive cell # let's try to pick the two shortest independent vectors # sort by length lengths = np.linalg.norm(diffs,axis=1) idx_sort = np.argsort(lengths) # We'll do a naive approach: pick the first vector as the shortest, then pick the next that is not collinear v1 = diffs[idx_sort[0]] v1 /= np.linalg.norm(v1) v2 = None for i in idx_sort[1:]: cand = diffs[i] cand_norm = np.linalg.norm(cand) cand_dir = cand/cand_norm # check if dot with v1 is near 1 or 0 if abs(np.dot(v1,cand_dir))<0.99: v2 = cand break # we have v1 length 1, but let's restore original length v1 = diffs[idx_sort[0]] if v2 is None: # fallback v2 = diffs[idx_sort[1]] # area A = np.linalg.norm(np.cross(v1,v2)) # now let's count how many distinct atoms in one parallelogram spanned by v1,v2 # reduce plane_pts mod v1,v2 unique_frac = reduce_2d_lattice(plane_pts, v1, v2) # number of unique fractional coords is the # of distinct lattice points in that 2D cell N = len(unique_frac) # so planar density = N / A return N/A for hkl in [(1,0,0),(1,1,0),(1,1,1)]: pd = fcc_planar_density(*hkl) print(f"(hkl)={hkl}, PD={pd}")
解答思路与结果如下:
给定数据:
若假设晶体为某种立方结构(如简单立方 SC、体心立方 BCC 或面心立方 FCC),则其理论密度可以用下式计算:
其中,
将铬视为 BCC,则一个体心立方晶胞中含有 个原子。代入上式计算,理论密度与题给 7.19 g/cm^3 非常吻合。实际上,铬在室温下确为体心立方(BCC)结构,这也与实验和教材中常见结论相一致。
结论:铬 (Cr) 的晶体结构是 体心立方(BCC)。
所谓“面致密度”(planar density)即单位面积上所占的原子个数(或原子面积密度),一般记为
对面心立方(FCC)晶体,可列出以下常见结果(用晶胞参数 表示):
面
面
面
总结起来,FCC 晶体常见三组晶面之面致密度为:
Cr 的晶体结构
由于计算得到的理论密度与题给值相符,可判定 Cr 为体心立方(BCC) 结构。
FCC 晶体的面致密度