Python:Successiveoverrelaxation(gausseidel with relaxation)代码没有收敛

2024-06-28 19:52:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python2.7+NumPy+MatPlotLib实现定量迁移谱分析(QMSA)。QMSA是一种分析磁场相关霍尔效应测量的工具。在半导体中,可以发现一种以上不同浓度和迁移率的载流子(电子或空穴)。不同载流子的密度,不同的载流子的数目,不同的符号。它有一些版本,比如改进版i-QMSA。然而,即使是从零开始建立标准质量管理体系也是一项艰巨的工作。在

这工作很有名气。有很多关于这个主题的科学文章。但是,由于每一篇文章的版权归出版商所有,我无法与您分享。大多数情况下,你可以用大学账户联系他们。有一些关于它的论据如下:

1.)txstate数字图书馆.edu/bitstream/handle/10877/4390/CUNNINGHAM-论文.pdf?序列=1

2.)warwick.ac包装.uk/56132/1/WRAP_论文\u kiatgalmachai_2000.pdf

3.)etd.lib.nsysu公司.教育tw/ETD-db/ETD搜索/getfile?URN=etd-0629104-152644&filename=etd-0629104-152644.pdf(我想是中文)

4.)fbetezbankasi.gazi.edu.tr/pdf indir/22233741(我想它是土耳其语。QMSA手册中给出的方程列在第73-75页的论文中)

代码将我尝试做连续的过松弛(SOR)迭代方法,正如最初所做的那样。首先,我编写了一个简单的程序来生成磁场依赖的电导率张量sigmaxx(B)和sigmaxy(B)的人工实验数据。有了这个实验性的输入和预定义的移动性值,代码正在运行。。。在

for i in range (0,n,1):
    bxx[i] = data[i][1]
    bxy[i] = data[i][2]
    for j in range (0,m,1):
        if data[i][0] == 0:
            data[i][0] = 0.001
        Axx[j,i]=1/(1+(mobin[j]**2)*(data[i][0]**2))
        Axy[j,i]=(mobin[j]*data[i][0])/(1+(mobin[j]**2)*(data[i][0]**2))

这里,bxx,bxy,mobin和data[i][0]分别是实验sigmaxx,实验sigmaxy,从文本文件和实验磁场点获得的预定义迁移率值。因此,我们试图用SOR求解两个方程,形式为Ax=b。对于XX,问题A、x和b被重命名为Axx、solxx和bxx。对于XY部分的问题A,x和b被重命名为Axy,solxy和bxy。在

对于SOR,需要一个名为omega的参数。我用GAuss-Seidel找到了最佳的ω值(这里我展示的是电导率的XX部分)。同样的程序也适用于XY):

^{pr2}$

这个“寻找最佳欧米茄”的程序来自于Jaan的Kiusalaas。Python3工程中的数值方法。剑桥大学出版社,2013年,第83页。在

找到omega后,这一次使用SOR进行相同的迭代:

for it_count in range(ITERATION_LIMIT):
   for i in range(0,n,1):
       s1xx = np.dot(Axx[i, :i], solxx_new[:i])
       s2xx = np.dot(Axx[i, i + 1:], solxx[i + 1:])
       solxx_new[i] = (1-omegaxx)*solxx[i-1]+omegaxx*(bxx[i] - s1xx - s2xx) / Axx[i, i]
   if np.allclose(solxx, solxx_new, rtol=1e-9):
       break
   print "Iteration:",it_count
   for i in range(0,n,1):
       solxx[i] = solxx_new[i]

然后,我计算了每个迁移率的电导谱值:

for i in range (0,n,1):
    if i == 0:
        deltamob = 100
    else:
        deltamob = mobin[i] - mobin[i-1]
    sn[i] = abs((solxx[i] - solxy[i]))/(2*deltamob*1.6e-19)
    sp[i] = abs((solxx[i] + solxy[i]))/(2*deltamob*1.6e-19)
    x[i] = mobin[i]
    B[i] = data[i][0]

那么x vs sn和x vs sp一定是你的迁移谱。我唯一能得到的是一个单一的高斯峰。即使没有空穴载流子,电子和空穴的光谱也是一样的。问题是solxx,solxy在每次迭代后都会得到更大的值。问题可能是由编写python3的SOR代码引起的。但我使用的是python2.7。在

如果需要的话我可以发文件。在

谢谢你的回复。在


Tags: innewfordatapdfrangesorbxx