La façon la plus simple de résoudre des équations mathématiques en Python

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

Il est simple à utiliser wolframalpha.com, le web, l'équivalent de Mathematica pour les résoudre. Mais cela ne fournit pas le confort et la commodité d'une coquille d'iPython.

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

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

20
demandé sur bjb568 2009-10-29 11:48:29

15 réponses

sympy est exactement ce que vous cherchez.

43
répondu Autoplectic 2014-05-21 18:41:03

réduction la meilleure réponse inacceptable.

votre question Est "je veux un système D'algèbre informatique libre que je peux utiliser en Python."

la réponse est "SAGE fait cela."

Avez-vous regardé maxima/macsyma? SAGE fournit des fixations pour elle, et c'est l'un des plus puissants libres.

http://maxima.sourceforge.net/

22
répondu Paul McMillan 2009-10-29 08:58:09

Voici comment résoudre votre question originale en utilisant Python (via Sage). Cela clarifie fondamentalement la remarque faite par 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
répondu William Stein 2010-08-17 22:02:57

Pour les inexact solutions, lisez programmation linéaire et optimisation quadratique séquentielle, puis recherchez les bibliothèques Python qui réalisent de telles optimisations pour vous.

si les équations nécessitent des solutions entières, vous devriez chercher des solutionneurs D'équations diophantiennes pour Python.

il suffit de noter que l'utilisation d'un solveur simple pour le projet Euler manque le point. La partie amusante et éducative, c'est d'apprendre à le résoudre soi-même. en utilisant des méthodes primitives!

6
répondu csl 2009-10-29 08:57:46

Avez-vous regardé SciPy?

Il a un exemple dans les tutoriels sur la résolution de l'algèbre linéaire:

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

4
répondu Andre Miller 2009-10-29 09:03:38
  • équations non Linéaires
  • équations différentielles et algébriques
  • Moins ajustement du modèle des carrés
  • estimation de l'horizon mobile
  • modèle non linéaire Contrôle prédictif
  • etc.

pour le nouvel utilisateur, le logiciel APM Python dispose d'un forum Google Groups où un utilisateur peut poster des questions. Il y a des webinaires bimensuels qui présentent les problèmes d'optimisation dans la recherche opérationnelle et l'ingénierie.

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
répondu John Hedengren 2012-02-05 15:58:44

référence: Solution DE Wolfram Alpha:

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

En python, en utilisant module solveur de sympy (notez qu'il assume toutes les équations sont égaux à 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, une != 1000, comme l'une-1000 est le dénominateur des deux équations.

3
répondu Nate 2012-03-16 15:41:57

je viens de commencer à utiliser Bibliothèque Scientifique GNU, qui est cependant la bibliothèque C. On dirait Qu'il y a Python!--3-->liaisons trop. Il pourrait donc être intéressant de regarder.

2
répondu 2009-10-29 09:31:54

j'utilise Octave pour cela mais je suis d'accord, la syntaxe D'Octave n'est pas ce que j'appellerais palpitant (et les docs m'embrouillent toujours plus qu'ils ne m'aident, aussi).

1
répondu Aaron Digulla 2009-10-29 08:55:44

Je ne pense pas qu'il existe une façon unifiée de traiter simultanément les équations linéaires et quadratiques (ou généralement non linéaires). Avec les systèmes linéaires, python a des fixations à l'algèbre linéaire et aux paquets de matrice. Les problèmes non linéaires ont tendance à être réglés au cas par cas.

0
répondu Victor Liu 2009-10-29 08:59:22

Cela dépend de vos besoins:

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

si vous voulez éviter d'utiliser une interface graphique, mais que vous voulez quand même faire de l'algèbre informatique, alors sympy ou maxima peuvent couvrir vos besoins. (sympy semble très prometteur, mais il reste encore un long chemin à parcourir avant de pouvoir remplacer mathematica).

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

0
répondu niels 2009-11-01 12:14:15

jetez un oeil à ceci:

http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations

Il est extrêmement facile à utiliser et très puissant

0
répondu Rossella 2011-07-07 08:06:46

Eh bien, je viens de googler dans cette page par accident. Je vois beaucoup de suggestions à propos de cet outil logiciel, mais est-ce que n'importe quel outil fournit réellement une réponse? La réponse exacte est:

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

comment j'ai eu ça? En écrivant un programme rapide dans le langage de programmation Maxima pour le trouver via la recherche "brute force". Ça ne m'a pris que 10 minutes pour écrire, vu que je connais la langue Maxima. Il a fallu quelques secondes pour que l' programme à exécuter. Voici le programme:

euler_solve (): = bloc ( [ 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 j'exécute sous Ubuntu et non MS Windows. Ensuite, vous entrez juste le nom de la fonction: euler_solve(), appuyez sur retour, attendez quelques secondes, et la réponse apparaît. Ce type particulier de problème est si simple que vous pourriez utiliser n'importe quel langage de programmation À Usage général pour faire le rechercher.

0
répondu R.E.H. 2011-11-19 00:47:05

Essayez d'appliquer Méthode de la Bisection dans py trouver la racine étant donné 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
répondu Mahmoud Khaled 2018-06-07 12:28:18

à la réflexion, je suis passé par sage en détail et clairement il le meilleur des mathématiques logiciel gratuit disponible.

juste quelques-unes des différentes bibliothèques de mathématiques de python, il s'intègre est absolument génial.

paquets de mathématiques contenus dans Sage:

Algebra GAP, Maxima, Singular 
Algebraic Geometry  Singular
Arbitrary    Precision
Arithmetic  GMP, MPFR, MPFI,    NTL
Arithmetic Geometry PARI, NTL,      
mwrank, ecm Calculus    Maxima, SymPy, 
GiNaC Combinatorics Symmetrica,     
Sage-Combinat Linear Algebra    Linbox,
IML Graph Theory    NetworkX Group     
Theory  GAP Numerical
computation GSL,    SciPy, NumPy,
ATLAS

autres paquets contenus dans Sage:

Command line    IPython Database    ZODB,
Python Pickles, SQLite Graphical
Interface   Sage Notebook, jsmath
Graphics    Matplotlib, Tachyon3d, GD,
Jmol Interactive 
programming language  Python 
Networking  Twisted
-1
répondu Lakshman Prasad 2009-11-01 09:46:00