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.
sympy est exactement ce que vous cherchez.
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.
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]]
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!
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
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.
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:
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
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.
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).
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..
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.
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.
Regarde ça:
http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations
Il est extrêmement facile à utiliser et assez puissant
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.