Forum: Mikrocontroller und Digitale Elektronik Atmega1280 - Lineare Algebra


von etMax (Gast)


Lesenswert?

Hi!

Für ein Projekt bin ich auf der Suche nach einer Bibliothek für lineare 
Algebra für einen Atmega1280.

Es müsste ein 10x10-generalized-eigenvalue-problem gelöst werden (in 
floating-point-arithmetik). Habt ihr da schonmal was von gehört, obs da 
was für gibt?

Bzw. denkt ihr, dass das der 1280 überhaupt schaffen könnte? Falls es 
gar nichts gibt, könnte ich höchstens noch versuchen, normale PC-Libs zu 
portieren, aber ob die dann dort auch funktionieren, bezweifle ich...

Liebe Grüße, Max
von Achim M. (minifloat)


Lesenswert?

etMax schrieb:
> 10x10-generalized-eigenvalue-problem
Du brauchst dazu sowas wie einen Matrixcompiler. Gaußsches 
Eliminationsverfahen wäre doch ein Weg?
mfg mf
von Karl H. (kbuchegg)


Lesenswert?

mit dem GCC?

besorg dir dann auch gleich noch ein Floating Point Packet mit echten 
double dazu. Mit 4 Byte float wirst du mit den Rechenergebnissen nicht 
glücklich werden.
von etMax (Gast)


Lesenswert?

@Mini float:
ich habe noch nie von einem matrix-compiler gehört, auch google spuckt 
da nichts interessantes aus...
Ich dachte auch evtl. an eine bereits fertige Lib, da eine eigene 
Implementierung sicherlich a) langsamer und b) ungenauer c) aufwändiger 
sein würde, als etwas fertiges.

