计算物理专题:双向打靶法解决本征值问题

news2025/1/17 5:50:06

计算物理专题:双向打靶法解决本征值问题

双向打靶法全部代码

  • EigenMethods.py
import numpy as np
import matplotlib.pyplot as plt
from SchrodingerTools import *

#type-ode1:
## y''(x)+f(x)y(x) = g(x)
##tips:
##lambda eigen,x:f(eigen,x)

def replace_eigen(eigen):
    def decorator(func):
        def wrapper(x):
            return func(eigen, x)
        return wrapper
    return decorator

def bisection(X,Y):
    assert len(X)==len(Y),"X is not as long as Y"
    Num = len(X)
    Zeropoints = []
    for i in range(Num-1):
        if Y[i]*Y[i+1]<=0:
            Zeropoints.append((X[i]+X[i+1])/2)
    return Zeropoints
    
class ode1():
    def __init__(self,f,g,x0,x1,y0=0,y1=0,dy0=1,dy1=1,ddy0=0,ddy1=0,h=0.01,EigenRange=[-2,2],EigenStep=0.001):
        self.f = f
        self.g = g
        self.x0 = x0
        self.x1 = x1
        self.y0 = y0
        self.y1 = y1
        self.dy0 = dy0
        self.dy1 = dy1
        self.ddy0 = ddy0
        self.ddy1 = ddy1
        self.h = h
        self.EigenRange = EigenRange
        self.EigenStep = EigenStep
        
    def Shooting(self):
        ChoosePoint=(self.x0+self.x1)/2
        PossibleEigen = np.arange(self.EigenRange[0],self.EigenRange[1],self.EigenStep)
        Distance = []
        
        for EigenValue in PossibleEigen:
            @replace_eigen(EigenValue)
            def new_f(EigenValue,x):
                return self.f(EigenValue,x)

            @replace_eigen(EigenValue)
            def new_g(EigenValue,x):
                return self.g(EigenValue, x)
            
            forward_Y = numerov_forward(new_f,new_g,self.x0,self.x1,self.y0,self.dy0,self.ddy0,self.h)
            backward_Y = numerov_backward(new_f,new_g,self.x0,self.x1,self.y1,self.dy1,self.ddy1,self.h)

            forward_derivative = First_order_derivative(forward_Y,ChoosePoint)
            backward_derivative = First_order_derivative(backward_Y,ChoosePoint)

            Distance.append((forward_Y[round(ChoosePoint/self.h)]/forward_derivative)-(backward_Y[round(ChoosePoint/self.h)]/backward_derivative))
    
        ##plt.plot(PossibleEigen,Distance)
        ##plt.pause(0.01)
        ##plt.title("Distance -- Possible Eigenvalue")

        #print(bisection(PossibleEigen,Distance))

        ZeroPoints = bisection(PossibleEigen,Distance)
        Deviations = []
        for EigenValue in ZeroPoints:
            @replace_eigen(EigenValue)
            def new_f(EigenValue,x):
                return self.f(EigenValue,x)

            @replace_eigen(EigenValue)
            def new_g(EigenValue,x):
                return self.g(EigenValue, x)

            forward_Y = numerov_forward(new_f,new_g,self.x0,self.x1,self.y0,self.dy0,self.ddy0,self.h)
            backward_Y = numerov_backward(new_f,new_g,self.x0,self.x1,self.y1,self.dy1,self.ddy1,self.h)

            plt.figure()
            plt.plot(np.arange(self.x0,self.x1+self.h,self.h),forward_Y,label="forward_Y")
            plt.plot(np.arange(self.x0,self.x1+self.h,self.h),backward_Y,label="backward_Y")
            plt.title("$"+str(round(EigenValue,4))+"$")
            plt.xlabel("$deviation"+str(round(abs(forward_Y[-1]-self.y1)+abs(backward_Y[0]-self.y0),4))+"$")
            plt.pause(0.01)
            
        return [PossibleEigen,Distance,ZeroPoints]

  • ScrodingTools.py
import numpy as np
import matplotlib.pyplot as plt


