使用自洽场方法求解 Kohn-Sham 方程一. DFT简述(使用Atomic units)

密度泛函理论主要由 Kohn 和沈吕九在半个世纪之前创造。用于求解多电子体系基态性质,其主要思想是这样的:

首先:假设一组波函数 {ψi(x⃗)} 描述了电子们的状态

然后:由 {ψi(x⃗)} 导出体系能量的表达式(包含电子动能,库伦能等):1. 电子动能:Tel=−12∑ni=1∫ψ∗i(x⃗)∇2ψi(x⃗)d3x2. 电子与原子之间相互作用能: Vext=∫n(x⃗)Vnuc(x⃗)d3x3. 电子受其他电子的库伦能:VH=12∫ϕ(x⃗)n(x⃗)d3x,其中ϕ(x⃗) 为电子电荷密度形成的库伦式,可以通过求解 Poisson 方程(∇2ϕ=−4πn)得到 4. 对库伦能的修正(交换能):Ex=∫fx(n(x⃗))dV

注:其中:n(x⃗)=∑iψ∗iψi 为电子密度;对于交换能Ex,有各种近似方法,这里使用最简单的局域密度近似。具体介绍可以在这里找到。寻找更好的交换能函数,是凝聚态中一个十分重要的研究课题。

综上,可以得到总能量表达式为:

E[{ψi(x)}]=Tel+Vext+VH+Ex

最后:利用变分法,求解使体系能量最小时波函数需要满足的条件,就可以得到著名的Kohn-Sham 方程:

[−ℏ22m∇2+Vext(x⃗)+ϕ(x⃗)+Vx(x⃗)]ψi(x⃗)=ϵiψ(x⃗)

其中Vx 为交换势, 具体表达式见这里(局域密度近似)

令人吃惊的是,它与单电子 Schrodinger 方程是如此的相似。不同之处只是在于,由于电子之间相互作用,Hamiltonian 中的势能项包含了电子密度。这使得K-S方程成为一个非线性方程(哈密顿量与波函数有关),与我们熟知的本征值问题不太一样。接下来,介绍如何编程解这个方程。二. 求解 Kohn-Sham 方程的自洽场(self-consistent field method SCF)算法

Initialization: 1. 确定电子个数(N)2. 用外势能近似总势能,即 Vtot=Vext,得到近似Hamiltonian;Iteration:1. 求Hamiltonian最小的 N/2 个本征值,及对应的本征函数 ψi(x⃗)(每个态上占据两个电子)2. 由得到的本征函数集 {ψi(x⃗)} 求交换势(ϕ(x⃗))和库伦势(Vx(x⃗))3. 更新Hamiltonian: H=−ℏ22m∇2+Vext(x⃗)+ϕ(x⃗)+Vx(x⃗)4. 判断当前结果是否满足要求,如果满足,就跳出循环三. 算法的 Matlab 实现

使用条件及近似方式:只考虑电子成对占据某一能态的原子;使用LDA近似;使用空间离散化的方法求解Hamiltonian的本征值;使用Dirichlet边界条件(边界处概率密度为0);以4个电子为例。

主程序:

