web-dev-qa-db-fra.com

Le moyen le plus simple de résoudre des équations mathématiques en Python

Je veux résoudre un ensemble d'équations, linéaires ou parfois quadratiques. Je n'ai pas de problème spécifique, mais souvent, j'ai souvent été dans cette situation.

Il est simple d’utiliser wolframalpha.com , l’équivalent Web de Mathematica, pour les résoudre. Mais cela ne fournit pas le confort et la commodité d'un shell iPython.

Existe-t-il une bibliothèque simple pour travailler sur des équations linéaires et quadratiques à partir d'un shell Python?

Personnellement, je trouve extrêmement pratique d’utiliser la calculatrice scientifique Casio 991 MS. Je sais comment définir des variables, résoudre des équations et en faire beaucoup. Je veux un tel outil utilisable de préférence depuis un shell ipython. Je suis surpris de n'en avoir trouvé aucun. Je ne suis pas assez impressionné par la sauge; peut-être me manque quelque chose.

20
Lakshman Prasad

sympy est exactement ce que vous cherchez.

45
Autoplectic

Vous estimez que la meilleure réponse est inacceptable.

Votre question est "Je veux un système de calcul formel gratuit que je puisse utiliser en Python."

La réponse est "SAGE fait ça."

Avez-vous examiné maxima/macsyma? SAGE fournit des liaisons pour cela, et c'est l'un des plus puissants libres.

http://maxima.sourceforge.net/

22
Paul McMillan

Voici comment résoudre votre question initiale en utilisant Python (via Sage). Ceci clarifie fondamentalement la remarque de Paul McMillan ci-dessus. 

sage: a,b,c = var('a,b,c')
sage: solve([a+b+c==1000, a^2+b^2==c^2], a,b,c)
[[a == 1000*(r1 + sqrt(r1^2 + 2000*r1 - 1000000))/(r1 + sqrt(r1^2 + 2000*r1 - 1000000) + 1000), b == -1/2*r1 - 1/2*sqrt(r1^2 + 2000*r1 - 1000000) + 500, c == r1], [a == 1000*(r2 - sqrt(r2^2 + 2000*r2 - 1000000))/(r2 - sqrt(r2^2 + 2000*r2 - 1000000) + 1000), b == -1/2*r2 + 1/2*sqrt(r2^2 + 2000*r2 - 1000000) + 500, c == r2]]
10
William Stein

Pour des solutions inexactes, consultez programmation linéaire et optimisation quadratique séquentielle , puis recherchez les bibliothèques Python qui effectuent de telles optimisations pour vous.

Si les équations nécessitent des solutions entières, vous devez rechercher les solveurs d'équations Diophantiennes pour Python.

Il suffit de noter que l’utilisation d’un solveur simple pour Project Euler manque l’essentiel. La partie amusante et éducative consiste à apprendre à le résoudre vous-même en utilisant des méthodes primitives!

6
csl

Avez-vous regardé SciPy ?

Il a un exemple dans les tutoriels sur la résolution d’algèbre linéaire:

http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html#solving-linear-system

4
Andre Miller

Pour référence: La solution de Wolfram Alpha :

a-1000!=0,   b = (1000 (a-500))/(a-1000),   c = (-a^2+1000 a-500000)/(a-1000)

En python, utilisez le module de résolution de sympy (notez qu'il suppose que toutes les équations sont égales à zéro):

>>> import sympy
>>> a, b, c = sympy.symbols('a, b, c')
>>> sympy.solve([a + b + c - 1000, a**2 + b**2 - c**2], b, c)
[(1000*(a - 500)/(a - 1000), (-a**2 + 1000*a - 500000)/(a - 1000))]

Et bien sûr, a! = 1000, car a-1000 est le dénominateur des deux équations.

3
Nate

APMonitor.com est un service Web gratuit permettant de résoudre des systèmes d'équations non linéaires à grande échelle (1 million et plus). Il existe une interface de navigateur et une API pour Python/MATLAB. L'API de Python est un script unique (apm.py) disponible au téléchargement à partir de la page d'accueil d'apmonitor.com. Une fois que le script est chargé dans un code Python, il donne la possibilité de résoudre les problèmes de:

  • Équations non linéaires
  • Équations différentielles et algébriques
  • Ajustement des moindres carrés
  • Estimation d'horizon mobile
  • Contrôle prédictif par modèle non linéaire
  • etc.

Pour le nouvel utilisateur, le logiciel APM Python dispose d'un forum Google Groupes où un utilisateur peut poser des questions. Des webinaires bimensuels présentent des problèmes d'optimisation dans les domaines de la recherche opérationnelle et de l'ingénierie.

Vous trouverez ci-dessous un exemple de problème d'optimisation (hs71.apm).

Model

  Variables

    x[1] = 1, >=1, <=5

    x[2] = 5, >=1, <=5

    x[3] = 5, >=1, <=5

    x[4] = 1, >=1, <=5

  End Variables



  Equations

    x[1] * x[2] * x[3] * x[4] > 25

    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40



    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]

  End Equations