#一阶导公式:序列,位置,步长,阶数
def First_order_derivative(Y,x,h=0.01,order=4):
    n = round(x/h)
    if order==4:
        try:
            return (Y[n-2]-8*Y[n-1]+8*Y[n+1]-Y[n+2])/(12*h)
        except:
            print("First_order_derivative:Failure!")
            
    elif order==2:
        try:
            return (Y[n+1]-Y[n-1])/(2*h)
        except:
            print("First_order_derivative:Failure!")
            

#二阶导公式:序列,位置,步长,阶数
def Second_order_derivative(Y,x,h=0.01,order=4):
    n = round(x/h)
    if order==4:
        try:
            return -(Y[n-2]-16*Y[n-1]+30*Y[n]-16*Y[n+1]+Y[n+2])/(12*h**2)
        except:
            print("Second_order_derivative:Failure!")
            
    elif order==2:
        try:
            return (Y[n-1]-2*Y[n]+Y[n+1])/(h**2)
        except:
            print("Second_order_derivative:Failure!")


#numerov 向前方法
#f函数,g函数,起始点x0,终止点x1,起始点函数值y0,起始点导数值dy0,
#起始点二阶导数值ddy0(0),间隔(0.01)
            
def numerov_forward(f,g,x0,x1,y0=0,dy0=1,ddy0=0,h=0.01):
    
    X = np.arange(x0,x1+h,h)
    try:
        F = f(X)    
    except:
        print("numerov_forward:Function F failure")
        F[0]=0
        F[1:] = f(X[1:])

    try:
        G = g(X)    
    except:
        print("numerov_forward:Function G failure")
        G[0]=0
        G[1:] = g(X[1:])        
        
    Num = len(X)
    Y = np.zeros(Num)
    Y[0] = y0
    Y[1] = y0 + h*dy0 + 1/2 * h**2 * ddy0

    try:
        for i in range(2,Num):
            k1 = 2*(1-5*h**2/12*F[i-1])*Y[i-1]
            k2 = h**2*G[i-1]-(1+h**2/12*F[i-2])*Y[i-2]
            Y[i] = (k1+k2)/(1+h**2/12*F[i])
        return Y
    except Exception as e:
        print("numerov_forward:Failure!  ",e)  


#numerov 向后方法
#f函数,g函数,起始点x0,终止点x1,终止点函数值y1,终止点导数值dy1,
#起始点二阶导数值ddy1(0),间隔(0.01)
def numerov_backward(f,g,x0,x1,y1=0,dy1=1,ddy1=0,h=0.01):

    X = np.arange(x0,x1+h,h)
    try:
        F = f(X)    
    except:
        print("numerov_forward:Function F failure")
        F[0]=0
        F[1:] = f(X[1:])

    try:
        G = g(X)    
    except:
        print("numerov_forward:Function G failure")
        G[0]=0
        G[1:] = g(X[1:])        
        
    Num = len(X)
    Y = np.zeros(Num)
    Y[-1] = y1
    Y[-2] = y1 - h*dy1 - 1/2 * h**2 * ddy1

    try:
        for i in range(Num-3,-1,-1):
            k1 = 2*(1-5*h**2/12*F[i+1])*Y[i+1]
            k2 = h**2*G[i+1]-(1+h**2/12*F[i+2])*Y[i+2]
            Y[i] = (k1+k2)/(1+h**2/12*F[i])
        return Y
    except Exception as e:
        print("numerov_backward:Failure!  ",e)  
    
#雅克比方法求特征值
def sign(x):
    if x>0:
        return 1.0
    elif x<0:
        return -1.0
    elif x==0:
        return 0.0

def jacobi_eigenvalue(A, tol=1e-10,max_iter=500):
    n = A.shape[0]
    V = np.eye(n) 
    iterations = 0

    while True:
        max_idx = np.argmax(np.abs(np.triu(A, k=1)))
        i, j = divmod(max_idx, n)
        if np.abs(A[i,j]) < tol or iterations >= max_iter:
            print("end!!")
            break
        Lambda = abs(A[j,j]-A[i,i])
        Mu = 2.0 * A[i,j] * sign(A[j,j]-A[i,i])
        if Lambda**2+Mu**2 != 0:
            Omega = Lambda/(Lambda**2+Mu**2)**0.5
            c = ((1+Omega)/2)**0.5       
            s = Mu*Omega/(Lambda*(2*(1+Omega))**0.5)
        else:
            c = 2**0.5/2
            s = 2**0.5/2
        J = np.eye(n)
        J[i, i] = c
        J[j, j] = c
        J[i, j] = s
        J[j, i] = -s
        A = np.dot(np.dot(J.T, A), J)
        V = np.dot(V, J)
        iterations += 1
    eigenvalues = np.diag(A)
    eigenvectors = V.T
    return eigenvalues, eigenvectors
  •  test.py
