Gebiet zur Positivität der Determinante zu ploten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
neu
User
Beiträge: 1
Registriert: Dienstag 23. April 2024, 19:37

Hallo zusammen,

das ist mein erster Beitrag. Ich versuche eine ein Gebiet zu plotten in (x,y), wo die Determinante einer Matrix, deren Einträgen Funktion von x und y sind, positiv ist (s.u. wobei, dass es um die Determinante geht ist unwichtig hier; wichtig ist, dass reellwertige Funktionen von Matrizen in plot einzusetzen wären).

Offenbar meckert python, da bei der Erstellung der Grafik, „x“ und „y“ arrays und nicht reelle Zahlen sind (s.u., was kommentiert erscheint).

Ein blödes Beispiel wäre, xy>1 als det(M)>0 zu plotten, wo M=[[x,1],[1,y]] ist. Ich mache aus dem bool-wertigen Ergebnis x*y>1 eine Zahl (1 oder 0), was in dem ersten Fall Funktioniert. Drucke ich aber dies als Determinante aus, so habe ich ein Problem mit den Größen der arrays . Wie könnte ich arrays bzw. Matrizen in meinen Grafiken einsetzen?

Danke im Voraus

Code: Alles auswählen

import numpy as np
import math
from numpy import linalg as LA
from matplotlib.pyplot import *
from matplotlib import pyplot as plt
 
d = np.linspace(-2,2,200)
x,y = np.meshgrid(d,d)

# ~ print( LA.det(np.array( [[np.math.pi,1] , [1,1]] , dtype=float )) )

#  das funktioniert: 
# ~ plt.imshow( ((x*y >1 ) ).astype(int) , extent=(x.min(),x.max(),y.min(),y.max()),\
# ~ origin="lower", cmap="YlGn", alpha = 0.3)

# Das untere funktioniert nicht. Fehler lautet:
# ValueError: setting an array element with a sequence. 
# The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (2, 2) + inhomogeneous part.

plt.imshow( (LA.det( np.array( [[x,1] , [1,y]] , dtype=float )) )).astype(int), extent=(gmin,gmax,gmin,gmax),\
origin="lower", cmap="YlGn", alpha = 0.5)

plt.show()
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@neu: Schau mal wo das tatsächlich hakt und erklär mal was Du dachtest wie so ein Array aussehen soll. Als Import ist nur Numpy direkt nötig. Bis zum `linalg` oder gar zum plotten kommt das ja gar nicht bei dem Problemfall.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Üpsilon
User
Beiträge: 225
Registriert: Samstag 15. September 2012, 19:23

Bei dem konkreten Anliegen könnte die Funktion numpy.apply_along_axis helfen
https://numpy.org/doc/stable/reference/ ... _axis.html
PS: Die angebotene Summe ist beachtlich.
Üpsilon
User
Beiträge: 225
Registriert: Samstag 15. September 2012, 19:23

Code: Alles auswählen

>>> matrizen = np.array([[1,2,3,4], [1,1,2,2], [1,0,0,1]])
>>> def mydet(matrix):
...     return np.linalg.det(np.reshape(matrix, (2,2)))
... 
>>> mydet(matrizen[0])
-2.0000000000000004
>>> mydet(matrizen[1])
0.0
>>> mydet(matrizen[2])
1.0
>>> np.apply_along_axis(mydet, 1, matrizen)
array([-2.,  0.,  1.])
PS: Die angebotene Summe ist beachtlich.
Antworten