Как оживить сходящиеся итерации - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь оживить сходимость по ряду итераций для алгоритма 1-D Герхберга-Сакстона, но мне не удалось заставить его работать, используя matplotlib.animation или drawnow.Я могу построить их все на одном графике одновременно, используя цикл for в следующем коде, но хотел бы видеть их последовательно.Кто-нибудь может помочь?

import numpy as np
import pyfftw.interfaces.numpy_fft as fft
from matplotlib import pyplot as plt

aperture_width = 10
constraint_factor = 11
num_points = 2**16 
aperture_x = np.linspace(-20*aperture_width, 20*aperture_width, num_points)

# object to be recovered
g = np.array( abs(aperture_x) < (aperture_width/2), dtype=np.complex128)

# Field at Image plane
G = fft.fftshift(fft.fft(fft.fftshift(g)))

#Intensity at Image plane
G = abs(G)**2     # Only known value

constraint = np.array( abs(aperture_x) < (constraint_factor/2))  #object constraint - guess of object size

Gp = np.copy(G)  # make a copy of G

for i in range(10):

    gp = fft.fftshift(fft.ifft(fft.fftshift(np.sqrt(Gp))))     # first object "guess"
    gp = gp*constraint                                        # apply constraint to object

    Gp= fft.fftshift(fft.fft(fft.fftshift(gp)))              # calculate new image plane
    Gp = np.sqrt(G)*np.exp(1j*np.angle(Gp))                     # apply image domain constraint

    plt.plot(aperture_x,abs(G)**2/max(abs(G)**2),aperture_x,abs(Gp)**2/max(abs(Gp)**2))
    plt.xlim(-3,3)
    plt.pause(0.05)
plt.show()

1 Ответ

0 голосов
/ 26 февраля 2019

для построения анимации используйте plt.pause(0.05) #0.05 is time in secs между графиками.Вот пример кода

import matplotlib as plt

listValues = [i for i in range(0,10)] #random list just to show the basic concept

figure = plt.figure() #initialise figure object outside the loop
ax = figure.add_subplot(1,1,1) # get the subplot
for idx in listValues:
    ax.scatter(idx,idx) # here is your plotting
    plt.pause(0.05)

plt.show()

...