import numpy as np
import matplotlib.pyplot as plt
from SchrodingerTools import *
from EigenMethods import *

def f(EigenValue,x):
    return x**2-EigenValue*x*40
def g(EigenValue,x):
    return EigenValue + x**5

x0 = 0
x1 = 1

y0 = 0
y1 = 0

dy0 = 1
dy1 = 1

O = ode1(f,g,x0,x1)
a = O.Shooting()

运行结果

 

 

 

 

扫描隧道显微镜调研

\subsection{扫描隧道显微镜单原子操纵技术}
    1990年,美国IBM公司的两位科学家发现,靠近探针的氙原子随探针作同样的移动。纳米科学技术正是依赖于STM这种能够操纵原子的工具而诞生和发展的。\par 
\subsubsection{扫描隧道显微镜单原子操纵的方式}
    单原子操纵分横向操纵和纵向操纵两种。横向操纵指被操纵的原子在操纵过程中始终在表面上移动, 没有脱离表面的束缚, 即原子和表面之间的键不曾断裂。纵向操纵是指利用探针把单个原子从表面提起使之吸附到探针上而脱离表面束缚, 或再把原子从探针重新释放到表面,操纵过程中原子和表面之间的键会发生断裂。\par 
    
    横向操纵通常采用恒定电流模式,探针的高度不断变化。首先,经过对隧道电流的调整,STM探针将被调整到一个合适的高度以增强它对吸附原子的作用力。其次,STM将维持在恒定电流工作模式,将被吸附的原子移动到目标位置。最后,STM探针将升起以断开与原子间的联系,原子将被固定到目标位置上。\par 
    
    纵向操纵通过调整探针和材料表面之间的电场,以完成原子的吸附,移动和固定。纵向操纵单原子的放置分成三种方式。其一,被放置的原子来源于STM的针尖。其二,被放置的原子来源于样本。其三,被放置的原子由某种方式运输到STM针尖上,然后再被放置到样品表面。\par 
    
\subsubsection{扫描隧道显微镜单原子操纵的原理}
    电场蒸发法:在STM针尖和样品表面之间施加一数伏数十毫秒宽的电压脉冲。针尖和样品表面之间的距离约为$0. 3~1. 0nm$,针尖和样品之间的电场数量级在$10^9~10^{10}V/m$之间。样品上的原子在强电场的作用下被吸附到探针上,实现单原子的移动和提取操纵。\par 

    调控原子间作用力:探针尖端和试样原子间力主要是范德华力、静电力。当探针接近试样时,原子间的作用力使得探针可能吸附或释放单个原子。1993年,Eigler等将吸附在Cu表面上48个Fe原子逐个移动并排列成一圆形量子栅栏,制成了那张著名的照片。
    

    
    人工化学反应操控:首先,在针尖和式样之间填充反应性气体,利用STM的隧道能量,促使目标原子和样品表面原子发生化学反应吸附在一起以实现对局部原子的操纵。\par 
    
\section{扫描隧道显微镜技术的发展方向}
\subsection{单原子开关}
    1990年,Eigler研究小组使用STM成功地移动了吸附在Ni原子表面上的氙原子。当改变STM针尖和镍表面之间的偏压和极性时,氙原子总是偏向正极一端。当氙原子与STM探针接触时,STM与Ni金属表面形成的STM隧道处于高导电状态。当Xe原子回到Ni金属表面上后,STM隧道回到低导电状态,从而构建起了一个超高速双稳态电子开关。
