So erstellen und lösen Sie simultane Gleichungen in Python

8

Für eine feste Ganzzahl n habe ich eine Menge von 2(n-1) simultanen Gleichungen wie folgt.

%Vor%

M(p) ist für 1 <= p <= n-1 definiert. N(p) ist für 0 <= p <= n-2 definiert. Beachten Sie auch, dass p nur eine konstante ganze Zahl in jeder Gleichung ist, so dass das ganze System linear ist.

Ich habe Maple benutzt, aber ich möchte diese jetzt einrichten und in Python lösen, vielleicht mit numpy.linalg.solve (oder einer anderen besseren Methode). Ich möchte eigentlich nur den Wert von M(n-1) . Zum Beispiel, wenn n=2 die Antwort sollte M(1) = 4 sein, glaube ich. Dies liegt daran, dass die Gleichungen zu

werden %Vor%

Deshalb

%Vor%

und so

%Vor%

Wenn ich n=50 einbinden möchte, wie kann man dieses System simultaner Gleichungen in Python einrichten, damit numpy.linalg.solve sie lösen kann?

Aktualisieren Die Antworten sind großartig, aber sie verwenden dichte Löser, bei denen das Gleichungssystem spärlich ist. Posted follow up zu Verwenden von scipy dünn besetzten Matrizen zum Lösen des Gleichungssystems .

    
lip1 16.01.2013, 20:34
quelle

3 Antworten

6

Aktualisiert: Implementierung mit scipy.sparse hinzugefügt

Dies ergibt die Lösung in der Reihenfolge N_max,...,N_0,M_max,...,M_1 .

Das zu lösende lineare System hat die Form A dot x == const 1-vector . x ist der gesuchte Lösungsvektor.
Hier habe ich die Gleichungen so angeordnet, dass x ist N_max,...,N_0,M_max,...,M_1 .
Dann baue ich die A -Koeffizient-Matrix aus 4 Blockmatrizen auf.

Hier ist ein Schnappschuss für den Beispielfall n=50 , der zeigt, wie Sie die Koeffizientenmatrix ableiten und die Blockstruktur verstehen können. Die Koeffizientenmatrix A ist hellblau, die konstante rechte Seite ist orange. Der gesuchte Lösungsvektor x ist hier hellgrün und dient zur Beschriftung der Spalten. Die erste Spalte zeigt, von welchem ​​der oben angegebenen Gleichungen. die Zeile (= Gl.) wurde abgeleitet:

Wie Jaime vorgeschlagen hat, verbessert die Multiplikation mit n den Code. Dies ist in der obigen Tabelle nicht enthalten, wurde jedoch im folgenden Code implementiert:

Implementierung mit numpy:

%Vor%

Lösung mit scipy.sparse:

%Vor%

Beispiel für n=4 :

%Vor%

Beispiel für n=10 :

%Vor%     
Theodros Zelleke 16.01.2013, 22:43
quelle
3

Das ist chaotisch, aber löst Ihr Problem, abgesehen von einem sehr wahrscheinlichen Fehler beim Transkribieren der Koeffizienten:

%Vor%

Aber es gibt eine Lösung von

%Vor%

für M(2) wenn n=3 , was Sie nicht gefunden haben.

    
Jaime 16.01.2013 22:08
quelle
3

Hier ist ein ganz anderer Ansatz, mit sympy . Es ist nicht schnell, aber es erlaubt mir, die RHS Ihrer Gleichungen genau zu kopieren, das Denken zu begrenzen, das ich tun muss (immer ein Plus), und gibt Bruchantworten.

%Vor%

was

ergibt %Vor%

und

%Vor%

was zu den anderen Antworten passt.

    
DSM 17.01.2013 14:01
quelle

Tags und Links