FENICS: Zeile einer Matrix auf 0 setzen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
MatheMagie
User
Beiträge: 6
Registriert: Montag 21. November 2016, 11:16

FENICS: Zeile einer Matrix auf 0 setzen

Beitragvon MatheMagie » Montag 21. November 2016, 11:23

Hallo zusammen,

Mit Hilfe von FENICS möchte ich eine Zeile einer Matrix auf 0 setzen.
Hierzu soll die zero() Funktion verwendet werden:
https://fenicsproject.org/documentation ... atrix.html

/edit: Alternativ kann das Ganze natürlich auch mit setrow() implementiert werden.

Um meine Idee zu veranschaulichen, habe ich versucht das ganze zu programmieren:
  1. from dolfin import *
  2. import numpy
  3.  
  4. mesh = UnitSquareMesh(50,50)
  5. F = FunctionSpace(mesh, "Lagrange", 1)
  6. x = TrialFunction(F)
  7. y = TestFunction(F)
  8.  
  9. m = inner(grad(x),grad(y))*dx
  10. M = assemble(m)
  11.  
  12. n = F.dim()
  13. d = mesh.geometry().dim()
  14. dof = F.tabulate_dof_coordinates().reshape(n,d)
  15.  
  16. o = numpy.array([], dtype=np.intc)
  17. for i in xrange(0, len(dof)):
  18.    if (i%100==0):
  19.       u = numpy.array([i], dtype=np.intc)
  20.       o = numpy.append(o, u)
  21.  
  22. n = len(o)
  23. M.zero(n, o)


Allerdings erhalte ich jedemal den Fehler "NotImplementedError: Wrong number or type of arguments for overloaded function 'Matrix_zero'."
und habe keine Idee diesen zu beheben. Kann mir jemand weiterhelfen?
Zuletzt geändert von BlackJack am Montag 21. November 2016, 11:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31344
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: FENICS: Zeile einer Matrix auf 0 setzen

Beitragvon BlackJack » Montag 21. November 2016, 11:49

@MatheMagie: Rein vom Bauchgefühl würde ich sagen lass das erste Argument weg weil das keinen Sinn macht. In der C++-API ist das die Anzahl weil als zweites Argument ein Zeiger auf den ersten Index übergeben wird. In Python weiss ein Numpy-Array seine eigene Länge, da muss man die nicht noch mal zusätzlich als Argument übergeben.

Das Array erstellst Du übrigens auf extrem umständliche Weise. Die Zeilen 16 bis 20 kann man auch so schreiben: ``o = numpy.arange(0, len(dof), 100, numpy.intc)``. Ohne das dauernd temporäre Arrays, teilweise mit nur einem Element, erzeugt und im Speicher herum kopiert werden müssen.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
MatheMagie
User
Beiträge: 6
Registriert: Montag 21. November 2016, 11:16

Re: FENICS: Zeile einer Matrix auf 0 setzen

Beitragvon MatheMagie » Montag 21. November 2016, 11:58

  1. from dolfin import *
  2. import numpy
  3.  
  4. mesh = UnitSquareMesh(50,50)
  5. F = FunctionSpace(mesh, "Lagrange", 1)
  6. x = TrialFunction(F)
  7. y = TestFunction(F)
  8.  
  9. m = inner(grad(x),grad(y))*dx
  10. M = assemble(m)
  11.  
  12. n = F.dim()
  13. d = mesh.geometry().dim()
  14. dof = F.tabulate_dof_coordinates().reshape(n,d)
  15.  
  16. o = numpy.array([], dtype=numpy.intc)
  17. for i in xrange(0, len(dof)):
  18.    if (i%100==0):
  19.       u = numpy.array([i], dtype=numpy.intc)
  20.       o = numpy.append(o, u)
  21.  
  22. M.zero(o)


Vielen Dank erstmal,
Ich habe beim kopieren des Codes noch 2 kleine Fehler gefunden.
Nun habe ich das erste Argument weggelassen.
Bekomme keine Fehlermeldung, allerdings weiß ich nicht so recht, wie ich das Ganze nun überprüfen kann.
Da bei Fenics eine Ausgabe der Matrix nicht so einfach möglich ist .


Das mit dem Erstellen des Array habe ich nur so gemacht, weil die IF-Bedingung späte rnoch um einiges komplizierter werden soll.
MatheMagie
User
Beiträge: 6
Registriert: Montag 21. November 2016, 11:16

Re: FENICS: Zeile einer Matrix auf 0 setzen

Beitragvon MatheMagie » Montag 21. November 2016, 12:11

Ich glaube, dass es so wie du sagtest funktioniert!
Gibt es eine Möglichkeit dieses nun auch auf einen Vektor anzuwenden?
In dem Array stecken alle Indizes die 0 gesetzt werden sollen.
Der Befehl v.zero(o) geht leider nicht.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31344
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: FENICS: Zeile einer Matrix auf 0 setzen

Beitragvon BlackJack » Montag 21. November 2016, 12:57

@MatheMagie: Auch wenn die ``if``-Bedingung komplizierter wird ist es keine gute Idee das so mit den Numpy-Arrays zu machen das Du das Array jedes mal um einen Wert erweiterst. Den Numpy-Arrays kann man nicht erweitern. `numpy.append()` erstellt da jedes mal ein neues Array was einen Speicherplatz länger ist, kopiert das vorherige Array in das neue Array und den neuen Wert an den letzten Index. Das ist superineffizient.

Um die ``if``-Bedingung gehören übrigens keine Klammern.

Was ist denn ein „Vektor“? Welche Methoden auf einem Objekt existieren hängt davon ab welchen Datentyp das Objekt hat.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
MatheMagie
User
Beiträge: 6
Registriert: Montag 21. November 2016, 11:16

Re: FENICS: Zeile einer Matrix auf 0 setzen

Beitragvon MatheMagie » Montag 21. November 2016, 13:08

MatheMagie hat geschrieben:
  1. from dolfin import *
  2. import numpy
  3.  
  4. mesh = UnitSquareMesh(50,50)
  5. F = FunctionSpace(mesh, "Lagrange", 1)
  6. x = TrialFunction(F)
  7. y = TestFunction(F)
  8.  
  9. m = inner(grad(x),grad(y))*dx
  10. M = assemble(m)
  11.  
  12. n = F.dim()
  13. d = mesh.geometry().dim()
  14. dof = F.tabulate_dof_coordinates().reshape(n,d)
  15.  
  16. o = numpy.array([], dtype=numpy.intc)
  17. for i in xrange(0, len(dof)):
  18.    if (i%100==0):
  19.       u = numpy.array([i], dtype=numpy.intc)
  20.       o = numpy.append(o, u)
  21.  
  22. M.zero(o)
  23.  
  24. f = Expression("5*sinx[0]")
  25. n = f*y*dx
  26. N = assemble(n)
  27.  



a) Ich habe den Vektor in den obigen Code mit eingebaut.
Mittels assemble(n) wird der Vektor N vom Typ 'dolfin.cpp.la.Vector' erstellt.
Hier sollen nun die selben Zeilen auf 0 gesetzt werden wie in der obigen Matrix.

b) Wie würde ich das mit dem array denn effizienter machen?
Auch bei komplexerer Bedingung

Zurück zu „Wissenschaftliches Rechnen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder