Résolution système d'équations en Python3

Bonjour,
Je cherche à construire un modèle numérique d'un système de refroidissement hydraulique. J'obtiens deux équations (d'une part le bilan des débits volumique en un nœud et d'autre part le bilan des pertes de charges sur une maille) pour deux inconnues (Q1 et Q2), qui sont les deux débits volumiques dans les deux branches de mon circuit qui construisent la maille du système.
J'obtiens donc le système suivant :

Eq1 : Q1 + Q2 = Qentree
Eq2 : C1*Q1^2 + C2*Q1^(1.75) = C3*Q2^2 + C4*Q2^(1.75)

C1 à 4, sont des constantes géométriques (dimensions des conduites notamment). Qentree est connu.
J'ai tenté d'utiliser plusieurs outils de résolution différents en Python (fsolve, sym.solve etc...), mais aucun ne converge, au contraire j'obtiens dans tous les cas des messages d'erreur (par exemple :
"RuntimeWarning: The iteration is not making good progress, as measured by the improvement from the last ten iterations."
ou tout simplement "NotImplementedError: could not solve".

J'en viens donc à penser que j'ai également un problème de fond dans mon système d'équations, d'ordre "mathématique" plutôt que numérique.
Auriez-vous des suggestions ?
Je vous remercie par avance.
Bien cordialement.
Nicolas.

Réponses

  • Bonjour,
    Je viens d'essayer ton système avec fsolve et je n'ai pas de souci (la réponse est instantanée).

    Peux-tu copier ici ton script pour voir où est le problème ?
  • Bonjour Philippe,
    Merci pour votre retour rapide. Voici mon code.
    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
    import numpy as np
    from scipy.optimize import fsolve
    
    
    # Non-linear system solving ==================================================
    
    def myFunction(z):
       x = z[0]
       # x => QBA
       y = z[1]
       # y => QSL
       
       F = np.empty((2))
       F[0] = x + y - Qin
       F[1] = CX2*x**2+CX175*x**1.75-CY2*y**2-CY175*y**1.75
       return F
    
    Qin = 0.0002
    CX2 = 106770282.58780318
    CX175 = 8979022.107152052
    CY2 = 316500534.8148744
    CY175 = 7839661.47294004
    
    zIni = [1,1]
    z = fsolve(myFunction,zIni)
    print(z)
    
    Le message d'erreur associé étant le suivant :
    testSystemSolve.py:23: RuntimeWarning: invalid value encountered in double_scalars
      F[1] = CX2*x**2+CX175*x**1.75-CY2*y**2-CY175*y**1.75
    
    Encore merci.
    Bien cordialement.
    Nicolas.
  • Bonjour,

    Si tu plaçais ton code entre deux balises "Code" (clique sur la cinquième icone à partir de la fin), tu aurais ton code correctement indenté.

    Cordialement,

    Rescassol
  • Bonjour Rescassol
    Merci pour votre conseil, c'est effectivement beaucoup mieux ainsi.
    Nicolas
  • En changeant zini, cela suffit. Mais on peut aussi augmenter le nombre d'appel (maxfev).
    from scipy.optimize import fsolve
    
    # Non-linear system solving ==================================================
    
    def myFunction(z):
       x = z[0]
       # x => QBA
       y = z[1]
       # y => QSL
       return [x + y - Qin, CX2*x**2+CX175*x**1.75-CY2*y**2-CY175*y**1.75]
    
    Qin = 0.0002
    CX2 = 106770282.58780318
    CX175 = 8979022.107152052
    CY2 = 316500534.8148744
    CY175 = 7839661.47294004
    
    zIni = [b][0.0001,0.0001][/b]
    z = fsolve(myFunction,zIni,[b]maxfev=1000[/b])
    print(z)
    

    Sortie : [1.17961301e-04 8.20386994e-05]

    maxfev : The maximum number of calls to the function.
  • Ok, j'avais essayé avec des constantes plus petites, c'est pour cela que je n'avais pas a priori de problème quant à la résolution approchée du système.
  • Julien,
    Merci beaucoup pour votre retour, j'obtiens maintenant également le même résultat !
    Ce que j'en déduis donc, c'est que la résolution du système avec fsolve est très tributaire du choix des valeurs d'initialisation (ce qui en soit me paraît maintenant assez naturel!).
    Merci à tous pour votre aide.
    Bien cordialement
    Nicolas
Connectez-vous ou Inscrivez-vous pour répondre.