%For double occupationN=4;% num of enectronsg=50% num of latticesg3=g^3;p=linspace(-5,5,g);% one dimensiton space lattice[X,Y,Z]=meshgrid(p,p,p);% three dimension space latticeh=p(2)-p(1);% latice spacingX=X(:);Y=Y(:);Z=Z(:);% all elements of arraty as a single columnR=sqrt(X.^2+Y.^2+Z.^2);% distance from the centerVext=-N./R;% potential energy(2 protons)e=ones(g,1);L=spdiags([e-2*ee],-1:1,g,g)/h^2;% 1D finite difference Laplacian (with 0 boundary condition)I=speye(g);L3=kron(kron(L,I),I)+kron(kron(I,L),I)+kron(kron(I,I),L);% extend Laplacian to 3 DVtot=Vext;%initial guessncomp=exp(-R.^2/2);%compensation charge(for poisson equation)ncomp=-N*ncomp/sum(ncomp)/h^3;ncomppot=-N./R.*erf(R/sqrt(2));%solution of poisson eq. of compensation charge%%%%%%%%initial guess for N = 4%%%%%%%%%%%%%%%%%%E=[-4-1];PSI=[exp(-3.7*R)exp(-0.17*R)];%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%foriter=1:5%Do the main loop not for everH=-0.5*L3+spdiags(Vtot,0,g3,g3);% Hamiltonian of Helium[PSI,E]=lowestNEigen(H,PSI,E,N,5);fori=1:(N/2)PSI(:,i)=PSI(:,i)/norm(PSI(:,i));endPSI=PSI/h^(3/2);%normalize PSIn=0;fori=1:(N/2)%calculate density of electronn=n+2*PSI(:,i).^2;endVx=-(3/pi)^(1/3)*n.^(1/3);%exchange potantial (LDA)Vh=cgs(L3,-4*pi*(n+ncomp),1e-7,400)-ncomppot;%Hartree potantial(solution of poisson eq.: L3 Vh = -4*pi*n)Vtot=Vx+Vh+Vext;%total potantialT=0;fori=1:(N/2)%calculate Kinetic energyT=T+2*PSI(:,i)'*(-0.5*L3)*PSI(:,i)*h^3;%Kinetic enerty(expactation value of Kinetic energy oprator)endEext=sum(n.*Vext)*h^3;%external energyEh=0.5*sum(n.*Vh)*h^3;%hartree energyEx=sum(n.*Vx*(3/4))*h^3;%How come the 3/4????????????????Etot=T+Eext+Eh+Ex;moreoff;%see the disp  in the loop, but why?E%  disp(['Kinetic energy ' num2str(T,5) ]);%  disp(['Exchange energy ' num2str(Ex,5) ]);%  disp(['External energy ' num2str(Eext,5) ]);%  disp(['Potential energy ' num2str(Eh,5) ]);disp(['Total energy'num2str(Etot,5)]);end%scatter3(X(1:10:g3),Y(1:10:g3),Z(1:10:g3),n(1:10:g3)*1000);scatter3(X,Y,Z,n*4);//showelectrondensity

用Davidson method 求解本征值和本征向量:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  Usage: Get lowest eigenvalue and cooresponding Evetor by Davidson's method%  H: discrete Hamiltonian%  PSI, E: initial guess of eigenvectors and eigenvalue%  N: number of eigen pair needed%  iter: iteration number%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function[PSI, E] =lowestNEigen(H, PSI, E, N, iter)fori=1:iter%"for loop": for faster convergentRR=H*PSI-PSI*diag(E);%All the Residual vectors at oncePSIe=[PSIRR];%SubsbaceHH=PSIe'*H*PSIe;%For transform subspace to a space inwhich H is diagnolizedSS=PSIe'*PSIe;%For transform subspace to a space inwhich H is diagnolizedHH=HH+HH';SS=SS+SS';%Ensure they are Hermition matrix, so that the eigen value will return in order[U,E]=eig(HH,SS);%For transform subspace to a space inwhich H is diagnolizedE=diag(E);%Diagnal Matix to vectorPSIe=PSIe*U;%%SIe' * H * PSIePSI=PSI(:,1:(N/2));E=E(1:(N/2));%Pick lowest N/2 eigen vectors and valuesend结果

Total energy: -10.793

电子密度分布图:

接下来

误差较大,如何升级?

如何在 DFT 中考虑空间角动量,自旋角动量,由此研究其磁性?参考资料:

