linalg.solve für nicht-quadratische Arrays

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

Hallo,

ich habe zwei Matrizen der Form 10x3, also aus 10 Zeilen und 3 Spalten bestehend, gegeben. Nun möchte ich die Gleichung A*x=B lösen, wobei A und B meine Matrizen sind. Die Funktion linalg.solve(A,B) funktioniert ja nicht, weil A nicht quadratisch ist.
Ich habe mir mal, um mich mit der Funktion vertraut zu machen, ein Programm geschrieben, welches mir die obige Gleichung löst. Dort war A quadratisch (3x3) und B ein 3x1 Vektor bzw. Array.
Nun haben in meinem aktuellen Problem A und B gleich viele Zeilen bzw. Spalten. Für x erwarte ich, dass da eine Matrix bzw. ein Array der Form 3x3 rauskommt. Ich habe in der Dokumentation mal nachgeschaut und die Funktion linalg.lstsq(A,B) verwendet. Jetzt bekomme ich eine seltsame Ausgabe, nämlich x = (array([[...,...,...],[...,...,...],[...,...,...]]), array([...,...,...]), 3, array([...,...,...])). Für eine bessere Übersicht habe ich die Einträge in den Arrays mit "..." abgekürzt.
Nun stellen sich mir folgende Fragen:
1. Brauche ich für mein Problem die Funktion linalg.lstsq(A,B) oder benötige ich eine andere Funktion?
2. Was bedeutet die Ausgabe mit den verschiedenen Lösungen für x?
3. Ich suche ja eine 3x3-Matrix. Ist mein x der ausgegebene Array array([[...,...,...],[...,...,...],[...,...,...]])?

Danke schon mal!
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hallo Kurtosis!

Die Frage ist eher was du berechen möchtest. `linalg.lstsq` berechnet die "least-squares solution". Lies dir am besten die Dokumentation der Funktion durch. Dort findest du auch eine Beschreibung der Rückgabewerte.

Grüße
Gerrit
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Kurtosis,
Dein Problem ist im Allgemeinen nicht lösbar. Du hast ein Gleichungssystem mit 10 Gleichungen aber nur 3 Unbekannte.
Was willst Du überhaupt machen?
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

Die Gleichung A*x=B kennt man von der Form her auch von der Gleichung für die Euler'sche Drehmatrix, wobei x die Drehmatrix ist. Wenn ich x habe, kann ich die drei Euler-Winkel bestimmen und weiß, wie ich A verdrehen muss, um auf B zu kommen.
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

Unabhängig davon, ob die Methode jetzt richtig ist, habe ich eine andere Frage. Diese Funktion wirft mir immer 4 Komponenten aus, wobei die erste Komponente ein Array ist, der hier in meinem Fall eine 3x3-Matrix darstellt. Das Problem ist, dass ich nicht weiß, wie ich auf einzelne Komponenten dieses Arrays zugreifen kann. Diese "Matrix" besteht ja aus drei Listen mit jeweils drei Werten. Mit x[0] kann ich mir von den vier Lösungen diese Matrix bzw. diesen 3x3-Array auswerfen lassen, doch wie komme ich jetzt z.B. an die Komponente, die in der ersten Zeile und Spalte steht?
BlackJack

@Kurtosis: Am besten arbeitest Du mal sowohl ein Python-Tutorial als auch ein Numpy-Tutorial durch um die Grundlagen zu lernen. Es macht nicht wirklich Sinn so etwas durch Frage/Antwort-Ping-Pong zu lernen.
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

BlackJack hat geschrieben:@Kurtosis: Am besten arbeitest Du mal sowohl ein Python-Tutorial als auch ein Numpy-Tutorial durch um die Grundlagen zu lernen. Es macht nicht wirklich Sinn so etwas durch Frage/Antwort-Ping-Pong zu lernen.
Ich programmiere schon seit einiger Zeit und habe auch schon einige Programme für mein Studium geschrieben, die erfolgreich das gemacht haben, was ich verlangt habe. Da ich kein Informatik studiere oder etwas mache, wo Python mein täglich Brot ist, erlerne ich diese Programmiersprache zumindest momentan nur bedarfsweise. Ich quängel hier weder rum, noch nerve ich mit Hausaufgaben oder dergleichen, sondern komme mit einem konkreten Problem bzw. einer konkreten Frage! Wo ist das Problem, darauf zu antworten? Abgesehen davon läuft mein Programm und liefert brauchbare Werte, so dass ich jetzt eigentlich nur noch wissen möchte, wie ich auf bestimmte Komponenten dieses Arrays zugreifen kann, weil das Problem gerade ist, dass mir dieser Array nur als Ganzes ausgegeben wird und nicht komponentenweise, so dass ich auf die Einzelteile zugreifen kann. Wenn es also einen Befehl gibt, womit ich mein x so "konvertieren" kann, dass ich wieder auf die einzelnen Zeilen und Komponenten zugreifen kann, dann wüsste ich den gerne, vor allem wenn manche User hier die Antwort kennen. Ich komme hier nicht mit leeren Händen an und sag "Macht mal!", sondern mit einer konkreten Frage zu einem Problem, welches ich programmiertechnisch schon fast vollständig gelöst habe. Wenn nicht mal sowas hier machbar ist, scheint dieses Forum mehr ein Elfenbeinturm für Python-Gurus zu sein.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kurtosis: was linalg.lstsq zurückliefert, steht in der Dokumentation. Also macht es doch wenig Sinn, hier die Dokumentation nochmals abzuschreiben.
Auf Zeilen einer Matrix zuzugreifen gehört zu den grundlegendsten Numpy-Grundlagen, so dass ein Hinweis auf die Dokumentation auch nicht verkehrt ist, weil ohne ein gewisses Grundwissen jedes Programmieren sehr mühsam ist: "x[1,:]"
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Kurtosis hat geschrieben:Abgesehen davon läuft mein Programm und liefert brauchbare Werte, [...] Ich komme hier nicht mit leeren Händen an und sag "Macht mal!", sondern mit einer konkreten Frage zu einem Problem, welches ich programmiertechnisch schon fast vollständig gelöst habe.
Bei meiner Nachfrage ging es mir aber um das mathematische Problem, welches du zuerst lösen musst, bevor du es programmiertechnisch umsetzen kannst. Wenn deine Gleichung (A * X = B) eine eindeutige Lösung hast, wäre A invertierbar und du kannst die Drehmatrix mit "X = (A.T * A).I * A.T * B" bestimmen. Wenn A aber nicht immer invertierbar ist, weil die Einträge von A oder B z.B. Messwerte mit Fehlern sind, musst du einen anderen Ansatz wählen. Eine Möglichkeit wäre dann ein "least square fit". Aber Vorsicht: der Standardalgorithmus (linalg.lstsq) ist für dein Problem nicht notwendigerweise geeignet.

