Запуск скрипта python несколько раз с разными переменными на каждой итерации

#python

Вопрос:

В настоящее время я моделирую прохождение света через оптическую систему с помощью python и Zemax. В настоящее время я настроил его, где я определяю границы x и y «датчика», чтобы я мог выбрать размер области, которую я хочу смоделировать. Я получаю 1 прямоугольник.

Я хотел бы смоделировать девять прямоугольников в сетке 3х3. Я не уверен, какой способ был бы самым элегантным… моя первая идея состояла в том, чтобы «жестко закодировать» разные интервалы в 9 разных сценариев и запустить их через сценарий bash, но это кажется немного «неэлегантным».

Как мне теперь определить xmax, xmin, ymax, ymin, чтобы я мог запустить ту же симуляцию и получить эти девять повторений?

Моя мысль состояла в том, чтобы, возможно, создать какой-то список, в котором определены границы, а затем, возможно, каждый раз повторять моделирование с другой границей и, наконец, объединять появляющиеся изображения.

Текущий код довольно длинный, но все параметры заданы в основных функциях, которые выглядят следующим образом:

 if __name__ == '__main__':

    DirNameZmx = r'C:SomePath'
    FileNameZmx = r"Optics.zmx"

    DirNameResults = r"C:SomeOtherPath"
    FileNameResults = r"Interferogram_Result"
    
    (QueueFieldsOut, QueueToDetector, ProcessRaytracing, ProcessesPsfWorkers, ProcessDetector) = 
        InitializeSimulation(DirNameZmx=DirNameZmx, FileNameZmx=FileNameZmx,
                             DirNameResults=DirNameResults, FileNameResults=FileNameResults,
                             FieldAngleHxMin=-0.02, FieldAngleHxMax= 0.02, dFieldAngleX=0.001,
                             FieldAngleHyMin=-0.06, FieldAngleHyMax= 0.06, dFieldAngleY=0.001,
                             NbrWavelength=1, Configurations=[1, 2], NbrRaysFieldRow=32, RAperture=0.99,
                             DetectorImageSize=11., DetectorPixelSize=0.011, ZeroPadding=8,
                             BatchRaysMax=512**2, NbrProcessWorkers=2)

    print(ProcessRaytracing.join())
    for Process in ProcessesPsfWorkers:
        print(Process.join())
        print(Process.name, Process.exitcode)

    print(ProcessDetector.join())

    data = np.load(os.path.join(DirNameResults, FileNameResults '.npy'))
    plt.imshow(data, cmap="coolwarm")
    plt.show()
 

FieldAngleHxMin/Max и FieldAngleHyMin/Max являются границами прямоугольника. Результат выглядит так:
введите описание изображения здесь

Комментарии:

1. Можете ли вы поделиться кодом, который вы в настоящее время используете, чтобы получить один прямоугольник, чтобы дать нам основу для работы и вписаться в ваш текущий подход?

2. Конечно, я виноват. Я отредактирую его в

3. Что-то еще, о чем я подумал, и где я не уверен, как именно это сделать, заключается в том, что у меня может быть своего рода справочный файл, в котором я указываю границы для каждого меньшего прямоугольника. Затем я импортирую этот файл в свой сценарий моделирования, а затем запускаю моделирование с каждым набором границ, т. Е. 9 раз

Ответ №1:

Простая итерация сделает всю работу.

Попробуйте это:

 def nine_squares(FieldAngleHxMin, FieldAngleHxMax, FieldAngleHyMin, FieldAngleHyMax):
    xstep = (FieldAngleHxMax - FieldAngleHxMin) / 3
    ystep = (FieldAngleHyMax - FieldAngleHyMin) / 3
    for i in range(3):
        for j in range(3):
            xstartpoint = xstep   i * FieldAngleHxMin
            xendpoint = xstep   (i   1) * FieldAngleHxMin
            ystartpoint = ystep   i * FieldAngleHyMin
            yendpoint = ystep   (i   1) * FieldAngleHyMin
            yield (xstartpoint, xendpoint, ystartpoint, yendpoint)
 

Он будет возвращать списки начальных и конечных координат при каждом вызове.

Комментарии:

1. Я понимаю, но разве это не даст мне 9 квадратов, которые заполняют большую площадь? Возможно, я неправильно прояснил свою проблему: я пытаюсь выполнить выборку детектора в 9 заранее определенных «областях», а не разбивать время моделирования на 9 частей.