matlab 泛函极值,科学网—基于密度泛函理论(DFT),使用matlab求解原子状态 - 钱利江的博文...相关推荐

  1. 悖论对计算机科学影响,科学网—基于对角线引理和维特根斯坦思想对于悖论的分析 - 庄朝晖的博文...

    第六届分析哲学会议发言稿 庄朝晖,厦门大学计算机科学系 悖论的定义 ...悖论的出现:在20世纪初期关于数学基础的讨论中,出现了大量的悖论,比如康托尔悖论.罗素悖论.理查德悖论等等. 对角线引理 .. ...

  2. 计算机内部总线和外部总线,科学网-怎样将计算机内部总线扩展为外部网络?-姜咏江的博文...

    怎样将计算机内部总线扩展为外部网络? 姜咏江 透明计算公示成果的第一条就是"将原来计算机的内部总线扩展为外部网络".现在我们来谈谈能不能将计算机内部总线扩展成外部网络. 1.什么是 ...

  3. 计算机设计核心思想,科学网—计算机设计的两种理念,颠覆os的计算机 - 姜咏江的博文...

    计算机设计的两种理念 姜咏江 关于图灵和冯·诺伊曼计算机,我们是否可以总结为图灵的计算机思想由冯·诺伊曼等人具体实现了?不要让计算机历史上那些说不十分清楚的问题,耽误了我们今天的行程. 在计算机体系结 ...

  4. 结合泛函极值_第2章泛函的极值.doc

    第2章泛函的极值 第2章 泛函的极值 , , 如果, 当 (或者说)时, 有 那么, 我们称在处是连续的, 记为. 2.1.2 函数的可微性 更进一步, 如果存在, 使得 那么我们称在处是可微的, 或 ...

  5. matlab画复变函数,科学网—复数复变函数的Matlab计算与绘图 - 周铁戈的博文

    复数复变函数的Matlab计算与绘图 周铁戈 复数的表示 存在两种表示方法,一种是代数式,一种是指数式,在Matlab中的方式如下: >> z=1+2i            #代数式,1 ...

  6. matlab流量结构分析,科学网-分享求解“结构分解分析(SDA)”各项均值的MATLAB程序-计军平的博文...

    点此下载(MATLAB File Exchange) [2015.02.18补充]其他研究人员的MATLAB代码 Sayago-Gomez, Juan Tomas, (2014), Matlab Co ...

  7. matlab的annotation,科学网—annotation in matlab Graph - 夏靖的博文

    matlab 中annotation的操作可以象windows的"画图"一样很方便的对图像进行标注,但如果所绘的图需要修改,其标注也需要再手工重复操作一次,所以在这种情况下用脚本进 ...

  8. matlab调和级数求和,科学网—疯狂的绝技------级数加速收敛的艺术 - 张江敏的博文...

    很多时候,我们需要计算一个无穷级数之和.比如,历史上著名的Basel问题是要计算级数 之和.这个问题之所以叫巴塞尔问题,是因为来自巴塞尔的约翰-伯努利和雅克比-伯努利为之苦恼了很久,尔后解决之的数学家 ...

  9. matlab 谱分析函数,科学网—经典谱分析(Power Spectrum Analysis) - 刘磊的博文

    频谱分析(或功率谱分析)大家可能都不陌生,然而细究起来,恐怕还是有很多模糊的地方.博主很早就知道并且学会使用各种数学软件来计算功率谱,可是长期以来总是知其然而不知其所以然,一些道理和概念总是含含糊糊过 ...

  10. matlab基本矩阵运算,科学网—matlab中矩阵基本运算 - 成爱芳的博文

    以矩阵A为例: (1)转置矩阵求取   AT transpose(A) >> A=[1 0 3; 2:4; 3 1 0] A = 1     0     3 2     3     4 3 ...

最新文章

  1. Windows or Linux
  2. python数据分析numpy_Python数据分析之numpy学习
  3. python教程简易版_简洁的十分钟Python入门教程
  4. 网上找到的一段关于SAP支持服务的QA (转)
  5. WinForm ListView
  6. 从桌面到移动:异构计算翻天覆地的技术变革
  7. java post请求返回500错误信息_Retrofit API Post call 返回错误 500,适用于 Postman
  8. 阿里云 Centos 7 PHP7环境配置 LNMP
  9. c++ python混合编程 restful_How to use Python to build a RESTful Web Service
  10. ubuntu18.04解锁apt
  11. WPF复制异常问题(OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))
  12. windows安装pdf虚拟打印机
  13. OA系统-部门和员工管理模块
  14. day048:LocalDateTime中增加、减少、直接修改时间的方法、计算时间间隔的方法
  15. golang命令行贪吃蛇
  16. 【全面恢复受损的Word文档】
  17. css-盒子模型border-box
  18. 使用Arduino UNO以及好盈电调控制无刷电机
  19. 武汉大学 遥感院 数据结构实习
  20. 2017 Python 问卷调查结果初步分析

热门文章

  1. SpringBoot+MybatisPlus实现关联表查询
  2. linux 下载命令
  3. AI+IoT行业“飞轮效应”凸显,全球云服务能力将发挥关键作用
  4. html选择日期的组件,怎样实现一个datePicker(日期选择)组件
  5. C语言输出数组中最大最小值及位序
  6. 零基础如何用平面设计排版软件PS进行布局构图
  7. 人大金仓数据库迁移步骤
  8. Android MVP架构搭建
  9. python怎么接管浏览器_用python操作浏览器的三种方式
  10. 《工业设计史》第十一章:走向多元化