Why are analytic FFT and computational FFT not matching?
The fourier transform is defined for both positive and negative frequencies.  It looks like your first plot is just the positive frequencies, whereas the second plot contains both the positive and negative frequencies.  It's  common in computational fft routines to have the positive frequencies occupy elements 1 to N/2 in the results vector, and then elements N/2 to N are the negative frequencies.  Also, computational results are often unscaled.  You'll need to divide the results by the length of the window. Here is a short article I wrote explaining this for matlab http://mechanicalvibration.com/Making_matlab_s_fft_functio.html  Your results for python should be similar.