Bonjour à tous
Je cherche à résoudre 2 systèmes d'équations couplées. Appelons les système A et système B.
L'un de ces 2 systèmes (disons système A) est un système EDO. Pour éviter de dupliquer l'information commune au 2 systèmes, je souhaite procéder avec des numpy.view
Je m'explique via le code :
Ici, à l'état initial, j'ai donc une synchronisation entre r.y (le système A) et data[2] (data contenant les informations du système B). Si je modifie l'un, l'autre se modifie aussi et vis versa. D'ailleurs, la commande r.y.base nous montre bien que r.y n'est qu'une view de data.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import numpy as np import scipy t0,t1,dt = 0.0,5.0, 1.0 data = np.ones((5,2)) data[:,1]*=2 y=np.array([0.0,0.0]) ### no matter default value r = scipy.integrate.ode(f) r.set_integrator('dopri5', rtol=1e-3, atol=1e-6 ) r.set_f_params(0.05) #r.set_initial_value(y, t0); r._y = data[2] ### Apparently equivalent r.set_initial_value(data[2], t0) ### Apparently equivalent print(np.shares_memory(r.y,y)) print(np.shares_memory(r.y,data))
Ce comportement m'arrange bien car si le système B auquel le système A est couplé, vient modifier une valeur, elle est directement mis à jour.
Jusque là tout va bien. Maintenant, je fais avancer mon EDO dans le temps
et là drame, data et r.y ne sont plus synchro. r.y n'est plus une view de data.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while r.successful() and r.t < t1: r.integrate(r.t+dt, step=True) print(r.t+dt,r.y) print(np.shares_memory(r.y,data)) print(data)
Il semblerait que la fonction integrate créée une nouvelle instance de son attribut r.y plutot que de simplement le mettre à jour. J'ai été voir un peu le code de cette fonction
mais en remontant un peu ça renvoie a du code fortran et là j'y comprends plus rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part https://github.com/scipy/scipy/blob/v0.19.1/scipy/integrate/_ode.py#L396
Comment puis-je résoudre (ou contourner) ce problème autrement qu'en me tapant une copie de l'information entre r.y et data, dont je devrais gérer la synchronisation à la main ?
Merci
Partager