Параллельное решение дифференциального уравнения, python

Я численно решаю дифференциальное уравнение, зависящее от параметров. Меня действительно интересуют не решения, а их поведение в зависимости от значения параметров. Поскольку мне нужно очень точное описание, я должен использовать очень тонкий массив значений параметров, что приводит к множеству процессов решения ODE. Поэтому я хочу знать, можно ли «распараллелить» такую ​​программу. Идея состоит в том, что, возможно, каждый процессор моего компьютера может решить ODE для отдельной пары параметров. Своеобразный пример такой:

import matplotlib.pyplot as plt
from scipy.integrate import ode
import numpy as np

# - ODE - #
def sys(t,x,p1,p2): #p1 and p2 are the parameters
    dx=np.zeros(2)
    dx[0] = x[1]
    dx[1] = (p1+p2*cos(t))*x[0]
    return dx

t0=0; tEnd=10; dt=0.01
r = ode(sys).set_integrator('dopri5', nsteps=10,max_step=dt)
Y=[];S=[];T=[]
ic=[.1,0] 
# - parameters range - # 
P1=np.linspace(0,1,100)
    P2=np.linspace(0,1,100)
# -------------------- #
for p1 in P1:
    for p2 in P2:
        r.set_initial_value(ic, t0).set_f_params(p1,p2)
        flag='No'
        while r.successful() and r.t +dt < tEnd:
            r.integrate(r.t+dt)
            Y.append(r.y)
            T.append(r.t)
                #-This is what we want to know.
            if r.y[0]>2*ic[0]:
                flag='Yes'
                break
        if flag=='Yes':     
            plt.scatter(p1,p2,s=1, c='k', marker='.')
# ------------------------------------ #
plt.show()

Обратите внимание, что каждый for цикл независим, поэтому: возможно ли сделать эти for циклы параллельно? Итак, я мог бы предположить, что возможно, что каждый из моих 8 процессоров выполняет один двойной for цикл за раз, а затем, вероятно, ускоряет вычисления примерно в 8 раз? Или хотя бы быстрее?


person PepeToro    schedule 04.10.2013    source источник
comment
Взгляните на модуль queue   -  person kalhartt    schedule 04.10.2013
comment
Спасибо, я проверил, но я нашел также dispy, который решает мою проблему так, как я хотел, я подумал об ответе мой собственный вопрос, но, похоже, это невозможно, по крайней мере, для меня.   -  person PepeToro    schedule 01.11.2013
comment
@ user58533 Думаю, у вас достаточно очков репутации, чтобы ответить на свой вопрос. Я думаю, было бы интересно увидеть более подробную информацию о вашем решении :)   -  person Steve Koch    schedule 14.01.2014
comment
Вы также можете использовать mpi4py, если знакомы с самим MPI. Ваша проблема может быть легко распараллелена с помощью MPI, а интерфейс mpi4py довольно прост.   -  person deepak    schedule 04.09.2015


Ответы (1)


Я думаю, что проще всего использовать multiprocessing, просто реализуя внутренние циклы как подставку. одна функция и запустить result = Pool(8).map(solver, P1). Для масштабирования на нескольких компьютерах я бы рекомендовал Apache Spark.

Изменить: обратите внимание, что вы не можете вызывать методы построения графика внутри самого метода, вы должны возвращать необработанные числа вызывающему и строить график после завершения .map вызовов.

person NikoNyrh    schedule 01.10.2015