webentwicklung-frage-antwort-db.com.de

Einfachste Möglichkeit, mathematische Gleichungen in Python zu lösen

Ich möchte einen Satz Gleichungen lösen, linear oder manchmal quadratisch. Ich habe kein spezifisches Problem, aber ich war oft in dieser Situation.

Es ist einfach, wolframalpha.com , das Webäquivalent von Mathematica, zu verwenden, um sie zu lösen. Dies bietet jedoch nicht den Komfort und die Bequemlichkeit einer iPython-Shell.

Gibt es eine einfache Bibliothek zum Arbeiten mit linearen und quadratischen Gleichungen aus einer Python-Shell?

Ich persönlich finde es äußerst praktisch, den wissenschaftlichen Taschenrechner Casio 991 MS zu verwenden. Ich weiß, wie man Variablen setzt, Gleichungen löst und viel unternimmt. Ich möchte, dass ein solches Tool vorzugsweise innerhalb einer ipython-Shell verwendet werden kann. Ich bin überrascht, keine gefunden zu haben. Ich bin nicht genug beeindruckt von Salbei. Vielleicht fehlt mir etwas.

20
Lakshman Prasad

sympy ist genau das, wonach du suchst.

45
Autoplectic

Sie stimmen die beste Antwort als inakzeptabel ab.

Ihre Frage lautet "Ich möchte ein kostenloses Computer-Algebra-System, das ich in Python verwenden kann."

Die Antwort ist "SAGE tut das".

Haben Sie sich Maxima/Macsyma angesehen? SAGE bietet Bindungen dafür, und das ist eine der mächtigeren freien.

http://maxima.sourceforge.net/

22
Paul McMillan

So lösen Sie Ihre ursprüngliche Frage mit Python (über Sage). Dies erklärt im Wesentlichen die Bemerkung, die Paul McMillan oben macht. 

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
William Stein

Informieren Sie sich bei ungenauen Lösungen über lineare Programmierung und sequentielle quadratische Optimierung und suchen Sie dann nach Python-Bibliotheken, die solche Optimierungen für Sie durchführen.

Wenn die Gleichungen ganzzahlige Lösungen erfordern, sollten Sie nach Diophantine-Gleichungslösern für Python suchen.

Beachten Sie, dass bei der Verwendung eines einfachen Solvers für Project Euler der Punkt verfehlt wird. Der unterhaltsame und lehrreiche Teil besteht darin, zu lernen, wie man es mit primitiven Methoden selbst löst!

6
csl

Hast du SciPy angeschaut?

In den Tutorials zur Lösung der linearen Algebra gibt es ein Beispiel:

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

4
Andre Miller

Als Referenz: Die Lösung von Wolfram Alpha :

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

Verwenden Sie in Python sympys Solver-Modul (beachten Sie, dass alle Gleichungen gleich Null gesetzt sind):

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

Und natürlich ist a! = 1000, da a-1000 der Nenner der beiden Gleichungen ist.

3
Nate

APMonitor.com ist ein kostenloser Webservice zum Lösen großer Systeme nichtlinearer Gleichungen (über 1 Million). Es gibt eine Browser-Schnittstelle und eine API für Python/MATLAB. Die API für Python ist ein einzelnes Skript (apm.py), das von der Homepage von apmonitor.com heruntergeladen werden kann. Nachdem das Skript in einen Python-Code geladen wurde, können Probleme gelöst werden:

  • Nichtlineare Gleichungen
  • Differential- und algebraische Gleichungen
  • Kleinste Quadrate Modellbeschlag
  • Verschiebungshorizontschätzung
  • Nichtlineare Modellvorhersagesteuerung
  • usw.

Für den neuen Benutzer verfügt die APM Python-Software über ein Google Groups-Forum, in dem ein Benutzer Fragen stellen kann. Zweiwöchentlich stattfindende Webinare zeigen Optimierungsprobleme in der Betriebsforschung und im Engineering.

Unten ist ein Beispiel für ein Optimierungsproblem (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

Das Optimierungsproblem wird mit dem folgenden Python-Skript gelöst:

# 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
John Hedengren

Ich habe gerade angefangen, GNU Scientific Library zu verwenden, was jedoch die C-Bibliothek ist. Sieht so aus, als gäbe es auch Python Bindings . Es könnte also einen Blick wert sein.

2
user59634

Ich würde Octave verwenden, aber ich stimme zu, die Oktave-Syntax ist nicht das, was ich als aufregend bezeichnen würde (und die Dokumente verwirren mich immer mehr, als dass sie auch helfen).

1
Aaron Digulla

Verwenden Sie Bisection-Methode in py, um die Wurzel anhand eines Intervalls zu finden:

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
Mahmoud Khaled

Ich glaube nicht, dass es eine einheitliche Art gibt, gleichzeitig mit linearen und quadratischen (oder allgemein nichtlinearen) Gleichungen umzugehen. Bei linearen Systemen hat Python Bindungen zu linearer Algebra und Matrixpaketen. Nichtlineare Probleme werden in der Regel von Fall zu Fall gelöst.

0
Victor Liu

Das hängt von Ihren Bedürfnissen ab:

Wenn Sie eine interaktive grafische Benutzeroberfläche wünschen, ist sage wahrscheinlich die beste Lösung.

Wenn Sie die Verwendung einer grafischen Benutzeroberfläche vermeiden möchten, jedoch Computeralgebra verwenden möchten, können Sympy oder Maxima Ihre Anforderungen abdecken. (sympy sieht sehr vielversprechend aus, aber es ist noch ein weiter Weg, bevor mathematica ersetzt werden kann).

Wenn Sie nicht wirklich symbolische Algrebra benötigen, aber eine Möglichkeit benötigen, mit Matrizen zu programmieren, Differentialgleichungen zu lösen und Funktionen zu minimieren, sind Scipy oder Oktave hervorragende Ausgangspunkte.

0
niels

Schau dir das an:

http://openopt.org/FuncDesignerDoc#Solving_systems_of_nonlinear_equations

Es ist extrem einfach zu bedienen und sehr leistungsfähig

0
Rossella

Nun, ich habe gerade aus Versehen in diese Seite gegoogelt. Ich sehe viele Vorschläge zu diesem und diesem Softwaretool, aber liefert jedes Tool tatsächlich eine Antwort? Die tatsächliche Antwort lautet:

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

Wie habe ich das bekommen? Durch das Schreiben eines Schnellprogramms in der Maxima-Programmiersprache, um es über die "Brute-Force" -Suche zu finden. Das Schreiben dauerte nur etwa 10 Minuten, da ich mit der Maxima-Sprache vertraut bin. Es dauerte einige Sekunden, bis das Programm ausgeführt wurde. Hier ist das Programm:

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

Sie können den obigen Code einfach ausschneiden und in die wxMaxima-Benutzeroberfläche einfügen, die ich unter Ubuntu und nicht unter MS Windows laufe. Dann geben Sie einfach den Funktionsnamen ein: euler_solve (), drücken Sie die Eingabetaste, warten Sie ein paar Sekunden und die Antwort erscheint. Diese spezielle Art von Problem ist so einfach, dass Sie für die Suche eine beliebige Programmiersprache verwenden können.

0
R.E.H.