numerica - La forma más sencilla de resolver ecuaciones matemáticas en Python
sistema de ecuaciones sympy (15)
Quiero resolver un conjunto de ecuaciones, lineales, o algunas veces cuadráticas. No tengo un problema específico, pero a menudo, he estado en esta situación a menudo.
Es fácil usar wolframalpha.com , el equivalente web de Mathematica, para resolverlos. Pero eso no proporciona la comodidad y la conveniencia de un shell iPython.
¿Existe una biblioteca simple para trabajar con ecuaciones lineales y cuadráticas desde un shell de python?
Personalmente, me parece extremadamente conveniente usar la calculadora científica Casio 991 MS. Sé cómo establecer variables, resolver ecuaciones y hacer mucho. Quiero una herramienta de este tipo, preferiblemente utilizable desde dentro de un shell ipython. Me sorprende no haber encontrado ninguna. No estoy suficientemente impresionado por el sabio; Tal vez me esté perdiendo algo.
¿Has mirado SciPy ?
Tiene un ejemplo en los tutoriales sobre resolución de álgebra lineal:
http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html#solving-linear-system
Acabo de comenzar a usar la Biblioteca Científica GNU , que sin embargo es una biblioteca C. Parece que también hay bindings Python. Por lo tanto, podría valer la pena mirar.
Aquí es cómo resolver su pregunta original utilizando Python (a través de Sage). Básicamente, esto aclara la observación que hace Paul McMillan.
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]]
Bueno, acabo de googlear en esta página por accidente. Veo muchas sugerencias con respecto a esta y esa herramienta de software, pero ¿alguna herramienta realmente proporciona una respuesta? La respuesta real es:
[a, b, c] = [200,375,425]
¿Cómo conseguí esto? Al escribir un programa rápido en el lenguaje de programación Maxima para encontrarlo a través de la búsqueda de "fuerza bruta". Solo tomó 10 minutos para escribir, ya que estoy familiarizado con el lenguaje de Maxima. El programa tardó unos segundos en ejecutarse. Aquí está el programa:
euler_solve (): = bloque ([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])
);
Simplemente puede cortar y pegar el código anterior en la interfaz de usuario de wxMaxima, que ejecuto en Ubuntu y no en MS Windows. Luego simplemente ingresa el nombre de la función: euler_solve (), pulsa retorno, espera unos segundos y aparece la respuesta. Este tipo particular de problema es tan simple que podría usar cualquier lenguaje de programación de propósito general para hacer la búsqueda.
Depende de tus necesidades:
Si desea una interfaz gráfica interactiva, entonces Sage 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 prometedora, pero aún queda un largo camino por recorrer antes de que puedan reemplazar las matemáticas).
Si realmente no necesita algrebra simbólico, pero necesita una forma de programar con matrices, resolver ecuaciones diferenciales y minimizar funciones, entonces scipy u octave son excelentes puntos de partida.
Descartas la mejor respuesta como inaceptable.
Tu pregunta es "Quiero un sistema de álgebra computacional gratuito que pueda usar en Python".
La respuesta es "SAGE hace eso".
¿Has mirado maxima / macsyma? SAGE proporciona enlaces para él, y ese es uno de los más libres.
Intente aplicar el método de Bisección en py para encontrar la raíz dado un intervalo:
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..
Mira esto:
http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations
Es extremadamente fácil de usar y bastante potente.
No creo que haya una manera unificada de tratar las ecuaciones tanto lineales como cuadráticas (o generalmente no lineales) simultáneamente. Con los sistemas lineales, python tiene enlaces a álgebra lineal y paquetes matriciales. Los problemas no lineales tienden a resolverse caso por caso.
Para obtener soluciones inexactas, lea sobre programación lineal y optimización cuadrática secuencial , luego busque las bibliotecas de Python que realizan tales 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 el Proyecto Euler falta el punto. ¡La parte divertida y educativa es aprender a resolverlo usted mismo utilizando métodos primitivos!
Para referencia: la solución de Wolfram Alpha :
a-1000!=0, b = (1000 (a-500))/(a-1000), c = (-a^2+1000 a-500000)/(a-1000)
En python, usando el módulo de resolución de sympy (tenga en cuenta que asume que todas las ecuaciones se establecen en 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.
Pensándolo bien, analicé Sage en detalle y claramente es el mejor software gratuito de matemáticas disponible.
Solo algunas de las diferentes bibliotecas relacionadas con Python Math que integra son absolutamente increíbles.
Paquetes matemáticos contenidos 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
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 a Python es un solo script (apm.py) que está disponible para descargar desde la página de inicio de apmonitor.com. Una vez que el script se carga en un código Python, le da la capacidad de resolver problemas de:
- Ecuaciones no lineales
- Ecuaciones diferenciales y algebraicas.
- Ajuste de modelo de cuadrados mínimos
- Estimación de horizonte móvil
- Modelo no lineal de control predictivo.
- 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 quincenales que muestran problemas de optimización en la investigación de operaciones e ingeniería.
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
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).
sympy es exactamente lo que estás buscando.