@Karl-Heinz:
meinst du dazu sowas wie SoftFloat 
(http://www.jhauser.us/arithmetic/SoftFloat.html) ?


Gruß, Max
von Peter D. (peda)


Lesenswert?

etMax schrieb:
> Es müsste ein 10x10-generalized-eigenvalue-problem gelöst werden

Ich hab ein bischen gegoogled, was das bedeuten könnte, aber nur Bahnhof 
verstanden.
Ich kann mir ehrlich gesagt überhaupt nichts darunter vorstellen.
Wofür kann man das denn praktisch auf einem Microcontroller einsetzen?


etMax schrieb:
> Bzw. denkt ihr, dass das der 1280 überhaupt schaffen könnte?

Dazu mußt Du diese Black-Box aufdröseln, also in einen konkreten 
Algorithmus umsetzen.
Und dann abschätzen, welche und wie viele Rechenoperationen man dafür 
benötigt und wieviele Variablen.
Wie schnell muß denn eine solche Berechnung ausgeführt werden?


Peter
von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

etMax schrieb:
> Es müsste ein 10x10-generalized-eigenvalue-problem gelöst werden (in
> floating-point-arithmetik). Habt ihr da schonmal was von gehört, obs da
> was für gibt?
>
> Bzw. denkt ihr, dass das der 1280 überhaupt schaffen könnte?

hast du noch restraints bzgl. timing? Ich nehme doch an, du brauchst die 
Daten auch innerhalb eines gewissen Zeitfensters, oder?
von Achim M. (minifloat)


Lesenswert?

Peter Dannegger schrieb:
> Ich hab ein bischen gegoogled, was das bedeuten könnte, aber nur Bahnhof
> verstanden.
Mit den Eigenwerten einer Matrix kommt man auf die Eigenvektoren einer 
Matrix.
*Mathematik für Ingenieure II ausgrab, staubwisch, hust, röchel*

sei A die Matrix, Xi ein Eigenvektor dieser Matrix, Li ein 
Eigenwert(ist ein Skalar also eine Zahl), E die Einheitsmatrix, i ist 
eine natürliche Zahl um die Eigenvektoren und Eigenwerte zu 
beziffern/zählen(mehr dazu später).

Es gilt die Charakteristische Gleichung: A * Xi = Li * Xi

Kochrezept zum Finden von Eigenwerten/-Vektoren:
1.Bestimmungsgleichung: det(A - Li * E) = 0
Es gibt nun hoffentlich eine wenn nicht mehrere Lösungen für Li.

2.Die Setzt man in die Charakteristische Gleichung ein und erhält 
generalisierte Ausdrücke, die die Xi bestimmen lassen.

3.Linear voneinander abhängige Koeffizienten(jeweils einem vielfachen 
voneinander entsprechend + evtl. ein "Offset") in Xi kann man 
zusammenfassen und durch Skalare Koeffizienten a,b,c ausdrücken.

IMHO gibt es so viele Eigenvektoren einer Matrix, wie ihr Rang 
ist(stimmt das??).
Mathe II wieder eingrab

etMax schrieb:
> ich habe noch nie von einem matrix-compiler gehört
Ja äh, ich meinte damit, dass du einen Algorithmus implementieren musst, 
der durch inkrementelles Vorgehen deine Lösung(en) findet. Dazu eignet 
sich z.B. das Gaußsche Eliminationsverfahren. Ich frage mich aber 
gerade, ob das auch funktioniert, wenn zwei "Zeilen" linear voneinander 
abhängig sind.
mfg mf
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

etMax schrieb:

> Es müsste ein 10x10-generalized-eigenvalue-problem gelöst werden (in
> floating-point-arithmetik). Habt ihr da schonmal was von gehört, obs da
> was für gibt?

Was heisst "generatized"?
Ist die Matrix noch nichtmal symmetrisch/positiv definit?


Mini Float schrieb:
> etMax schrieb:
>> ich habe noch nie von einem matrix-compiler gehört
> Ja äh, ich meinte damit, dass du einen Algorithmus implementieren musst,
> der durch inkrementelles Vorgehen deine Lösung(en) findet. Dazu eignet
> sich z.B. das Gaußsche Eliminationsverfahren.

Nein. Das ist absolut ungeeignet wegen schlechter Konditionierung.

> Ich frage mich aber gerade, ob das auch funktioniert,
> wenn zwei "Zeilen" linear voneinander abhängig sind.

Auch dann gibt es Eigenwerte und Eigenvektoren.
von Achim M. (minifloat)


Lesenswert?

Johann L. schrieb:
> Mini Float schrieb:
>> etMax schrieb:
>>> ich habe noch nie von einem matrix-compiler gehört
>> Ja äh, ich meinte damit, dass du einen Algorithmus implementieren musst,
>> der durch inkrementelles Vorgehen deine Lösung(en) findet. Dazu eignet
>> sich z.B. das Gaußsche Eliminationsverfahren.
>
> Nein. Das ist absolut ungeeignet wegen schlechter Konditionierung.
Das is mal n Argument!
Dann mach nen besseren Vorschlag, das interessiert mich jetzt nämlich 
auch(trotz eines -sich mir noch nicht ganz erschließenden- 
Anwendungsbereiches).
mfg mf
von Schwingi (Gast)


Lesenswert?

Für meine Diplom-Arbeit habe ich mal ein Ersatzschaltbild aus 700 
Kondensatoren durchgerechnet. Das habe ich mit Gauß-Verfahren und 
Pivotisierung gemacht. In meiner Not hatte ich das in aller Eile 
übrigens mit BASIC in einen ZX Spectrum Homecomputer gehackt. Ich weiß 
noch, daß das Teil die ganze Nacht durchgerechnet hat...
von Achim M. (minifloat)


Lesenswert?

Schwingi schrieb:
> ein Ersatzschaltbild aus 700 Kondensatoren

würde ich nicht in einen Atmega quetschen wollen.
Vielleicht erfahren wir ja auch irgendwann, dass der TO eine ganz andere 
Lösung gefunden oder sein Problem auf ein anderes zurückgeführt hat.

Diese beiden Zitate gehören einfach zusammen:

Thomas Klima schrieb:
> restraints bzgl. timing

Schwingi schrieb:
> Ich weiß noch, daß das Teil die ganze Nacht durchgerechnet hat

:D mfg mf
von Thomas B. (detritus)


Lesenswert?

Schwingi schrieb:
> Für meine Diplom-Arbeit habe ich mal ein Ersatzschaltbild aus 700
> Kondensatoren durchgerechnet.


Uh, Details bitte ;-)
von uii (Gast)


Lesenswert?

Naturlich kann man fuer eine 10x10 Matrix die Eigenwerte rechnen. Ich 
erinnere mich an einen iterativen Algorithmus.  Der Speicherbedarf ist 
100 Plaetze zu 8 byte fuer double. Das hat Platz im 1280er. Mein 
Compiler kann zB kein double. Aber machbar sollte es trotzdem sein. 
Allenfalls als Fixedkomma. Dann muss man nur noch zuruecklehnen und 
warten bis der Algorithmus konvergiert.
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mini Float schrieb:
> Johann L. schrieb:
>> Mini Float schrieb:
>>> etMax schrieb:
>>>> ich habe noch nie von einem matrix-compiler gehört
>>> Ja äh, ich meinte damit, dass du einen Algorithmus implementieren musst,
>>> der durch inkrementelles Vorgehen deine Lösung(en) findet. Dazu eignet
>>> sich z.B. das Gaußsche Eliminationsverfahren.
>>
>> Nein. Das ist absolut ungeeignet wegen schlechter Konditionierung.
> Das is mal n Argument!
> Dann mach nen besseren Vorschlag,

Für solch kleine Matrizen etwa QR-Algorithmus.

Oder man suche zB nach Eigenwertproblem oder Säkulargleichung
von Achim M. (minifloat)


