2009-10-29 22 views
20

Quiero resolver un conjunto de ecuaciones, lineales oa veces cuadráticas. No tengo un problema específico, pero a menudo, he estado en esta situación a menudo.Manera más simple de resolver ecuaciones matemáticas en Python

Es simple de usar wolframalpha.com, el equivalente web de Mathematica, para resolverlos. Pero eso no proporciona la comodidad y la conveniencia de un shell iPython.

¿Hay una biblioteca simple para trabajar en ecuaciones lineales y cuadráticas desde un shell de python?

Personalmente, me resulta extremadamente conveniente utilizar la calculadora científica Casio 991 MS. Sé cómo establecer variables, resolver ecuaciones y hacer mucho. Quiero una herramienta que preferiblemente se pueda usar desde dentro de un shell ipython. Estoy sorprendido de no haber encontrado ninguno. No estoy lo suficientemente impresionado por el sabio; quizás me estoy perdiendo algo.

+0

proyecto euler, yo también! –

+0

¿Conoces el Maxima Language y la interfaz WxMaxima? Lo encuentro más acogedor que IPython – Foad

Respuesta

1

Usaría Octave para esto, pero estoy de acuerdo, la sintaxis de Octave no es lo que llamaría emocionante (y los documentos siempre me confunden más de lo que ayudan, también).

5

Para soluciones inexactas, lea en linear programming y sequential quadratic optimization, luego busque las bibliotecas de Python que realicen dichas optimizaciones para usted.

Si las ecuaciones requieren soluciones enteras, debe buscar solucionadores de ecuaciones diofánticas para Python.

Solo tenga en cuenta que al usar un solucionador simple para Project Euler le falta el punto. ¡La parte divertida y educativa es aprender a resolverlo tú mismo usando métodos primitivos!

22

Usted descarta la mejor respuesta como inaceptable.

Su pregunta es "Quiero un sistema gratuito de álgebra computacional que pueda usar en Python".

La respuesta es "SAGE hace eso".

¿Has mirado maxima/macsyma? SAGE proporciona enlaces para ello, y ese es uno de los más potentes y gratuitos.

http://maxima.sourceforge.net/

0

No creo que hay una manera unificada de tratar con ecuaciones lineales y cuadráticas tanto (o, en general no lineal) de forma simultánea. Con sistemas lineales, python tiene enlaces a álgebra lineal y paquetes de matriz. Los problemas no lineales tienden a resolverse caso por caso.

+0

Los enlaces máximos de SAGE pueden ocuparse de casi cualquier cosa que les arrojes. –

2

Acabo de comenzar a usar GNU Scientific Library, que sin embargo es C library. Parece que hay Python bindings también. Entonces, valdría la pena mirarlo.

+0

+1, GSL es una gran biblioteca. –

-1

Pensándolo bien, pasé por sabio en detalle y claramente es el mejor software libre de matemáticas disponible.

Solo algunas de las diferentes bibliotecas relacionadas con Python Math, integradas son absolutamente increíbles.

paquetes de matemáticas contenidas en 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 

Otros paquetes contenidos en 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 
+10

Es descortés responder a su propia pregunta con un duplicado de respuestas proporcionadas por otros, y luego aceptar su propia respuesta. En su lugar, acepte la respuesta correcta de otra persona y edite su pregunta para incluir la información que le pareció útil o responda en un comentario. –

+0

Paul, estos puntos no son la fuerza impulsora principal de mí, ni del sitio, creo. Superar esa obsesión. La gente está aquí para compartir información. –

+8

Bastante cojo, Lakshman. – so12311

0

Depende de sus necesidades:

Si desea una interfaz gráfica interactiva, a continuación, la salvia es probablemente la mejor solución.

Si desea evitar el uso de una interfaz gráfica, pero aún desea hacer álgebra computacional, entonces sympy o maxima pueden cubrir sus necesidades. (Sympy parece muy prometedor, pero todavía le queda un largo camino por recorrer antes de que puedan reemplazar a las matemáticas).

Si realmente no necesita algrebra simbólica, pero necesita una forma de programar con matrices, resolver ecuaciones diferenciales y minimizar funciones, entonces scipy u octava son excelentes puntos de partida.

10

Aquí se explica cómo resolver su pregunta original utilizando Python (a través de Sage). Esto básicamente aclara la observación que Paul McMillan hace arriba.

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]] 
0

Bueno, acabo buscado en Google en esta página por accidente. Veo muchas sugerencias sobre esta y esa herramienta de software, pero ¿alguna herramienta realmente proporciona una respuesta? La respuesta real es:

[a, b, c] = [200375425]

¿Cómo llegué a esto? Al escribir un programa rápido en el lenguaje de programación de Maxima para encontrarlo a través de la búsqueda de "fuerza bruta". Solo tardé unos 10 minutos en escribir, ya que estoy familiarizado con el lenguaje Maxima. Tardó algunos segundos para que el programa se ejecutara. Aquí está el programa:

euler_solve(): = bloquean ( [a, b, A, B, final: 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]) 
); 

Sólo puede cortar y pegar el código anterior en la La interfaz de usuario wxMaxima, que ejecuto bajo Ubuntu y no en MS Windows. Luego solo ingresas el nombre de la función: euler_solve(), presionas return, esperas unos segundos y sale la respuesta. Este tipo de problema en particular es tan simple que podría usar cualquier lenguaje de programación de propósito general para hacer la búsqueda.

+2

[200, 375, 425] es una solución potencial, pero hay un conjunto infinito de soluciones para este conjunto de ecuaciones. [-499000, 999, 499001] es otro. Una solución numérica probablemente no es lo que el OP está buscando. – Nate

+0

Esta respuesta no es relevante ya que la pregunta es específica de Python. El comentario sobre soluciones infinitas tampoco lo es, ya que el problema al que se refiere esta pregunta (Proyecto Euler 9) tiene limitaciones y específicamente limita su solución a una sola tupla. – anddam

3

Un servicio web gratuito para resolver sistemas a gran escala de ecuaciones no lineales (1 millón +) es APMonitor.com. Hay una interfaz de navegador y una API para Python/MATLAB. La API para Python es una secuencia de comandos única (apm.py) que está disponible para su descarga desde la página de inicio de apmonitor.com.Una vez que la secuencia de comandos se carga en un código Python, da la capacidad de resolver problemas de:

  • ecuaciones no lineales
  • diferencial y ecuaciones algebraicas
  • mínimos cuadrados modelo apropiado
  • Moving horizonte estimación
  • Control predictivo modelo no lineal
  • etc.

Para el nuevo usuario, el software APM Python tiene un foro de Grupos de Google donde un usuario puede publicar preguntas. Hay seminarios web bisemanales que muestran los problemas de optimización en la investigación e ingeniería de operaciones.

A continuación se muestra un ejemplo de un problema de optimización (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 

El problema de optimización se resuelve con la siguiente secuencia de comandos de Python:

# 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

Como referencia: Wolfram Alpha's solution:

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

en Python, utilizando sympy's solver module (tenga en cuenta que asume todas las ecuaciones son conjunto igual a cero):

>>> 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))] 

Y, por supuesto, a! = 1000, como a-1000 es el denominador de las dos ecuaciones.

Cuestiones relacionadas