Edit: Die Lösung ist natürlich: X = (A.T * A).I * A.T * B (oben geändert)
Zuletzt geändert von gkuhl am Donnerstag 13. Februar 2014, 17:08, insgesamt 1-mal geändert.
BlackJack

@Kurtosis: Du fragst hier Grundlagen von Python und Numpy für die es jeweils Tutorials gibt. Und fast alles was in diesen Grundlagentutorials steht muss man wissen um vernünftig mit Python und Numpy arbeiten zu können. Das kann man nicht „bedarfsweise” lernen. Das würde darauf hinauslaufen das Du statt selber mal zwei Tutorials durchzuarbeiten, hier bei jeder Kleinigkeit fragst und andere Dir einen kurzen Teil aus einem Tutorial ”vorlesen”. Und am Ende deutlich mehr Zeit von mehreren Leuten darin versenkt wird, dass Du den Inhalt von den Tutorials häppchenweise gefüttert bekommst.

Das konkrete Problem hättest Du auf eine allgemeine Art lösen können wenn Du über den Indexoperator bei Listen und damit Sequenzdatentypen allgemein bescheid wüsstest und produktiv mit Numpy kann man nur arbeiten wenn man weiss welche Arten von Werten man beim `array`-Typ alles als Index verwenden kann.

Gewisse Grundlagen von Programmiersprachen kann man nicht bedarfsweise lernen, beziehungsweise sind sie so grundlegend, dass sie bei jedem nicht-trivialen Programm benötigt werden und damit auch ein grundsätzlicher Bedarf besteht. Und da gehören IMHO die Grunddatenstrukturen und der Umgang damit dazu. Und wenn man Numpy verwendet kommt man nicht an den Grundoperationen vom `array`-Datentyp vorbei. Dich auf die jeweiligen Tutorials zu verweisen ist also durchaus als Hilfe gemeint und nicht als abwimmeln aus dem Elfenbeinturm.
Benutzeravatar
Kurtosis
User
Beiträge: 55
Registriert: Samstag 11. Dezember 2010, 14:32

Mit "bedarfsweise" meinte ich, dass ich ein recht zeitintensives Studium habe und nebenbei noch arbeite und sich meine Freizeit leider in Grenzen hält. Das soll keine Ausrede sein, sondern lediglich dem Verständnis dienen. Ich arbeite nebenbei auch mit einem Python-Buch, leider finde ich jedoch nicht immer die notwendige Zeit dafür.
Wie man auf Komponenten einer Liste zugreift, weiß ich für den "einfachen" Fall. Ich hatte eben eine Idee. x wirft mir vier Ergebnisse in einer Liste aus. Das erste Ergebnis in dieser Liste ist ein Array, welcher aus drei Listen mit jeweils drei Einträgen besteht. An den Array komme ich mit x[0]. Im Prinzip ist die Null hier wieder ein Array. Komme ich dann an die erste Liste dieses Arrays mit 0[0], so dass ich insgesamt x[0[0]] schreiben muss? Ich probiere dazu gleich mal paar Sachen aus. Vielleicht komme ich dann irgendwie an die Zahlenwerte in diesem berechneten Array, da ich diese für eine weitere Rechnung benötige.
Danke für eure Kommentare und Hilfe, vielleicht habe ich euch vorhin einfach missverstanden.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn ich der Meta-Diskussion das noch hinzufügen darf: "Keine Zeit" / "noch was anderes zu tun" ist eine sehr schlechte Begründung, um Sachen vorgekaut zu bekommen. Wenn du momentan eine arbeitsintensive Phase in der Uni hast, dann müssen Hobby-Projekte halt zurückgestellt werden. Falls es kein Hobby-Projekt ist, sondern für die Uni: Häng dich rein oder schieb das Modul.

Das wirst du aber alles selbst gut genug wissen. Ich wollte nur anmerken, warum so ein Argument ziemlich "billig" rüberkommt. Und, achja: Willkommen im Forum. ;)
BlackJack

@Kurtosis: Mit x[0] kommst Du an das erste Element von dem Objekt `x`. Das Ergebnis wieder ein Objekt. Wenn das den Indexoperator versteht, dann kannst Du *darauf* wieder den Indexoperator anwenden. Und das macht man nicht so ``x[0[0]]`` sondern etwas logischer: ``x[0][0]``.
Antworten