\subsection{单原子存储器}
    单原子存储器可能依赖STM以两种方式实现。其一可能是利用表层单原子的空穴作为一个比特存储信息:通过移走表面上的几个原子来写入信息;通过填补表面的缺陷来删除已写入的信息或者清楚不平整的表面产生的“噪声”。 其二是讲放置到表面上的单原子作为存储信息的一个比特,步骤与上类似。单原子存储器的容量会更大,一块面积为1$cm^2$的Si可以存储$10^{15}$比特的信息    

\subsection{超快扫描隧道显微镜技术$^{[3]}$}
    多数的扫描隧道显微镜只能在较低的磁场下观测准静态过程,不能满足对实时的,动态的变化过程观测的需要。光耦合扫描隧道显微镜技术将扫描隧道显微镜(Scanning Tunneling Microscope,STM)和光激发技术相结合,能够在原子级的空间分辨下探测对光激发敏感的动力学过程。\par
    光学手段和STM耦合的方式包括:\par 
    1.光源激发样品时,STM停止工作并后撤针尖。在照射激光前后使用STM进行原位扫描,表征光激发对样品表面产生的影响。该方式不涉及激光和隧穿电流的直接耦合。\par 
    2.激光和STM隧道电子的直接耦合测量。\par 
    3.使用针尖诱导的隧道节发光或分子发光,用光谱仪收集或成像。\par 
    4.STM和光学pump—probe技术的联合,同时实现原子级空间分辨和fs超快时间分辨。\par 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/678386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

365天深度学习训练营-第T3周:天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 语言环境&#xff1a…

Web网页制作-知识点(4)——CSS盒子模型、弹性盒模型(flex box)、文档流、浮动、清除浮动、定位、圆角、阴影

目录 CSS盒子模型 概念 弹性盒模型&#xff08;flex box&#xff09; 内容 父元素上的属性 display属性 flex-direction属性 justify-content属性 align-items属性 子元素上的属性 flex 文档流&#xff08;标准流&#xff09; 浮动 定义 浮动的原理 清除浮动 …

Java开发 - 负载均衡你了解多少?

前言 前面很多篇博客都有涉及到负载均衡&#xff0c;而负载均衡也并不是某一个框架的专利&#xff0c;从博主接触Java以来&#xff0c;使用的很多框架都自带了负载均衡的特点。今天&#xff0c;我们就来一探究竟&#xff0c;了解下负载均衡是什么&#xff0c;该怎么在项目中使…

Python 函数:理解并使用 return 语句

你好&#xff0c;我是悦创。 函数在 Python 编程中起着至关重要的作用。他们封装了一段代码&#xff0c;并给它一个名字&#xff0c;这样我们可以在程序的任何地方&#xff0c;通过这个名字来调用这段代码。return 是函数的一个重要组成部分&#xff0c;它可以使函数输出一个值…

差分方程转化为Z变换方程

差分方程是描述离散时间系统动态行为的数学工具&#xff0c;而Z变换则是将离散时间信号从时间域转换到复频域的工具。因此&#xff0c;将差分方程转换为Z变换方程可以方便我们在复频域分析离散时间系统的动态行为。 假设我们有一个差分方程: a n x [ n ] a n − 1 x [ n − 1…

rabbitmq第二课-RabbitMQ核心编程模型以及消息应用场景详解

一、回顾RabbitMQ基础概念 二、RabbitMQ基础编程模型 使用RabbitMQ提供的原生客户端API进行交互。这是使用RabbitMQ的基础。 1.1、maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version&g…

C语言:使用指针使字符串逆序

题目&#xff1a; 链接&#xff1a;字符逆序__牛客网 来源&#xff1a;牛客网 将一个字符串str的内容颠倒过来&#xff0c;并输出。 输入描述: 输入一个字符串&#xff0c;可以有空格 输出描述: 输出逆序的字符串 示例1 输入 I am a student 输出 tneduts a ma I …

VUE 2X 生命周期 ⑩①

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs初见生面周期分析生命周期生命周期总结总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ ⡖⠒⠒⠒⠤⢄…

《算法设计与分析》学习笔记

