Lors de calculs numériques, il y a de bonnes chances de résoudre une équation simultanée non linéaire. Il y a de nombreuses années, lorsque j'étais étudiant diplômé en recherche, je l'ai mis en œuvre à Fortran. Récemment, j'ai plus d'occasions d'écrire des programmes en Python et j'ai rencontré une situation où j'ai résolu à nouveau une équation simultanée non linéaire. La méthode Newton est la méthode la plus connue pour résoudre des équations simultanées non linéaires, mais j'ai cherché une bonne bibliothèque car elle est difficile à implémenter à partir de zéro.
C'était facile, pas étrange. Cette fois, je voudrais résoudre les équations simultanées non linéaires suivantes à titre d'exemple.
Le code source est le suivant. Je donnerai une brève explication plus tard.
import numpy as np
from scipy import optimize
#Renvoie la fonction que vous souhaitez résoudre dans une liste
def func(x):
return [x[0]**2 + x[1]**2 -1.0,
x[0]]
result = optimize.root( func, [ 1.0, 0.0], method="broyden1")
print(result)
Le résultat de l'exécution est le suivant.
fun: array([-1.98898568e-07, -5.14009858e-06])
message: 'A solution was found at the specified tolerance.'
nit: 9
status: 1
success: True
x: array([-5.14009858e-06, 9.99999901e-01])
Pour plus de détails sur l'utilisation de scipy.optimize.root, reportez-vous à la documentation scipy. Voici une explication approximative. Le premier argument de Optimize.root est la fonction func qui définit la fonction que vous souhaitez résoudre. Le deuxième argument est la valeur initiale à utiliser pour commencer à résoudre le problème. Le troisième argument est l'endroit où vous spécifiez comment résoudre. Pour plus de détails, veuillez vous référer au document scipy, mais voici une mise en garde. .. Cette fois, broyden1 est spécifié dans la méthode, mais en fonction de l'argument, la matrice de Jacobi doit être définie séparément. Ce fut un problème pour moi, alors j'en ai choisi un qui ne nécessite pas de procession Jakobi.
De plus, la partie importante du résultat de l'exécution est la partie de x: array (), qui représente la solution réelle, et cela semble être comme $ x = 0, y = 1 $. Voir scipy.optimize.OptimizeResult pour plus de détails sur la solution.
Python est pratique car il peut être facilement implémenté de différentes manières. Je voulais me rencontrer quand j'étais étudiant diplômé. Non, je l'ai rencontré, mais c'était gênant de changer de train, alors j'ai fait semblant de ne pas le voir. Pardon.
Recommended Posts