Если подумать, то, что у вас действительно есть, это проблема стиля динамического c программирования. Вы продолжаете пересчитывать одни и те же условия. Например, вам нужно рассчитать dx^3
только один раз, но вы делаете это npts^3
раз. Точно так же вам нужно вычислять каждый 3*wt(qi,pj,qo,po,to)
термин только один раз, но вы делаете это 2*npts
раз.
Попробуйте что-то вроде:
def class_corr(self,Delta,xi_q,Q,counter):
to = self.t
npts = 512
x0 = 12
dx =2*x0/npts
dx3 = dx**3
norm=0
classic=0
for n in range(0,npts+1):
qi = -x0+n*dx
for m in range(0,npts+1):
pj = -x0+m*dx
wt_curr = wt(qi,pj,qo,po,to)
for k in range(0,npts+1):
xi_pk = -x0+k*dx
f1 += dx3*wt_curr*F(qi,xi_pk,Delta, Q)
fn += dx3*wt_curr*G(qi,xi_pk,xi_q,Delta,Q)
if counter:
return [f1, fn/f1]
return fn/f1
Кроме того, вы рассчитываете F
& G
npts
больше раз, чем нужно. Похоже, что каждый меняется только с qi
и xi_pk
(xi_q
, Delta
и Q
, похоже, не отличаются в этом методе). Если вы попытаетесь использовать своего рода двухслойный defaultdict для записи значений qi
и xi_pk
, для которых вы уже рассчитали F
(или G
), вы затем сохраните множество ненужных вызовов и вычислений F
(или G
).
(PS - я знаю, что это не тот подход, который вы ищете, но я думаю, что он решает суть вашей проблемы. Вы тратите много времени на пересчет уже рассчитанных терминов. )