Lesenswert?

Danke! Gute Nacht, mf
von etMax (Gast)


Lesenswert?

Danke für eure Antworten!

also nochmal zum Problem genau:

geg. ist die Matrix A (10x10, nicht-singulär, symmetrisch) und C 
(singulär, symmetrisch). Zu lösen ist das folgende Gleichungssystem:

A*x=l*C*x, dabei sind x die zu bestimmenden Eigenvektoren und l die dazu 
passenden Eigenwerte.  Das ist das generalisierte Eigenwertproblem. Es 
gibt 10x und 10passende l, wovon einige "Inf" sind. Es ist also leider 
nicht einfach Ax=lx zu lösen.
Man könnte A invertieren (allerdings ist diese Matrix fast singulär -> 
instabile Invertierung) und es umformen zu x/l=A^-1*C*x, was ein 
normales Eigenwertproblem ist, aber A^-1*C ist nicht mehr symmetrisch, 
was auch nicht mehr gut ist.


Die Berechnung darf/sollte nicht länger als 20ms dauern. Es geht um die 
Online-Kalibrierung eines Magnetometers und wenn die Berechnung zu lange 
dauert, können andere wichtige Codeteile nicht oft genug ausgeführt 
werden.

Prinzipiell geht es mir aber vorrangig um die Möglichkeit, das überhaupt 
auf einem Atmaga machen zu lassen, da ich gelesen habe, dass die 
algoritmische Umsetzung davon alles andere als simpel ist. Ich suchte 
also eigentlich nach Bibliotheken dafür :)
von cskulkw (Gast)


Lesenswert?

etMax schrieb:
> Die Berechnung darf/sollte nicht länger als 20ms dauern.

20ms mit dem 1280 -> Vergiß es! Die Berechnung könnte er schaffen, 
codetechnisch. Aber der Rechenknecht wäre hauptsächlich mit kopieren 
beschäftig.

etMax schrieb:
> geg. ist die Matrix A (10x10, nicht-singulär, symmetrisch) und C

Also, für diesen Anspruch würde ich Dir einen Mikrocontroler mit FPU 
mindestens jedoch ein  32-Bitter. dringend empfehlen.
TC 1796 / 1762 etc. oder Freescale MP5556 oder diverse. Es gibt da 
bestimmt auch was von ARM (Cortex)
Wenn Du abenteuerlustig bist, bestände mit AT32UC3C0512 ein AVR32 zur 
Verfügung der eine hardware Fließkomma-Einheit hat. Die wird jedoch mit 
dem GNU aus C nicht unterstützt (Kenntnisstand 03/2011).

Übrigens nur mal so interessehalber, wie willst Du den die Berechnung 
programmieren? Prozedural in C ? Das wäre sehr fehleranfällig und 
erfordert ein Höchstmass an Disziplin.

Schon über automatische Codegenerierung mit Matlab oder SciLab 
nachgedacht?

Nur so als Tip.
von Detlef _. (detlef_a)


Lesenswert?

Eigenwerte lassen sich mit diesem

http://en.wikipedia.org/wiki/Jacobi_eigenvalue_algorithm

Algorithmus berechnen. Der benötigt für einen 'sweep' O(n^3) 
Multiplikationen, also in Deinem Fall etliche Tausend.

Außerdem muß Du das Problem vorher degeneralisieren ( 'Numerical recipes 
in C'), kostet auch nochmal. Um das in 20ms zu schaffen brauchst Du nen 
mittelfetten DSP, mit nem uC gehts vielleicht in nem Stündchen.

Interessantes Thema.
Machs mit nem FPGA, das macht dann auch noch richtig Spaß.

Cheers
Detlef
von R. F. (rfr)


Lesenswert?

Hallo,

bei http://www.trumphurst.com/cpplibs/cpplibs.php
findet man das zum Beispiel, aber ob das auf einem Controller läuft?

Villeicht ARM, mit ext. Memory.

Aber Versuch macht kluch...
:-)



Robert
von Karl H. (kbuchegg)


Lesenswert?

> Die Berechnung darf/sollte nicht länger als 20ms dauern.
> Es geht um die Online-Kalibrierung eines Magnetometers und
> wenn die Berechnung zu lange dauert, können andere wichtige
> Codeteile nicht oft genug ausgeführt werden.

Na ja. Das bedeutet ja nicht, dass die Berechnung in Summe nicht länger 
als 20ms dauern darf. Es bedeutet nur, dass du deine Berechnung in 
Happen aufteilen musst, von denen jeder einzelne nicht länger als 20ms 
dauern darf.

Wenn die Kalibrierung 2 Minuten läuft und dabei alle 20ms die Kontrolle 
abgibt, so dass andere lebenswichtige Operationen eine Chance haben, ist 
das sicherlich auch ok.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.