Hallo liebe Leutz!
Ich möchte gerne eine Linearisierung mittels eines Polynoms durchführen
und muss dafür meine ADC-Werte miteinander multiplizieren.
Ich habe ein Polynom 4. Grades und einen 20Bit-ADC.
Meine ADC-Werte können somit maximal 1048575 groß sein.
Bei einem Polynom 4. Grades muss ich folglich (das wird so nicht
vorkommen, aber worst-case) 1048575^4 rechnen.
Ein 64-Bit Integer wird da nicht reichen
keine Ahnung, aber was kann man ernsthaft mit 20 Bit Genauigkeit messen?
Das Hintergrundrauschen, das vom Urknall übrig ist?
Es gibt auch Libs für beliebige Genauigkeit.
Dafür ist aber ein MC eher ungeeignet mangels Rechenleistung.
Hallo
Selbstverständlich geht das! Die Zahlenwerte einfach auf
mehrere Variablen aufsplitten. Muß man ein wenig Gehirnschmalz
reinstecken bei der Multiplikation, aber es geht.
Gruß
Joachim
Peter Dannegger schrieb:> Nimm float, das hat eine Genauigkeit von 23Bit, sollte für nen 20Bit-ADC> ja dicke reichen.
Er will die 20 Bit aber noch mit 4 potentieren!
Mit 80 Bit kommt er also leicht hin :-)
Bei 23 verliert er halt ein paar Stellen.
Inwieiweit die ganze Rechnung Sinn hat, kann man so eh kaum sagen.
Peter Dannegger schrieb:> Nimm float, das hat eine Genauigkeit von 23Bit, sollte für nen 20Bit-ADC> ja dicke reichen.>>> Peter
naja, da geht bei polynomen vierter ordnung ordentlich Präzision
verloren.
dazu kommt ja auch noch der Koeffizient.
was Genauigkeit betrifft kann man ohne das System, das Signal und die
Messmethode zu kennen nix sagen.
Hi,
zeig doch mal dein Polynom her, Ansätze wären eine Normierung deiner
Gleichung z.B. .
Außerdem würde mich mal ernsthaft das Layout deines 20-bit ADC's
interressieren.
Zeig doch mal bitte.
Gruß
Klaus Wachtler schrieb:> Peter Dannegger schrieb:>> Nimm float, das hat eine Genauigkeit von 23Bit, sollte für nen 20Bit-ADC>> ja dicke reichen.>> Er will die 20 Bit aber noch mit 4 potentieren!> Mit 80 Bit kommt er also leicht hin :-)
Spätestens beim Aufaddieren des Polynoms verschwindet die Genauigkeit
wieder :->
OK, also da kommt ja schonmal ziemlich viel Input.
Dann werde ich mal genauer:
Also ich messe einen DMS aus. Dieser hängt am ADC. Den Wandler hab ich
halt hier, daher wollte ich ihn verwenden.
Leider hat der Sensor keine lineare Kennlinie. Mal hat er den Verlauf
eines Polynom 2. Grades, mal 3. - leider nie 100% gleich. (Also ich
möchte meine Schaltung gerne so bauen, dass sie für einen beliebigen
Sensor funktioniert)
Nun hatte ich eine Messzelle mit dem Verlauf eines 2. Grades. Da hebe
ich eine Berechnung mit der Lagrange-Interpolation vorgenommen. Das
Ergebnis konnte sich gut sehen lassen.
Bei einer Zelle mit dem Verlauf eines Polynoms 3. Grades war das
natürlich wieder Mist! Also wollte ich die Polynome erhöhen, um weitere
Wendepunkte erreichen zu können.
Aber damit steigt auch der Berechnungsaufwand...und der ADC liefert mir
Werte, die auch negativ sein können (Sign-Bit).
Daher hatte ich gedacht, mit großen Integern könnte ich das rechnen -
evtl. mit Hardware-Multiplier.
Vlad Tepesch schrieb:> naja, da geht bei polynomen vierter ordnung ordentlich Präzision> verloren.
Da geht nichts verloren, das Einganssignal ist nur max 20Bit, da kann
man nicht mehr hinzu zaubern.
Bei nem Polinom gewinnen die höchsten 23Bit.
Natürlich geht je nach Steilheit die reale Auflösung in den Keller.
Es kann z.B. sein, daß die 23Bit in einem Teilbereich nur 8Bit des ADC
abbilden (1LSB des ADC bewirkt einen Sprung um 15Bit des Ergebnisses).
Peter
Jean Player schrieb:> Außerdem würde mich mal ernsthaft das Layout deines 20-bit ADC's> interressieren.
Mein Layout sitzt noch auf einem Steckbrett - soweit bin ich noch
garnicht.
Wie gesagt, der ADC ist vorhanden - ich wollte ihn daher verwenden.
Das war meine Berechnung für 2. Grad:
(Nur mal zum Angucken, wenn man das Lagrange-Verfahren kennt, dann sieht
man evtl was passiert...wenn nicht auch egal)
Das funktionierte jedenfalls recht gut!
1
int64_tadc_0_value=0;// Werte werden vom ADC eingelesen
Naja sagt jetzt wahrscheinlich nicht viel aus. Die Herleitung hatte ich
vorher auf dem Papier gemacht.
Jedenfalls wurde diese Berechnung nur einmal gemacht und danach waren
die Koeffizienten vorhanden. Diese wurden dann verrechnet.
Hallo,
@Vlad
Natürlich löst das auch numerische Probleme.
"Üblicherweise" sind die Konstanten vor großen Potenzen recht klein, es
macht also Sinn nach Größe aufsteigend zu addieren und so möglichst
wenig an Genauigkeit zu verlieren.
Ein Test mit single/float unter Benutzung des Hornerschemas sollte auch
auf einem PC möglich sein.
Eine Millionen Werte spuckt er in Sekundenbruchteilen aus.
Dann kann man ja zum Vergleich double oder extended rechnen.
Frank schrieb:> Oder wie sollte ich die Linearisierung sonst lösen?>> Wie macht ihr das?
Indem man nicht mit aberwitzig hohen Bitzahlen rechnet, die Genauigkeit
vortäuschen die man sowieso nicht hat.
Wenn ich mit einem Balkonthermometer messe und damit rumrechne und als
Ergebnis wirft mir der Taschenrechner eine Temperatur mit 8
Nachkommastellen aus, dann ist es nicht sinnvoll diese 8
Nachkommastellen auch anzuschreiben, weil ich die mit dem
Balkonthermometer schon gar nicht messen konnte.
Thomas Klima schrieb:> Tabelle oder halt stückweise Linear wird wohl zu ungenau, oder?
Das Problem ist, dass ich nicht jedesmal tausend Punkte aufnehmen kann,
sondern ein Polynom den Verlauf möglichst genau beschreiben sollte...
Frank schrieb:> Thomas Klima schrieb:>> Tabelle oder halt stückweise Linear wird wohl zu ungenau, oder?>> Das Problem ist, dass ich nicht jedesmal tausend Punkte aufnehmen kann,> sondern ein Polynom den Verlauf möglichst genau beschreiben sollte...
Komm endlich zurück in die Realität!
Wenn du 4 Stützpunkte für ein Polynom 3. Grades aufnimmst, dann ist
dieses Polynom eine Annäherung an die tatsächliche Umrechnungskurve!
Auch die stimmt nicht mit der realen, physikalischen überein. Und
genauso wie man einen Kreis für praktische Zwecke mit einem zb 96-Eck
annähern kann, genauso kann man derartige Umrechnungsfunktionen mit 5
oder 10 oder 15 linearen Abschnitten aproximieren.
Von deinen 20 Bit vom ADC sind doch die letzten 5 oder 6 Bit sowieso
gelogen, wenn du nicht einen extrem guten elektronischen Aufbau gemacht
hast! Du bist wohl auch von der Generation, die möglichst viele
Nachkommastellen im Ergebnis haben wollen, weil sie der Taschenrechner
ausspuckt. Ob diese Nachkommastellen irgendwas mit der Realität zu tun
haben, interessiert keinen. Hauptsache hinschreiben.
Karl heinz Buchegger schrieb:> Du bist wohl auch von der Generation, die möglichst viele> Nachkommastellen im Ergebnis haben wollen, weil sie der Taschenrechner> ausspuckt.
Nein, ich schrieb doch, ich habe den ADC hier, daher möchte ich den
verwenden.
Und darüber hinaus sagte ich, dass ich ja nur eine Beschreibung des
Verlaus mittels eines Polynoms machen möchte. Und nicht hunderte
Stützstellen aufnehmen...
Mir ist klar, dass das ganze evtl. etwas oversized ist. Aber der liegt
hier rum und eh ich mir jetzt noch einen anderen kaufe. Die 10Bit in dem
uC sind mir ein bisschen wenig.
@ Karl heinz Buchegger (kbuchegg) (Moderator)
>Von deinen 20 Bit vom ADC sind doch die letzten 5 oder 6 Bit sowieso>gelogen, wenn du nicht einen extrem guten elektronischen Aufbau gemacht>hast!
Na auf seinem Steckbrett beleiben wirklich nur 12 Bit vom 20 Bit ADC,
sonst vielleicht 14-16 Bit.
Das Problem ist halt auch hier der Unterschied zwischen [[Auflösung und
Genauigkeit]].
> Du bist wohl auch von der Generation, die möglichst viele>Nachkommastellen im Ergebnis haben wollen, weil sie der Taschenrechner>ausspuckt.
Das war bei uns schon vor 20 Jahren so, als wir mit dem Taschenrechner
in der Schule anfingen. Heute ist das Problem wahrscheinlich noch
stärker, weil kein Mensch mehr Kopfrechnen kann und will, geschweige
denn gesunden Menschenverstand walten lässt. 8-0
Blindes Tastendrücken und Technikgläubigkeit.
> Ob diese Nachkommastellen irgendwas mit der Realität zu tun> haben, interessiert keinen. Hauptsache hinschreiben.
Das gab aber bei uns damals Anschiss und Punktabzug vom Physiklehrer!
MfG
Falk
Frank schrieb:> Nein, ich schrieb doch, ich habe den ADC hier, daher möchte ich den> verwenden.
Kannst du doch.
Lass einfach die unteren Stellen weg, die sind eh gelogen.
Vielleicht sollte man mal drüber nachdenken, was der ADC-Wert überhaupt
darstellt.
Wenn dahinter ein phys. Wert steckt, dann bedeutet das MSB etwas und das
LSB eben den 2^19ten Bruchteil. Im Quadrat bedeutet das LSB eben noch
den 2^38ten Bruchteil usw.
Mit der richtigen Fixpunktdarstellung müsste eine 64Bit Verarbeitung
ausreichen, wenn man ein 32Bit Ergebnis will.
Gruß
Frank schrieb:> Nein, ich schrieb doch, ich habe den ADC hier, daher möchte ich den> verwenden.
Wenn du ein Messgerät hast, dass dir einen Messwert im Bereich 0 bis
1000000 ausgibt, und du weißt, dass schon die Tausenderstelle aufgrund
physikalischer Zusamennhänge nur noch Rauschen ist, dann dividier halt
den Messwert vom Sensor durch 1000.
Deine weiterzuverarbeitenden (sinnvollen) Messwerte sind dann im Bereich
0 bis 1000. Und damit hast du dann kleinere Zahlen und musst nicht an
allen Ecken und Enden auf Overflows während der Berechnung achten.
Genauso bei dir:
Von den 20 Bit werden vielleicht 15 sinnvoll sein. Also verschieb den
ADC Wert um 5 Bitpositionen nach rechts. Die Bits die du dadurch
verlierst waren sowieso nur vom Rauschen beeinflusst und haben mit einem
realen Messwert nicht viel zu tun.
Aber: Anstelle von 20 Bit hast du nur noch 15 Bit und damit hast du nach
oben hin ein wenig Luft gewonnen um Overflows zu vermeiden.
Was auch immer sehr erhellend ist: Untersuch doch mal, wie sich dein
Ergebnis verändert, wenn du von tatsächlichen 20 Bit ausgehst und
einfach mal einen gedachten (erfundenen) Messwert durchrechnest. Dann
veränderst du den angenommenen Messwert um +- 1LSB (also das unterste
Bit mal verändern), erneut durchrechnen und mit dem Wert zuvor
vergleichen. Oftmals stellt sich dann heraus, dass du damit mit dem DMS
Längenänderungen in der Größenordnung (ich übertreibe jetzt absichtlich)
eines Atomdurchmessers ausgerechnet hast. Ist dein zu messender
Gegenstand tatsächlich so genau gefertigt? Ist es für einen Kranfahrer
tatsächlich notwendig, die Länge das abgelassenen Kabels auf den
Atomdurchmesser genau zu kennen oder ist nicht die thermmische
Ausdehnung des Kranes nach oben durch die Sonneneinstrahlung schon um
einige Zehnerpotenzen größer als das was du da gemessen hast?
Genau darauf will ich hinaus (und andere mit mir): Ein Rechenergebnis
mit 1000-tausend Stellen auszurechnen und irgendwo hinzuschreiben ist
eine Sache. Aber das repräsentiert ja auch etwas! Man muss immer
überlegen:
Kann ich überhaupt so genau messen? Ist das was ich als Ergebnis
hinschreibe überhaupt sinnvoll?
Es ist zb nicht sinnvoll, die Distanz auf der Autobahn von München nach
Berlin auf den Millimeter genau anzugeben. Erstens braucht kein Mensch
eine derartige Auflösung, zweitens ist es gar nicht möglich diese
Distanz in dieser Genauigkeit anzugeben. Fahr ich eine Kurve auf der
Überholspur anstatt auf der normalen Spur, ist die Differenz im Weg
schon um einiges größer als dieser Millimeter.
Hin schreiben kann ich die Distanz natürlich in Millimeter. Aber es ist
nicht sinnvoll das zu tun schon alleine deswegen weil ich das gar nicht
messen kann, selbst wenn mein Tageskilometerzähler auf µm auflösen
würde.
Mit den wenigen Stützstellen die du da planst wird das eh eine recht
grobe Näherung. Da macht es doch keinen Sinn, diese Näherung mit
aberwitziger Genauigkeit zu rechnen?
Vielleicht solltest du lieber mehr Stützstellen nehmen und die
Annäherung dann nicht in einem Zug mit einem Polynom versuchen, sondern
abschnittsweise mit sowas wie bikubischen Splines?
Jörg
Mit nur 3 Meßwerten werden Deine Koeffizienten eh nicht sonderlich
genau.
Man kann unendlich viele Kurven durch 3 Punkte legen.
Vergiß das 64Bit-Geraffel, ist beim AVR-GCC noch deutlich aufwendiger
als float.
Mach mal die Berechnung auf dem MC mit 32Bit float und dann mal auf dem
PC mit 80Bit long double.
Der Unterschied wird kleiner sein, als ein LSB des ADC. Und damit ist es
Unsinn, sich noch mehr Genauigkeit vorlügen zu wollen.
Peter
@ Jörg H. (idc-dragon)
>Mit den wenigen Stützstellen die du da planst wird das eh eine recht>grobe Näherung. Da macht es doch keinen Sinn, diese Näherung mit>aberwitziger Genauigkeit zu rechnen?
Richtig. Das liegt wohl daran, dass da jemend in den Grundlagen der
Messtechnik nicht aufgepasst hat.
So ein Polynom 4. Ordung bei der angestrebten GENAUIGKEIT kann man nur
dann sinnvoll berechnen, wenn man sehr viele Stützstellen hat, ich sag
mal Pi mal Daumen 100, gleich mässig über die Kennlinie verteilt. Daraus
rechnet man über die Methode der kleinsten Fehlerquadrate die
Koeffizienten für das Polynom aus. Dann hat man eine Chance, dass die
korrigierten Messwerte was mit der Realität zu tun haben.
Denn laut OP
"Leider hat der Sensor keine lineare Kennlinie. Mal hat er den Verlauf
eines Polynom 2. Grades, mal 3. - leider nie 100% gleich."
kann man nicht vorhersagen, wo die "Knicke" der Polynoms in etwa liegen,
darum muss man viele Stützstellen ausmessen.
Aber das Ganze erinnert so ein wenig an die PT100 Linearisierung. Dort
rechnet man meist mit einem Polynom 2. Grades und gut. Fetischisten
nehmen eins 4. Grades.
http://de.wikipedia.org/wiki/Pt100#Widerstandskennlinien
Man beachte die Koeffizienten ;-)
MFG
Falk
Irgendwann muss man den Kraftsensor ja auch kalibrieren. Dann kann man
also eine Tonne draufstellen, und das Gewicht muss dann auf das Gramm
genau bekannt sein um 20 bit zu haben. Der Standardansatz ist zu schauen
wie genau das Ganze denn ist, und von da die Anforderung zurueck zu
rechnen
Falk Brunner schrieb:> Aber das Ganze erinnert so ein wenig an die PT100 Linearisierung. Dort> rechnet man meist mit einem Polynom 2. Grades und gut. Fetischisten> nehmen eins 4. Grades.
Erinnert mich an die Fetischisten mit den
Outdoor-Aldi-Thermometeranlagen.
"Heute füh hatte es 18 Komma 2 Grad"
"Was, schon so kalt? 18 Grad"
"Nicht 18. 18 Komma 2!"
Als ob diese 0.2 Grad irgendetwas mit der Realität zu tun hätten.
Oder Politiker. Da werden 100 Personen befragt und hochgerechnet. "24.8
Prozent sind dagegen" - "Aha, also run 25 .. " "Nicht 25! 24 Komma 8"
(Wenn nur einer der Befragten anders geantwortet hätte, wäre das
Ergebnis nicht 24.8 sonder 27.3, aber Hauptsache wir geben Kommastellen
an und reiten auch noch auf denen rum. Das gibt so einen
wissenschftlichen Anstrich :-)
Zwischen den 5 Stützstellen 4 Lineare Funktionen defineiren.
wenns genauer sein soll, dann nen Spline durchlegen ( oder was der
gleichen siehe Numerik Vorlesung )
Das ganze ding dann als Polynom zu rechnen mit X^5, .... bzw danach
aufzulösen ist irgendwie am ziehl vorbei.
Deine Stützstellen haben Messfehler. (frage wie gross)
Deine Messungen hinterher haben Messfehler.
Selbst die von dir bstimmte Funktion ist nur eine annäherung an die
echte Kennlinie deines Sensors. Frage wie genau bist du an der echten
Kennlinie drann? Wie genau muss das ergebniss sein?
bei den Stütztellen. ggf ist es von Vorteil, die Stützstellen, abhängig
vom Verlauf der kennlinie zu wählen. 3 Stützstellen in einem Linearen
Teil machen keinen sinn, die könnte wo anders ggf mehr sinn bringen.
gruss
Karl heinz Buchegger schrieb:> Oder Politiker. Da werden 100 Personen befragt und hochgerechnet. "24.8> Prozent sind dagegen" - "Aha, also run 25 .. " "Nicht 25! 24 Komma 8"> (Wenn nur einer der Befragten anders geantwortet hätte, wäre das> Ergebnis nicht 24.8 sonder 27.3, aber Hauptsache wir geben Kommastellen> an und reiten auch noch auf denen rum. Das gibt so einen> wissenschftlichen Anstrich :-)
Politiker und Mathematik: 2 Welten prallen aufeinander :-)
OK, also dann guck ich mir mal diese Spline-Interpolation an.
Also mein Ziel ist wie gesagt - 5 Werte aufnehmen und daraus "möglichst"
genau den Verlauf der Zelle abbilden.
Welchen Ansatz würdet ihr mir denn empfehlen? Zumindest ein
quadratischer Spline? Oder gar nur den Streckenzug?
Karl heinz Buchegger schrieb:> Erinnert mich an die Fetischisten mit den> Outdoor-Aldi-Thermometeranlagen.
Andererseits kann es durchaus Sinn ergeben, eine Temperatur in 1/10 Grad
zu erfassen, obwohl der Sensor nur 0,5 Grad absolute Genauigkeit
hergibt. Denn nur so wird eine Entwicklung der Temperatur sichtbar.
Stellt man eine Aussentemperatur nur in ganzen Graden dar, dann sieht
man in der Grafik nur Klötzchen.
Solange also die hinteren Stellen zwar absolut gesehen ungenau sind,
aber relativ zueinander noch Sinn ergeben, solange kann es u.U. sinnvoll
sein, sie zu erfassen.
A. K. schrieb:> Andererseits kann es durchaus Sinn ergeben, eine Temperatur in 1/10 Grad> zu erfassen, obwohl der Sensor nur 0,5 Grad absolute Genauigkeit> hergibt. Denn nur so wird eine Entwicklung der Temperatur sichtbar.
Geb ich dir prinzipiell recht.
Ich bezweifle aber, dass die Hobby Meterologen das ganze so machen, wie
es gemacht gehört: Die Thermometer in eine weiße Hütte, die rundherum
mit Lamellen einen ungehinderten Luftzug ermöglichen und trotzdem die
Sonneneinstrahlung möglichst fernhalten.
Was die messen ist mehr als nur manchmal einfach nur das Vorbeiziehen
von Wolken an der Sonne oder das die Sonne günstig steht, so dass ein
Anteil von Wärmestrahlung über Reflexion das Thermometer zusätzlich
erreicht oder die Wärmestrahlung die durch die Fenster nach aussen aufs
Thermometer gelangen oder ....
Frank schrieb:> Schonmal direkt ne Frage:>> Wieso heißt es in dem Artikel von Wiki
welcher Artikel?
> "Der kubische C²-Spline">> Warum ist das Quadrat ein KUBISCHER Spline?
Das hat mit Quadrat wahrscheinlich nichts zu tun.
Es geht darum, wie 2 Splines aneinandergepappt werden können.
Bei Continuity 0 teilen sich die beiden Splines einen gemeinsamen
Endpunkt
Bei Continuity 1 wie Cont. 0, zusätzlich ist auch die Steigung der
Tangenten am Übergangspunkt gleich. d.h. die
komplette Kurve hat an diesem Punkt keinen Knick
Bei Coninutity 2 wie Cont. 1, zusätzlich ist auch noch die 2.
Ableitung am Übergangspunkt gleich. d.h. die
Splines haben an diesem Punkt nicht nur gleiche
Tangentenrichtung, sondern auch der "Radius" ist
identisch. Das heisst praktisch, dass sich hier die
Krümmung der Kurve nicht sprungartig verändert.
Die unterschiedlichen Continuity Modi regeln, wie glatt und fliessend
der Übergang von einem Spline zum nächsten aussieht.
Frank schrieb:> Ach das ist wegen zweimal differenzierbar...?
fast.
bis zu welchem Grad stimmen die Ableitungen am Berührungspunkt überein.
Als zb Polynom 3. Grades ist ein einzelner kubischer Spline sowieso
immer 2 mal differenzierbar.
So, also ich melde mich nochmal zurück.
Ich habe mir jetzt mal die Kubischen Splines angeguckt und soweit auch
verstanden. Rechenbeispiele mit Zahlen funktionieren.
Jetzt will ich ja aber das ganze im Mikrocontroller erledigen, also der
soll selber die Koefizienten berechnen. Jetzt habe ich es mal mit 3
Stützpunkten aufgestellt.
Da stehe ich jetzt wieder auf dem Schlauch. Wie löse ich denn ein LGS im
Mikrocontroller?
Ich habe dann später Wertepaare welche folgendermaßen aussehen:
1
x|ADC-Wert0%|ADC-Wert50%|ADC-Wert100%
2
------------------------------------------------
3
y|Druck0%|Druck50%|Druck100%
Die ADC-Werte werden ja erst zur Laufzeit durch Aufnahme von Messpunkten
erstellt, sind also noch unbekannt.
Ich bekomme damit 6 Gleichungen für die 6 unbekannten Koeffizienten.
Frank schrieb:> Naja ich bräuchte halt eine Formel, bzw. müsste mir einen Alghoritmus> erstellen, welcher mit den dann vorhanden Zahlen diese Berechnungen> ausführt.
Na, ja.
Wie machst du es denn mit der Hand auf dem Papier?
(Gauss Jordan Elimination zur Lösung von linearen Gleichungssystemen ist
schon erfunden. Mal danach Googeln)
Horst Hahn schrieb:> Irgendwie alles sehr ähnlich auch 20 Bit:
Kann sein, wir sind eine FH. Da kommen schonmal ähnliche Aufgaben vor.
Aber den anderen Thread kannte ich noch garnicht. Werde ich auch mal
durchgucken.
Die arndt-bruenner-Seite habe ich auch schon gefunden, aber steig da
nicht so ganz durch. Muss ich nach dem Schema garkein LGS lösen?
Frank schrieb:> Die arndt-bruenner-Seite habe ich auch schon gefunden, aber steig da> nicht so ganz durch. Muss ich nach dem Schema garkein LGS lösen?
Doch. Natürlich.
Ganz unten auf der Seite ist die Koeffizientenmatrix des
Gleichungssystems angegeben. Und das muss man lösen.
Der letzte Satz der Abhandlung beginnt nicht umsonst mit
*Die Lösungen ...*
[quote]
Die Lösungen rückwärts in (V) und (III) eingesetzt, ergeben sich die
Koeffizienten ci und ai.
[/quote]
Mal im Ernst: ihr studiert an einer FH und schafft es nicht, mit
Büchern und Internet zu überlegen, wie man ein LGS löst?
Was studiert ihr? Germanistik, BWL?
Oder seid ihr nur zu faul und lasst euch lieber alles vorkauen?
Klaus Wachtler schrieb:> ihr studiert an einer FH und schafft es nicht, mit> Büchern und Internet zu überlegen, wie man ein LGS löst?
Doch klar, auf dem Papier kein Problem, nur tue ich mich etwas schwer,
dass in einem Mikrocontroller umzusetzen.
Stellt halt gleich die ganze Aufgabenstellung hier rein und
holt die fertige Lösung ab, das macht weniger Aufwand als
stückchenweise arbeiten zu lassen.
Frank schrieb:> Doch klar, auf dem Papier kein Problem, nur tue ich mich etwas schwer,> dass in einem Mikrocontroller umzusetzen.
Was hat das mit einem MC zu tun?
Auf dem PC kannst du es besser?
Klaus Wachtler schrieb:> Mal im Ernst: ihr studiert an einer FH und schafft es nicht, mit> Büchern und Internet zu überlegen, wie man ein LGS löst?
Ich gestehe: Als ich auf die Uni kam, konnte ich das auch nicht (mehr)
in der allgemeinen Form. Spezielle Gleichungssysteme: ja. Aber
allgemeines Verfahren bzw. Abstraktion auf einen Algorithmus: nein
(Genau das kreide ich unserem Schulsystem an: In den Schulen wird viel
zu viel vermittelt, dafür sitzen aber die Grundlagen nicht mehr richtig.
Meiner Meinung nach sollte man in jedem Schuljahr (Semester?) in
Mathematik das ersten Monat dafür reservieren um bereits gelehrte
Grundlagen die längst vergessen wurden, wieder aufzufrischen.
Dazu gehören:
* Kopfrechnen bzw. Ergebnisse in den richtigen Größenbereich schätzen
* Dreisatz
* eng damit verwandt Prozentrechnen
* Sinus/Cosinus im rechtwinkeligen Dreieck, Phythagoras
* Lösen von linearen Gleichungen
* eventuell Quadratische Gleichungen
vielleicht noch 1 oder 2 weitere Themen, aber nicht mehr.
Nach dem Muster "steter Tropfen hölt den Stein" wird dann über die Jahre
das meiste davon hängen bleiben. Wenn man diese Themenbereiche im Schlaf
beherrscht hat man meiner Meinung nach einen guten Grundstock mit dem
man den meisten Alltagsprobleme unbesorgt gegenüber treten kann ohne
gleich als kompletter Vollidiot dazustehen.
)
Karl heinz Buchegger schrieb im Beitrag #1875802:
> Meiner Meinung nach sollte man in jedem Schuljahr (Semester?) in> Mathematik das ersten Monat dafür reservieren um bereits gelehrte> Grundlagen die längst vergessen wurden, wieder aufzufrischen.
Hm, weiß nicht.
Zumindest ab dem Studium erwarte ich schon von Leuten, daß sie
ihre Lücken erkennen und es sich halt mal selbst anschauen.
Wenn es dann in einer Vorlesung wegen alter Grundlagen hakt, kann
man sich auch selber hinsetzen.
Alles zwangsweise regelmäßig zu wiederholen fördert vielleicht
doch etwas zu sehr die Anspruchshaltung (das kann ich nicht wissen,
weil es schon so lange her ist).
Bei der regulären Arbeit legt mir auch keiner jeden Morgen
die Formelsammlung hin.
Klaus Wachtler schrieb:> Karl heinz Buchegger schrieb im Beitrag #1875802:>> Meiner Meinung nach sollte man in jedem Schuljahr (Semester?) in>> Mathematik das ersten Monat dafür reservieren um bereits gelehrte>> Grundlagen die längst vergessen wurden, wieder aufzufrischen.>> Hm, weiß nicht.> Zumindest ab dem Studium
OK. Hab ich nicht geschrieben, aber gemeint war: In jedem Schuljahr,
beginnend mit der 5. Klasse
Wenn ich Leute auf der Strasse höre:
"Wie, 23 Prozent von 100? Tut mir leid, ich war in Mathe immer schwach"
dann dreht sich mir der Magen um. Das muss nicht sein, wenn man das
lehrplanmässig berücksichtigt, dass vieles vergessen wird, wenn man es
nicht mehr macht.
> erwarte ich schon von Leuten, daß sie> ihre Lücken erkennen und es sich halt mal selbst anschauen.
Ich auch. Ich rede allerdings hier mehr von Frisöse Lieschen Müller und
dem allgemeinen Bildungsniveau und nicht von Studenten im Speziellen.
Bei Studenten ist es selbstverständlich nicht akzeptabel, dass er sich
derartige Grundagen für sich selbst nicht neu erarbeiten kann.
Klaus Wachtler schrieb:> Stellt halt gleich die ganze Aufgabenstellung hier rein und> holt die fertige Lösung ab, das macht weniger Aufwand als> stückchenweise arbeiten zu lassen.
??? Was habe ich denn jetzt für fertige Lösungen gefordert?
Klaus Wachtler schrieb:> Was hat das mit einem MC zu tun?> Auf dem PC kannst du es besser?
Nein, auf einem PC kann ich es auch nicht besser - ist ja dasselbe.
Sorry! OK, habs verstanden...
Ich wollte hier niemandem auf die Nerven gehen und auch keine Lösungen
vorgelegt bekommen. War doch nur ne Frage für nen Denkanstoß. Ich weiß
nicht mehr alles aus der Schule, aber ich habe ja auch garnicht gesagt,
dass mir einer das LGS erklären soll, das kann ich schon. Aber halt auf
dem Papier mit Zahlen (anders lernt man es nie).
Werde mich jetzt selber weiter damit beschäftigen und nur der
Vollständigkeit halber:
> Was studiert ihr?>> [ ] Germanistik> [ ] BWL> [ ] Gartenbau> [x] Wirtschaftsingenieur>> Seid ihr faul?>> [ ] Ja> [x] Nein>> Wolltet ihr nur einen Denkanstoß?>> [x] Ja> [ ] Nein>> Hattet ihr so eine Antwort erwartet?>> [ ] Ja> [x] Nein
Frank schrieb:> War doch nur ne Frage für nen Denkanstoß.
Naja, du hattest etwas in Richtung LGS gefragt (was nun wirklich
elementare Grundlagen für alles ingenieurmäßige außer Gartenbau ist)
und ich hatte einen Link geliefert, in dem die wichtigsten Verfahren
aufgeführt sind mit weiteren Links zu den Verfahren.
Was kommt 7 Minuten später:
Frank schrieb:> Naja ich bräuchte halt eine Formel, bzw. müsste mir einen Alghoritmus> erstellen, welcher mit den dann vorhanden Zahlen diese Berechnungen> ausführt.
Das sieht mir weder danach aus, daß du dir das angesehen hast,
noch daß es irgend etwas geholfen hätte.
Sondern eher nach "laß doch die Deppen mal die Arbeit machen, ich
bin nur am Ergebnis interessiert".
Frank schrieb:>> [x] Wirtschaftsingenieur
hm.
Also doch eher BWL, jedenfalls ohne den Ehrgeiz der technisch
Interessierten.
Klaus Wachtler schrieb:> Naja ich bräuchte halt eine Formel, bzw. müsste mir einen Alghoritmus>> erstellen, welcher mit den dann vorhanden Zahlen diese Berechnungen>> ausführt.
Da steht "ICH müsste mir einen Algorithmus erstellen" und nicht "ich
brauche jemanden, der das für mich erledigt!!!
Klaus Wachtler schrieb:> Also doch eher BWL, jedenfalls ohne den Ehrgeiz der technisch> Interessierten.
Irgendwas kann man ja immer finden...
Frank schrieb:> nicht mehr alles aus der Schule, aber ich habe ja auch garnicht gesagt,> dass mir einer das LGS erklären soll, das kann ich schon. Aber halt auf> dem Papier mit Zahlen (anders lernt man es nie).
Die studierst irgendwas in Richgung Informatik?
Ich verrate dir jetzt ein Geheimnis:
Jegliche Algorithmenentwicklung beginnt damit, dass man ein bestimmtes
Problem erst mal mit der Hand auf Papier und Bleistift lösen kann. Für
'normale Menschen' reicht das auch. Aber ein Informatiker muss in der
Lage sein, einen Schritt weiter zu gehen. Er muss in der Lage sein, sich
selbst bei dem was er auf dem Papier tut zu beobachten und das was er
dabei lernt in ein Kochrezept zu packen.
Die wichtigsten Fragen an dieser Stelle sind dann:
Das was ich da gerade gemacht habe: Kann ich das in Teilschritte
zerlegen? Warum mache ich genau diesen Schritt jetzt? Welches sind die
Vorbedingungen um diesen Schritt machen zu können? Und ganz wichtig: Was
ist eigentlich die Grundidee an dieser Stelle - worauf zielt dieser
Schritt ab?
Das ist das was Leute in der Software Entwicklung von anderen
unterscheidet. Wir denken viel mehr darüber nach, warum wir Dinge in
ganz bestimmten Reihenfolgen tun und welches Ergebnis daraus resultiert.
Lieschen Müller geht einfach nur zum Fenster und macht es auf.
Für einen Informatiker tun sich da aber Unmengen von Detailproblemen
auf, die allesamt in die Kategrie 'sauschwer' fallen. Und das beginnt
damit, wie wir vom Sessel aufstehen und es dabei schaffen den
Schwerpunkt über den Fussohlen zu halten, bzw. die Arme einsetzen um das
Kippmoment auszugleichen.
Frank schrieb:> Karl heinz Buchegger schrieb:>> Die studierst irgendwas in Richgung Informatik?>> Nein, tue ich nicht.
Habs schon gesehen :-)
Ich brauch auch ein bischen Zeit zum tippen.
Macht aber nichts, vielleicht kannst du trotzdem ein bischen was davon
verinnerlichen. Schliesslich willst du (musst du) ja programmieren.
Karl-Heinz, kannst du mir evtl. kurz eine Sache erklären, da komm ich
nicht drauf:
Auf der arndt-bruenner-Seite steht:
Allgemeine Form:
Si(xi) = ai(x-xi)³ + bi(x-xi)² + ci(x-xi) + di = yi
nahtloser Übergang zwischen zwei Teilstücken: Si-1(xi) = Si(xi) = yi
-> das ist klar!
dann weiter:
wegen Si(xi) = yi folgt di = yi
denn Si(xi) = ai(xi-xi)³ + bi(xi-xi)² + ci(xi-xi) + di = yi
Wieso ist in den Klammern jetzt für x xi eingesetzt?
Frank schrieb:> Karl-Heinz, kannst du mir evtl. kurz eine Sache erklären, da komm ich> nicht drauf:>> Auf der arndt-bruenner-Seite steht:>> Allgemeine Form:>> Si(xi) = ai(x-xi)³ + bi(x-xi)² + ci(x-xi) + di = yi
Genau.
Der springende Punkt:
Der komplette Spline setzt sich aus mehreren Teilen zusammen
wobei jeder Einzelteil jeweils eine eigene Gleichung 3. Grades hat
Der i-te Spline Si geht vom Stützpunkt xi bis zum Stützpunkt x(i+1)
(i ist jeweils in Index)
> nahtloser Übergang zwischen zwei Teilstücken: Si-1(xi) = Si(xi) = yi> -> das ist klar!
logisch. Die Einzelstücke müssen ja aneinanderstossen. Das jeweils
nächste Teilstück beginnt dort, wo das vorhergehende aufhört.
> dann weiter:>> wegen Si(xi) = yi folgt di = yi> denn Si(xi) = ai(xi-xi)³ + bi(xi-xi)² + ci(xi-xi) + di = yi>> Wieso ist in den Klammern jetzt für x xi eingesetzt?
x ist der Punkt entlang des Splines, für den der y Wert gesucht wird.
Am Anfang jedes Einzelteilstückes gilt daher logischerweise, dass dieses
x identisch mit dem x des jeweiligen Stützpunktes xi sein muss. Denn
dort beginnt ja dieses Teilstück.
Frank schrieb:> Si(xi) = ai(x-xi)³ + bi(x-xi)² + ci(x-xi) + di = yi
Ich sehe auch zum ersten mal in dieser Beschreibung, dass ai(x-xi)³
gerechnet wird - das wurde vorher in den anderen Beispielen, welche ich
gerechnet habe nicht gemacht.
Halt dieses ai(aktuelles X - Anfangswert X)³
Also dann macht es natürlich Sinn, wenn ich den aktuellen Wert minus dem
Anfangswert rechne und ich gerade am Anfang bin, dieser Wert zu null
wird.
Trotzdem - woanders wurde das nicht gerechnet mit (x-xi) ??
Frank schrieb:> Also dann macht es natürlich Sinn, wenn ich den aktuellen Wert minus dem> Anfangswert rechne und ich gerade am Anfang bin, dieser Wert zu null> wird.>> Trotzdem - woanders wurde das nicht gerechnet mit (x-xi) ??
Es ist einfach nur ein Trick, so dass für jedes einzelne Teilstück des
Splines dort ein 'lokales x' gibt, welches von 0 beginnend bis zur
Breite dieses Teilstücks fährt.
Im Grunde macht man nichts anderes als dass man jedes Teilstück so
berechnet, als ob der Anfangspunkt des Teilstücks auf der Y-Achse des
Koordinatensystems (bei x = 0) anfangen würde.
Des öfteren erreicht man durch diesen Trick, dass Gleichungen einfacher
werden. Man darf nur nicht vergessen, gegebenenfalls das Ergebnis wieder
an seinen richtigen Platz zurückzuverschieben.
Ein anderes Beispiel:
Gegeben sei ein Kreis an eines beliebigen Position xm/ym
Gesucht ist, ob ein bestimmter Punkt xp/yp innerhalb oder ausserhalb des
Kreises liegt.
Nun kann man das natürlich berechnen. Einfach ist aber folgendes:
Wir kennen die Kreisgleichung für einen Kreis im Ursprung.
x^2 + y^2 = r^2
Ein Punkt liegt genau dann in diesem Kreis, wenn er in die linke Seite
eingesetzt einen Wert kleiner als r^2 ergibt.
Nun liegt aber unser Kreis nicht im Ursprung! Was tun? Ganz einfach,
verschieben wir ihn doch ganz einfach dorthin und mit ihm den zu
untersuchenden Punkt. Durch die Verschiebung bleibt der Kreis immer noch
Kreis und alles was wir tun müssen ist die Mittelpunktskoordinaten von
allen Beteiligten abzuziehen.
D.h. anstelle zu untersuchen ob der Punkt xp/yp im Kreis xm/ym/r liegt,
können wir auch untersuchen, ob der Punkt (xp-xm)/(yp-ym) im Kreis 0/0/r
liegt.
letztere Untersuchung ist aber trivial. Den verschobenen Punkt in die
Kreisgleichung eingesetzt und nachgesehen ob etwas kleiners als r^2 raus
kommt.
Das ist ein gern gemachter Trick in der Geometrie. Wenn etwas in der
Allgemeinheit schwer zu rechnen ist, versuche eine spezielle Lage zu
finden, in der das Problem einfacher wird, verschiebe/drehe deine
konkrete Situation in diese spezielle Lage, löse dort das Problem und
transformiere das Ergebnis wieder zurück.
Ich kenne einen Schüler, der eine Facharbeit zur Spline-Interpolation
(keine Linearisierung!) geschrieben hat.
Falls Frank Interesse hat, möge er mir eine Email schreiben.#
Da wäre ich sehr dran interessiert! Vielen Dank! Ich bin hier nicht
angemeldet, aber ich gebe gerne meine email-Adresse hier an:
franky boy 9000 ät web . de
Dafür bin ich wirklich sehr dankbar!!!!!!!
Ist es denn unbedingt notwendig, die Gleichung im µP zu berechnen?
Wie gibst Du die Stützstellen dem System mit? Konfiguration per PC?
Wieso die Berechnung nicht komplett dem PC zumuten und nur eine
Lookup-Tabelle in den µP übertragen? Diese muss nicht jeden möglichen
Wert enthalten. Es genügen hinreichend viele Werte zwischen denen linear
interpoliert werden kann.
Christian H. schrieb:> Wieso die Berechnung nicht komplett dem PC zumuten und nur eine> Lookup-Tabelle in den µP übertragen?
Dann müsste ich mir ja auch erst aus dem uC die ADC-Werte ausgeben
lassen.
Besser wäre es halt, wenn er die Koeffizienten selber berechnet - diese
Rechnung wird ja nur einmal durchgeführt.
Hallo,
Auf der arndt-bruenner-Seite steht ja das Gleichungssystem um die b_i zu
bestimmen.
Dazu muss man aber keine n x n -Matrix verwenden ( wie er es javascript
macht ) , sondern kommt mit 3x n für die b_i aus, indem man sich den
ersten Koeffizient um die Zeilenzahl-1 verschoben vorstellt.
//b0 b1 b2
0 2(x2-x0) x2-x1 = k1
//b1 b2 b3
x2-x1 2(x3-x1) x3-x = k2
//b2 b3 b4
x3-x2 2(x4-x2) x4-x3= k3
..
//b_n-2 b_n-1 b_n
x_n-1-x_n-2 2(x_n-x_n-2) 0 = k_n-1
Zusätzlich 1 x n für die rechte Seite k_i = 3((d_i+1 -d_i)/(x_i+1-x_i) -
(d_i-d_i-1)/(x_i-x_i-1)) .
Nun kann man durch Subtraktion des passenden Vielfachen der Zeile_i
dafür sorgen das die erste Spalte in der Zeile i-1 zu 0 wird.
Nach einem Durchlauf ist in der ersten Zeile nur noch der Faktor von
b_1 <> 0, oder man hat ein Problem....
f*b_n-1 = ?? -> b_n-1 = ??/f
Dann in einem zweiten Durchlauf alles vorwärts wieder einsetzen und
schon ist man fertig.
Wenn man in dieser Matrix alle b_i bestimmt hat, kann man diese auch
direkt zur Speicherung der Koeffizienten a_i.. c_i nutzen.d_i == y_i
braucht man ja nicht.
Also braucht man zur Berechnung nur kurzzeitig/temporär den Speicher für
die rechte Seite des LGS.
Aber es wird wohl nicht um 10 Stützstellen gehen.
Lange Rede keinen Sinn.
Man spart gegenüber einer PC-Berechnung nichts an Speicherplatz und die
Laufzeit nimmt auch nicht quadratisch sondern nur linear zu.
Eine Parabel zum Beispiel: y = (x-1)^2
1 0
2 1
3 4
4 9
5 16
1: 0.0000000 4.0000000 1.0000000 = 6.0000000 | b0 b1 b2
2: 1.0000000 4.0000000 1.0000000 = 6.0000000 | b1 b2 b3
3: 1.0000000 4.0000000 0.0000000 = 6.0000000 | b2 b3 b4
-0.2500000 * Zeile3+ Zeile 2
1: 0.0000000 4.0000000 1.0000000 = 6.0000000
2: 1.0000000 3.7500000 0.0000000 = 4.5000000
3: 1.0000000 4.0000000 0.0000000 = 6.0000000
-0.2666667 * Zeile2+ Zeile 1
1: 0.0000000 3.7333333 0.0000000 = 4.8000000
2: 1.0000000 3.7500000 0.0000000 = 4.5000000
3: 1.0000000 4.0000000 0.0000000 = 6.0000000
b0 = 0 , nach Voraussetzung
b1 = 4,8/3,733 = 1,2857
b2 = (4,5-1*b1)/3,75 = 0,85714
b3 = (6-1*b2)/4=1,2857
b4 = 0 , nach Voraussetzung
wie bei arndt bruenner.
Es ist mächtig enttäuschend , das eine Parabel nicht getroffen wird.
Aber das liegt an den Nebenbedingungen, dass es in den Endpunkten keine
Parabel sein soll.
b_0 und b_n sind dort 0 gesetzt.
Frank schrieb:> Ich möchte gerne eine Linearisierung mittels eines Polynoms durchführen> und muss dafür meine ADC-Werte miteinander multiplizieren.
Hallo Frank,
wie wäre denn folgender Ansatz für Dich:
Du teilst die Funktion in einen linearen Anteil (Offset + Steilheit) und
eine davon abweichende Fehlerkurve (nichtlineares Polynom).
Den Abgleich wirst du sowieso am Nullpunkt und am Maximalwert machen.
Bei einem maximalen Linearitätsfehler von 1% kommst Du auf maximal ca 13
Bit für den Fehlertherm. 4*13 Bit = 52 Bit lassen sich ohne Probleme in
64 Bit darstellen. Insbesonders dann wenn Du die Fehlerkurve noch auf
die Meßbereichsmitte symmetrierst. (+/- 12 Bit)
Gruß Anja
Hallo,
dass hat mich doch sehr gewurmt, das kubische splines so daneben liegen
sollen.
Bei Arndt Bruener kann man ja die Krümmung in den Endpunkten vorgeben.
Wenn man für die Einheitsparabel dann entsprechend w" = 2 also b_0 und
b_n = 2 eingibt, spuckt das Programm schön dies hier aus:
S0(980,444) = -4,995000815193 jeweils besser aus das Ausgangspolynom
9
S1(1193,971 ) = 50,007253188068
Wie heißt es so schön, erschreckend genau, für drei Stützstellen...
und jenseits der Realität.
Kubische splines sind scheinbar auf einem Mikrocontroller machbar, aber
wie bestimmt man b_0 und b_n sinnvoll, bei deren grossen Einfluß?
"Einfach so " einsetzen ist ja nichts richtiges.
So!
Also ich wollte mich nurmal bei allen bedanken!
Ich habe meine Splines jetzt am laufen!!! Der uC berechnet den ADC-Wert
und interpoliert ziemlich gut die gemessen Werte.
Anfangs hatte ich einen Fehler (ohne Interpolation) von ca. 0,2%.
Jetzt habe ich so ziemlich bei jeder Messzelle einen maximalen Fehler
(und der Fehler liegt ja in der nicht-linearität der Messzelle) von
0,02%.
Ich nehme dazu 5 Punkte auf, bei denen ich den genauen Druck weiß.
Danach lasse ich das Gerät von einem Prüfstand "durchchecken".
Das Ergebnis kann sich echt sehen lassen!
Das ist schon echt gut!
Also vielen Dank an alle, die mir hier geholfen haben!
Führst Du die Berechnung mit Integer- oder mit Fließkommazahlen durch?
>Das ist schon echt gut!
Erfreulich, aber poste doch mal den Datensatz eines Sensors (Tabelle mit
Drücken und gemessenen ADC-Werten), wenn Du willst. Es wäre interessant
zu wissen, wie gut ein kubisches Ausgleichspolynom im Vergleich zu den
Splines abschneidet. Die Berechnung eines solchen Polynoms ist nicht
komplizierter, im Gegenteil. Vorausgesetzt man verwendet Floats.
>Der uC berechnet den ADC-Wert
Wie das? Ich hätte jetzt gedacht, der bekommt den ADC-Wert vom Wandler
angeliefert und berechnet daraus den zugehörigen Druck.