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.
15 réponses
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.
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]]
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!
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
- é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
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.
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.
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).
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.
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.
jetez un oeil à ceci:
http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations
Il est extrêmement facile à utiliser et très puissant
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.
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..
à 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