spsolve return ändern

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Hi,

es geht darum, dass ich innerhalb einer for-Schleife mittels spsolve Gleichungssystem löse. Jetzt gibt spsolve als return ein zweidimensionales array zurück, d.h bspw. [ [1,2,3]]. Nun rechne ich aber mit dem Ergebnis des Gleichungssystems weiter und benötige es als eindimensioanles array, also in dem Fall [1,2,3], da sonst im nächsten Schritt der for Schleife Probleme mit dem lösen des Gleichungssystems auftreten, also ein "ValueError: matrix - rhs dimension mismatch" . Hier ein der elementare Ausschnitt des Codes:

Code: Alles auswählen

F1=np.zeros((P-1,N-1))
I=sparse.eye((P-1)*(N-1))
G=np.zeros((P-1,N-1))
data = []
for i in range(1,M+1):
     G[0,0]=g(t[i],c+h,e)+g(t[i],c,e+h)
     G[0,N-2]=g(t[i],d-h,e)+g(t[i],d,e+h)
     G[0,1:N-2]=g(t[i],x1[2:N-1],e)
     G[1:P-2,0]=g(t[i],c,x2[2:P-1])
     G[1:P-2,N-2]=g(t[i],d,x2[2:P-1])
     G[1:P-2,1:N-2]=np.zeros((P-3,N-3))
     G[P-2,0] = g(t[i],c,f-h)+ g(t[i],c+h,f)
     G[P-2,N-2] = g(t[i],d-h,f) + g(t[i],d,f-h)
     G[P-2,1:N-2]=g(t[i],x1[2:N-1],f)
     G1=(1/h**2)*G.flatten()
     for j in range(P-1):
            F1[j,:]=f1(t[i],x1[1:N],x2[j+1])
     F11=F1.flatten()

     A=(I-sigma*k*H+k*B2)
     fsou=k*(G1+F11)+ y00_innen

     y00_innen = np.mat(sparse.linalg.spsolve(A, fsou))

     data.append(y00_innen)
H und B2 sind Matritzen derselben Dimension wie I und wurden früher definiert, y00_innen derselbe Dimension(bevor das Gleiuchugssystem gelöst wird) wie G1 und F11 , k und sigma einfache Skalare.

Lg und Vielen Dank,
Götze
Zuletzt geändert von Anonymous am Samstag 27. August 2016, 15:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du kannst die shape des Array ändern oder flatten() aufrufen:

Code: Alles auswählen

import numpy as np

a = np.arange(12)
print a.shape
#(12,)
print a 
#[ 0  1  2  3  4  5  6  7  8  9 10 11]

a.shape = (3,4)
print a 
#[[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]]

a.shape = (1,2,3,2)
print a
#[[[[ 0  1]
#   [ 2  3]
#   [ 4  5]]
#
#  [[ 6  7]
#   [ 8  9]
#   [10 11]]]]

print a.flatten()
#[ 0  1  2  3  4  5  6  7  8  9 10 11]

a.shape = (3,5)
#ValueError: total size of new array must be unchanged
a fool with a tool is still a fool, www.magben.de, YouTube
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Hi, danke für die Antwort. Habe es mit flatten() probiert, aber der array behält die dimension 2...
BlackJack

@götze1988: Kann es sein dass Du hier wieder das gleiche Problem hast, nur in umgekehrter Richtung? Die `flatten()`-Methode verändert das Objekt auf dem sie aufgerufen wird nicht, sondern gibt ein neues Objekt zurück. (Das sich in der Regel aber immer noch auf die selben Daten bezieht.)
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Hi,
tut mir leid für mein Unverständnis, ich bin wirklich ein Anfänger in Python, musste es innerhalb von 2 Wochen lernen um nen Code für meine Bachelor-Arbeit zu schreiben..

Wenn flatten() das Objekt nicht ändert, wie ändere ich es dann, denn ich brauche ja ein geändertes Objekt, um spsolve anzuwenden, soweit ich das richtig verstanden habe..
Lg und Vielen Dank
BlackJack

@götze1988: Du kannst dem `shape`-Attribut einen entsprechenden Wert zuweisen, oder halt nicht das Objekt ändern sondern mit dem Rückgabwert von `flatten()` weiterarbeiten. Du verwendest `flatten()` in dem Quelltext im ersten Beitrag doch sogar schon.
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Ich habe jetzt mal ein Test-file gemacht:

Code: Alles auswählen

import numpy as np


a=np.array([[1,2,3]])


a.shape=(3) ( oder a=a.flatten() )

print(a)

Ausgabe: [1,2,3]
Wenn ich das in meinem Code ändere, also nach dem Lösen der Gleichungssystems schreibe:

Code: Alles auswählen

.
.
y00_innen = np.mat(sparse.linalg.spsolve(A, fsou))
 y00_innen.shape=(59501)
   print(y00_innen)
   
   Ausgabe : [ [ 1,2,3,...]]
Das Verstehe ich nicht ganz..
götze1988
User
Beiträge: 13
Registriert: Samstag 6. August 2016, 13:02

Hi Blackjack,
ich habe jetzt die Lösung gefunden, ich musste in spsolve den Lösungsvektor transponieren, da ich eine ältere Version habe.
Vielen Dank für deine Hilfe und lg
Antworten