Seite 1 von 1

spsolve return ändern

Verfasst: Samstag 27. August 2016, 13:41
von götze1988
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

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 17:03
von MagBen
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

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 17:28
von götze1988
Hi, danke für die Antwort. Habe es mit flatten() probiert, aber der array behält die dimension 2...

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 17:43
von 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.)

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 18:21
von götze1988
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

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 18:25
von 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.

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 18:56
von götze1988
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..

Re: spsolve return ändern

Verfasst: Samstag 27. August 2016, 19:06
von götze1988
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