Strange set of errors

Kurt Smith kwmsmith at gmail.com
Fri Aug 3 16:51:03 EDT 2007


On 8/3/07, Stephen Webb <sdavis.webb at gmail.com> wrote:
> Greetings all,
>
> I've recently begun using Python to do scientific computation, and I wrote
> the following script to find approximate eigenvalues for a semi-infinite
> matrix:
>
>
>  from pylab import *
> from numpy import *
> from scipy import *
>
> def bandstructure(N,s):
>
>     b = s/4.0
>
>     jmax = 10 + N**2
>
>     spectrum1 = [0]*2*N
>     spectrum2 = [0]*2*N
>     spectrum3 = [0]*2*N
>
>
>     for k in arange(1, 2*N+1, 1):
>
>         A = zeros( (jmax,jmax) )
>
>         i = 0
>         while i <= jmax-1:
>             if i <= jmax-2:
>                 A[i,i+1] = b
>                 A[i+1,i] = b
>                 A[i,i] = ((k + 2.0*i*N)/N)**2
>                 i = i+1
>             else:
>                 A[i,i] = ((k + 2.0*i*N)/N)**2
>                 i = i+1
>
>         #This portion of the code builds a matrix twice as large to check
> against
>
>         B = zeros( (2*jmax,2*jmax) )
>
>         i = 0
>         while i <= 2*jmax-1:
>             if i <= 2*jmax-2:
>                 B[i,i+1] = b
>                 B[i+1,i] = b
>                 B[i,i] = ((k + 2.0*i*N)/N)**2
>                 i = i+1
>             else:
>                 B[i,i] = ((k + 2.0*i*N)/N)**2
>                 i = i+1
>
>         x = linalg.eigvals(A)
>         y = linalg.eigvals(B)
>
>         j = 1
>         while j<=3:
>             if abs(y[j]-x[j]) <= 10.0**(-5):
>                 j = j + 1
>             else:
>                 print 'jmax not large enough to obtain accurate results'
>
>         spectrum1[k-1] = x[0] + 0.5*s
>         spectrum2[k-1] = x[1] + 0.5*s
>         spectrum3[k-1] = x[2] + 0.5*s
>
>     plot (k, spectrum1, k, spectrum2, k, spectrum3)
>
>     xlabel('k (energy level)')
>     ylabel('E/E_r')
>     title('Finite Size Band Structure, N = %d, s = %f' % (N, s))
>     grid(true)
>
>
> When I run this script, I get the following message, which I can't figure
> out:
>
>  Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "bandstruc.py", line 61, in bandstructure
>     plot (k, spectrum1, k, spectrum2, k, spectrum3)
>   File
> "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/matplotlib/pylab.py",
> line 2028, in plot
>     ret =  gca().plot(*args, **kwargs)
>   File
> "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/matplotlib/axes.py",
> line 2535, in plot
>     for line in self._get_lines(*args, **kwargs):
>   File
> "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/matplotlib/axes.py",
> line 437, in _grab_next_args
>     for seg in self._plot_2_args(remaining[:2], **kwargs):
>   File
> "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/matplotlib/axes.py",
> line 337, in _plot_2_args
>     x, y, multicol = self._xy_from_xy(x, y)
>   File
> "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/matplotlib/axes.py",
> line 266, in _xy_from_xy
>     nrx, ncx = x.shape
>  ValueError: need more than 0 values to unpack
>


Basically, you're trying to plot spectrum[123] vs. k: the spectra are
lists, but k is an integer.  I made some modifications to get things
working more smoothly.  Note the ion() function call at the beginning,
and the use of "indx = arange(1,2*N+1)" instead of plotting vs. k.

There's probably some other things that could be cleaned up, but I'm
short on time right now; this will get your code working at least.

Hope this helps,
(From a fellow physicist)
Kurt

##################################################################

from pylab import *
from numpy import *

ion()

def bandstructure(N,s):

    b = s/4.0

    jmax = 10 + N**2

    spectrum1 = [0]*2*N
    spectrum2 = [0]*2*N
    spectrum3 = [0]*2*N


    for k in arange(1, 2*N+1, 1):

        A = zeros( (jmax,jmax) )

        i = 0
        while i <= jmax-1:
            if i <= jmax-2:
                A[i,i+1] = b
                A[i+1,i] = b
                A[i,i] = ((k + 2.0*i*N)/N)**2
                i = i+1
            else:
                A[i,i] = ((k + 2.0*i*N)/N)**2
                i = i+1

        #This portion of the code builds a matrix twice as large to
check against

        B = zeros( (2*jmax,2*jmax) )

        i = 0
        while i <= 2*jmax-1:
            if i <= 2*jmax-2:
                B[i,i+1] = b
                B[i+1,i] = b
                B[i,i] = ((k + 2.0*i*N)/N)**2
                i = i+1
            else:
                B[i,i] = ((k + 2.0*i*N)/N)**2
                i = i+1

        x = linalg.eigvals(A)
        y = linalg.eigvals(B)

        j = 1
        while j<=3:
            if abs(y[j]-x[j]) <= 10.0**(-5):
                j = j + 1
            else:
                print 'jmax not large enough to obtain accurate results'

        spectrum1[k-1] = x[0] + 0.5*s
        spectrum2[k-1] = x[1] + 0.5*s
        spectrum3[k-1] = x[2] + 0.5*s

    indx = arange(1,2*N+1, 1)
    plot (indx, spectrum1, indx, spectrum2, indx, spectrum3)

    xlabel('k (energy level)')
    ylabel('E/E_r')
    title('Finite Size Band Structure, N = %d, s = %f' % (N, s))
    grid(True)



More information about the Python-list mailing list