目录 算法基本概念 算法的定义 算法复杂度分析 渐近记号 ①渐近上界记号O ②渐近下界记号Ω ③渐近紧确界记号 Θ ④非渐近紧确上界记号o ⑤非渐近紧确下界记号ω 渐进记号极限定义 分治 分治步骤 递归树 ​编辑代入法 主方法 改变变量 二叉树 堆 建堆 堆排…

【promptulate专栏】使用GPT和XMind快速构建思维导图

本文节选自笔者博客&#xff1a;https://www.blog.zeeland.cn/archives/ao302950h3j &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#…

【Java】缓存常见问题及解决方式

文章目录 一、缓存常见问题二、数据不一致2.1、一致性问题2.2、解决方案 三、缓存穿透3.1、问题3.2、解决方案布隆过滤器使用布隆过滤器解决缓存穿透 四、缓存击穿4.1、问题4.2、解决方案 五、缓存雪崩5.1、问题5.2、解决方案 六、大key及热点key6.1、问题6.2、解决方案大key热…

【Leetcode刷题】字符串匹配

本篇文章为LeetCode 字符串匹配模块的刷题笔记&#xff0c;仅供参考。 目录 Leetcode28.找出字符串中第一个匹配项的下标Leetcode214.最短回文串Leetcode459.重复的子字符串Leetcode686.重复叠加字符串匹配Leetcode1023.驼峰式匹配Leetcode1392.最长快乐前缀Leetcode1668.最大重…

【SpringBoot】一、SpringBoot3改变新特性

前言 本文适合具有springboot的基础的同学。 SpringBoot3改变&新特性 一、前置条件二、自动配置包位置变化1、Springboot2.X2、Springboot3.X 三、jakata api迁移1、Springboot2.X2、Springboot3.X3、SpringBoot3使用druid有问题&#xff0c;因为它引用的是旧的包 四 新特…

App Crawler

Google官方出了一款App遍历工具App Crawler。 文档&#xff1a;应用抓取工具 | Android 开发者 | Android Developers App Crawler工具是Android Jetpack的一部分&#xff0c;它可自动的运行你的App&#xff0c;不需要编写或维护任何代码。 通过App Crawler运行App&…

实训四:索引与视图 - 索引(teachingdb数据库)

索引与数据库完整性 第1关&#xff1a;索引任务描述相关知识索引是什么索引的分类索引的创建和删除查询表中索引 编程要求参考代码 第2关&#xff1a;删除索引-练习任务描述相关知识编程要求测试说明参考代码 第1关&#xff1a;索引 任务描述 本关任务&#xff1a;为 student…

【Leetcode60天带刷】day21二叉树——530.二叉搜索树的最小绝对差 ,501.二叉搜索树中的众数 ,236. 二叉树的最近公共祖先

题目&#xff1a; 530. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1…

chatgpt赋能python:Python与电影评分

Python与电影评分 近年来&#xff0c;越来越多的人选择通过网络来观看电影。然而&#xff0c;在选择一部电影时&#xff0c;看到的只是电影名称和海报。这时就需要借助电影评分来给自己做出更明智的选择。Python作为一门流行的编程语言&#xff0c;它的应用程序提供了许多有用…

图形视图体系结构(Graphics View)

Graphics View框架结构的主要特点 Graphics View框架结构的主要特点如下。 &#xff08;1&#xff09;在Graphics View框架结构中&#xff0c;系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。 &#xff08;2&#xff09;Graphics View支持事件传播体系结构&…

利用Charles进行Mock测试

一、Charles介绍 Charles是一款用Java编写的代理软件&#xff0c;电脑或者手机访问网站首先会访问到Charles代理工具上&#xff0c;由代理工具再把访问数据转发到相应的网站上&#xff0c;所以可以很好的通过设置Charles&#xff0c;对接口的请求和响应进行加工处理。 …

【Linux】Linux权限的概念、Linux权限管理、文件类型和访问权限的设置、粘滞位介绍

文章目录 1.Linux权限的概念2.Linux权限管理2.1文件访问者的分类2.2文件类型的访问权限2.3文件权限值的表示方法2.4文件访问权限的相关设置方法 3.目录的权限4.粘滞位 1.Linux权限的概念 在生活中&#xff0c;一件事情是否允许被一个人做&#xff0c;就是叫做权限&#xff0c;权…