End Model

Le problème d'optimisation est résolu avec le script Python suivant:

# Import

from apm import *

# Select server

server = 'http://xps.apmonitor.com'

# Application name

app = 'eqn'

# Clear previous application

apm(server,app,'clear all')

# Load model file

apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)

apm_option(server,app,'nlc.solver',3)

# Solve on APM server

solver_output = apm(server,app,'solve')


# Display solver output

print solver_output


# Retrieve results

results = apm_sol(server,app)

# Display results

print '--- Results of the Optimization Problem ---'

print results

# Display Results in Web Viewer 

url = apm_var(server,app)

print "Opened Web Viewer: " + url
3
John Hedengren

Je viens de commencer à utiliser GNU Scientific Library , qui est cependant la bibliothèque C. On dirait qu'il y a Python bindings aussi. Donc, il pourrait être intéressant de regarder.

2
user59634

J'utiliserais Octave pour cela, mais je suis d'accord, la syntaxe d'Octave n'est pas ce que j'appellerais passionnant (et la documentation m'embrouille toujours plus qu'elle ne m'aide).

1
Aaron Digulla

Essayez d’appliquer la méthode Bisection in py pour trouver la racine à partir d’un intervalle:

def f(x, rhs): # f(x) = e^x
    return math.e ** x - rhs # e^x = rhs -> e^x - rhs = 0

def solve(rhs, a = 0, b = 100, tol = 1e-3):
    while True:
        c  = (a + b) / 2.0
        if(f(a, rhs) * f(c, rhs) > 0):
            a = c
        else:
            b = c
        if(abs(f(c, rhs)) < tol):
            break
    return c

y = math.e ** 3.75 # x = 3.75
print(solve(y)) # 3.7499..
0
Mahmoud Khaled

Je ne pense pas qu'il existe une manière unifiée de traiter simultanément des équations linéaires et quadratiques (ou généralement non linéaires). Avec les systèmes linéaires, python est lié à des paquets de calcul algébrique linéaire et matriciel. Les problèmes non linéaires ont tendance à être résolus au cas par cas.

0
Victor Liu

Cela dépend de vos besoins:

Si vous voulez une interface graphique interactive, sage est probablement la meilleure solution.

Si vous souhaitez éviter d'utiliser une interface graphique tout en faisant de la calcul formel, sympy ou maxima peuvent couvrir vos besoins. (sympy semble très prometteur, mais il lui reste encore beaucoup de chemin à faire avant de pouvoir remplacer mathematica).

Si vous n'avez pas vraiment besoin d'algrebra symbolique, mais que vous avez besoin d'un moyen de programmer avec des matrices, de résoudre des équations différentielles et de minimiser les fonctions, scipy ou octave sont d'excellents points de départ.

0
niels

Regarde ça:

http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations

Il est extrêmement facile à utiliser et assez puissant

0
Rossella

Eh bien, je viens de googler dans cette page par accident. Je vois beaucoup de suggestions concernant ceci et cet outil logiciel, mais un outil fournit-il une réponse? La réponse réelle est:

[a, b, c] = [200,375,425]

Comment ai-je eu cela? En écrivant un programme rapide dans le langage de programmation Maxima, vous le retrouverez via une recherche par "force brute". Cela ne m'a pris que 10 minutes environ pour écrire, étant donné que je connais bien le langage Maxima. Il a fallu quelques secondes au programme pour s'exécuter. Voici le programme:

euler_solve (): = block ( [a, b, A, B, fin: 1000],

for a thru end do
    (
    for b thru end do
        (
        c: 1000 -a -b,
        if c < 0 then
            b:end
        else if a^2 + b^2 = c^2 then
            (
            A:a,
            B:b,
            a:end,
            b:end
            )
        )
    ),
return( [A,B,c])
);

Vous pouvez simplement couper et coller le code ci-dessus dans l'interface utilisateur wxMaxima, que je lance sous Ubuntu et non sous MS Windows. Ensuite, il vous suffit de saisir le nom de la fonction: euler_solve (), d'appuyer sur la touche Entrée, d'attendre quelques secondes, puis la réponse apparaît. Ce type de problème est si simple que vous pouvez utiliser n’importe quel langage de programmation général pour effectuer la recherche.

0
R.E.H.