Python:连续过度放松(Gauss-Seidel with relaxation)代码没有收敛

时间:2015-05-14 15:33:14

标签: python python-2.7 python-3.x numpy scientific-computing

我正在尝试在Python 2.7 + NumPy + MatPlotLib中实现定量移动频谱分析(QMSA)。 QMSA是一种分析磁场相关霍尔效应测量的工具。在半导体中,可以找到具有不同浓度和迁移率的多于一种类型的载流子(电子或空穴)。 QMSA可以分离不同类型的载波的数量,它们的密度,移动性和符号。它有一些版本,比如改进版i-QMSA。然而,即使从零开始构建标准QMSA也是一项艰苦的工作。

这项工作非常了解。有很多关于这个主题的科学文章。但是,由于每篇文章的版权由出版商持有,我无法与您分享。大多数情况下,您可以通过大学帐户与他们联系。有一些关于它的论文如下:

1。)digital.library.txstate.edu/bitstream/handle/10877/4390/CUNNINGHAM-THESIS.pdf?sequence=1

2。)wrap.warwick.ac.uk/56132/1/WRAP_thesis_Kiatgamolchai_2000.pdf

3。)etd.lib.nsysu.edu.tw/ETD-db/ETD-search/getfile?URN=etd-0629104-152644&filename=etd-0629104-152644.pdf(我认为是中文) )

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

Code我将尝试像最初那样进行逐步过度放松(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,取自文本文件和实验磁场点的预定义迁移率值。因此,我们试图以Ax = b的形式求解具有SOR的两个方程。对于问题A的XX部分,x和b被重命名为Axx,solxx和bxx。对于问题A的XY部分,x和b被重命名为Axy,solxy和bxy。

对于SOR,您需要一个名为omega的参数。我用GAuss-Seidel找到了最佳的欧米茄值(这里我给出了XX部分的电导率。对于XY也做了相同的程序):

print "Iterations for finding omega..."
for it_count in range(1,501):
    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] = (bxx[i] - s1xx - s2xx) / Axx[i, i]
    dx = sqrt(np.dot(solxx_new-solxx,solxx_new-solxx))
    for i in range(0,n,1):
        solxx[i] = solxx_new[i]
    if it_count == k: dx1 = dx
    if it_count == k + 1:
        dx2 = dx
        omegaxx = 2.0/(1.0 + sqrt(abs(1.0 - (dx2/dx1))))
        break
print "I think best omega value for these XX calculations is ", omegaxx

这种“寻找最佳欧米茄”程序来自Jaan的Kiusalaas。使用Python进行工程设计的数值方法3.剑桥大学出版社,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在每次迭代后变得越来越大。 SOR代码可能是由Python 3编写的。但我使用的是Python 2.7。

我可以在必要时发送文件。

感谢您的回复。

0 个答案:

没有答案