Forum: Mikrocontroller und Digitale Elektronik Große Integer-Zahlen multiplizieren - 64Bit reicht nicht! Trick?


von Frank (Gast)


Lesenswert?

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
1
64Bit:     18446744073709551616
2
1048575^4: 1208921207935207812890625

Kann ich das trotzdem irgendwie rechnen?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Nimm float, das hat eine Genauigkeit von 23Bit, sollte für nen 20Bit-ADC 
ja dicke reichen.


Peter

von Klaus W. (mfgkw)


Lesenswert?


von XXX (Gast)


Lesenswert?

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

von Vlad T. (vlad_tepesch)


Lesenswert?

dann bau dir halt eine bigint bibliothek (oder suche im Netz danach)

von Klaus W. (mfgkw)


Lesenswert?

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.

von Horst H. (horha)


Lesenswert?

Hallo,

bei Polynomen nimmt man doch zur Erleichterung das Horner-Schema
http://de.wikipedia.org/wiki/Horner-Schema

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Jean Player (Gast)


Lesenswert?

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ß

von Sven P. (Gast)


Lesenswert?

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 :->

von Vlad T. (vlad_tepesch)


Lesenswert?

Horst Hahn schrieb:
> bei Polynomen nimmt man doch zur Erleichterung das Horner-Schema
> http://de.wikipedia.org/wiki/Horner-Schema

das veringert nur die Anzahl der Rechenoperationen, nicht die 
numerischen Probleme.

von Frank (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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_t adc_0_value        = 0; // Werte werden vom ADC eingelesen
2
int64_t adc_50_value       = 0;
3
int64_t adc_100_value      = 0;
4
  
5
double  divider_0          = 0;
6
double  divider_1          = 0;
7
double  divider_2          = 0;
8
9
double fraction_0          = 0;
10
double fraction_1          = 0;
11
double fraction_2          = 0;
12
  
13
double coeff_1             = 0;
14
double coeff_2             = 0;
15
double coeff_3             = 0;
16
  
17
int64_t adc_0_MPY_adc_50   = 0;
18
int64_t adc_0_MPY_adc_100  = 0;
19
int64_t adc_50_MPY_adc_100 = 0;
20
 
21
int32_t adc_0_ADD_adc_50   = 0;
22
int32_t adc_0_ADD_adc_100  = 0;
23
int32_t adc_50_ADD_adc_100 = 0;
24
25
adc_0_MPY_adc_50   = (adc_0_value * adc_50_value);
26
adc_0_MPY_adc_100  = (adc_0_value * adc_100_value);
27
adc_50_MPY_adc_100 = (adc_50_value * adc_100_value);
28
29
adc_0_ADD_adc_50   = (adc_0_value + adc_50_value);
30
adc_0_ADD_adc_100  = (adc_0_value + adc_100_value);
31
adc_50_ADD_adc_100 = (adc_50_value + adc_100_value);
32
        
33
divider_0 = ((adc_0_value * adc_0_value) - adc_0_MPY_adc_100 - adc_0_MPY_adc_50 + adc_50_MPY_adc_100);
34
divider_1 = ((adc_50_value * adc_50_value) - adc_50_MPY_adc_100 - adc_0_MPY_adc_50 + adc_0_MPY_adc_100);
35
divider_2 = ((adc_100_value * adc_100_value) - adc_50_MPY_adc_100 - adc_0_MPY_adc_100 + adc_0_MPY_adc_50);
36
        
37
fraction_0 = (0 / divider_0);
38
fraction_1 = (50 / divider_1);
39
fraction_2 = (100 / divider_2);
40
        
41
coeff_1 = (fraction_0 + fraction_1 + fraction_2);
42
coeff_2 = (- ((adc_50_ADD_adc_100 * fraction_0) + (adc_0_ADD_adc_100 * fraction_1) + (adc_0_ADD_adc_50 * fraction_2)));
43
coeff_3 = ((adc_50_MPY_adc_100 * fraction_0) + (adc_0_MPY_adc_100 * fraction_1) + (adc_0_MPY_adc_50 * fraction_2));
44
        
45
RAM_coeff_1 = coeff_1;
46
RAM_coeff_2 = coeff_2;
47
RAM_coeff_3 = coeff_3;

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.

von Frank (Gast)


Lesenswert?

Ich hatte halt ADC-Werte bei 0%, bei 50% und bei 100% des Messbereichs 
aufgenommen - der Druck war stets bekannt und genau.

von Frank (Gast)


Lesenswert?

1
float calc_lin_adc_percentage (int32_t adc_result)
2
{
3
  double lin_result;
4
  float return_value;
5
  int64_t powed_adc_result;
6
  
7
  powed_adc_result = ((int64_t) adc_result * adc_result);
8
  
9
  lin_result = ((RAM_coeff_1 * powed_adc_result) + (RAM_coeff_2 * adc_result) + RAM_coeff_3);
10
  return_value = (float) lin_result;
11
  
12
  return return_value;
13
}

So habe ich dann im Programm den %-Wert des Signals vom Messbereich 
errechnet.

Hier halt noch mit hoch^2

von Horst H. (horha)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

Oder wie sollte ich die Linearisierung sonst lösen?

Wie macht ihr das?

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Tabelle oder halt stückweise Linear wird wohl zu ungenau, oder?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Analogrechner (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jörg H. (idc-dragon)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Nilp (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Frank (Gast)


Lesenswert?

Nehmen wir an ich möchte mit 5 Punkten kalibrieren, wie sollte ich dann 
am besten eine Linearisierung anstellen?

von Peter D. (peda)


Lesenswert?


von 123 (Gast)


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

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 :-)

von Frank (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 ....

von Frank (Gast)


Lesenswert?

Schonmal direkt ne Frage:

Wieso heißt es in dem Artikel von Wiki

"Der kubische C²-Spline"

Warum ist das Quadrat ein KUBISCHER Spline?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

Ach das ist wegen zweimal differenzierbar...?

von Frank (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> welcher Artikel?

Der Link von Peda

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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-Wert 0% | ADC-Wert 50% | ADC-Wert 100%
2
------------------------------------------------
3
 y |   Druck 0%  |   Druck 50%  |   Druck 100%

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.
1
2 Gleichungen durch einsetzen von unterer und oberer Grenze im ersten Intervall:
2
3
I    ADC0^3*a1 + ADC0^2*b1 + ADC0*c1 + d1 = 0
4
II   ADC50^3*a1 + ADC50^2*b1 + ADC50*c1 + d1 = 50
5
6
2 Gleichungen durch einsetzen von unterer und oberer Grenze im zweiten Intervall:
7
8
III  ADC50^3*a2 + ADC50^2*b2 + ADC20*c2 + d2 = 50
9
IV   ADC100^3*a2 + ADC100^2*b2 + ADC100*c2 + d2 = 100
10
11
1 Gleichung durch Gleichsetzen der ersten Ableitungen:
12
13
V    3*ADC50^2*a1 + 2*ADC50*b1 + c1 - 3*ADC50^2*a2 - 2*ADC50*b2 - c2 = 0
14
15
1 Gleichung durch Gleichsetzen der zweiten Ableitungen:
16
17
VI   6*ADC50*a1 + 2*b1 - 6*ADC50*a2 - 2*b2 = 0
18
19
2 Gleichungen durch die Randbedingungen am Anfang und Ende (= 0)
20
21
VII  6*ADC0*a1 + 2*b1 = 0
22
VIII 6*ADC100*a2 + 2*b2 = 0

Aber löse ich denn ein LGS ohne Zahlen auf?


Kann mir da jemand helfen?

von Frank (Gast)


Lesenswert?

Sorry, ich meinte natürlich ACHT Gleichungen für die ACHT Unbekannten!

von Klaus W. (mfgkw)


Lesenswert?

http://de.wikipedia.org/wiki/Lineares_Gleichungssystem#L.C3.B6sungsverfahren

Natürlich erst, wenn du deine Zahlen hast.

(Sowohl bei 6 als auch bei 8 Unbekannten)

von Falk B. (falk)


Lesenswert?


von Frank (Gast)


Lesenswert?

Naja ich bräuchte halt eine Formel, bzw. müsste mir einen Alghoritmus 
erstellen, welcher mit den dann vorhanden Zahlen diese Berechnungen 
ausführt.

von Horst H. (horha)


Lesenswert?

Hallo,

Irgendwie alles sehr ähnlich auch 20 Bit:
Beitrag "Mit Microcontroller eine Linearisierungskurve erstellen und für Berechnungen verwenden"
Kubisiche Splines Koeffizientenbrechnung, wie man a_i,b_i etc berechnet.
http://www.arndt-bruenner.de/mathe/scripts/kubspline.htm

von Arc N. (arc)


Lesenswert?

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.

Sieh dir mal die Artikel in der englischen Wikipedia an...
http://en.wikipedia.org/wiki/Monotone_cubic_spline
http://en.wikipedia.org/wiki/Cubic_Hermite_spline

von Karl H. (kbuchegg)


Lesenswert?

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)

von Frank (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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]

von Karl H. (kbuchegg)


Lesenswert?

Horst Hahn schrieb:

> Irgendwie alles sehr ähnlich auch 20 Bit:
> Beitrag "Mit Microcontroller eine Linearisierungskurve erstellen und für Berechnungen verwenden"

Jep. Den Thread hatte ich komplett vergessen.

@Frank
Den solltest du dir von Anfang an durchgehen. Irgendwo mitten drinn hab 
ich da eine ganz brauchbare Zusammenfassung der Idee des Gauss Jordan 
Verfahrens beschrieben.

von Klaus W. (mfgkw)


Lesenswert?

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?

von Frank (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.
)

von Martin (Gast)


Lesenswert?

Was studiert ihr?

[ ] Germanistik
[ ] BWL
[x] Gartenbau

Seid ihr faul?

[x] Ja
[ ] Nein

von Klaus W. (mfgkw)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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...

von Frank (Gast)


Lesenswert?

Herzlichen Dank, Klaus!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Die studierst irgendwas in Richgung Informatik?

Nein, tue ich nicht.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Frank schrieb:
> Herzlichen Dank, Klaus!

Gern geschehen; wenn es denn hilft!

von Frank (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Gern geschehen; wenn es denn hilft!

Ja, SEHR!

von Frank (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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)³

von Frank (Gast)


Lesenswert?

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) ??

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

OK, ich glaub dann hab ich es jetzt - vielen Dank!!!!

von Wolfgang S. (wsm)


Lesenswert?

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.#

von Frank (Gast)


Lesenswert?

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!!!!!!!

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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.

von Erhardt (Gast)


Lesenswert?

Sehr interessanter Thread, hat spaß gemacht ihn zu lesen.
Danke an alle Mitwirkenden :)

von Frank (Gast)


Lesenswert?

Jaja, macht euch nur lustig über mich :) Ich schaff das noch!

von Horst H. (horha)


Lesenswert?

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.

von Horst H. (horha)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe es nun fertig in FreePascal.
Es kommen sehr genau die Werte auf der Seite von Andre Bruenner heraus:
1
  x_i     y_i      f(x) = (x-1)^2
2
  0.7   0.09
3
  1     0
4
  2     1
5
  3     4
6
  3.3   5.29
7
  4.5   12.25
8
  5    16
9
10
        a          b          c
11
 0:  1.2556651 0.0000000-0.4130099
12
 1: -0.0561182 1.1300986-0.0739803
13
 2:  0.0203940 0.9617439 2.0178623
14
 3: -0.1045443 1.0229260 4.0025320
15
 4:  0.0675943 0.9288361 4.5880604
16
 5: -0.7814505 1.1721756 7.1092744
17
f(r) = ((a_i*(r-x_i)+b_i)*(r-x_i)+c_i)*(r-x_i)+y_i
18
19
  x
20
4.750 genaehert  14.088369 genau:  14.062500
21
3.900 genaehert   8.391818 genau:   8.410001
22
0.900 genaehert   0.017443 genau:   0.010000
23
1.500 genaehert   0.238520 genau:   0.250000

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.

von Anja (Gast)


Lesenswert?

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

von Horst H. (horha)


Lesenswert?

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:
1
x aus [1; 2]
2
S0(x) = (x-1)^2
3
      = x^2 - 2x + 1
4
x aus [2; 3]
5
S1(x) = (x-2)^2 + 2(x-2) + 1
6
      = x^2 - 2x + 1
7
x aus [3; 4]
8
S2(x) = (x-3)^2 + 4(x-3) + 4
9
      = x^2 - 2x + 1
10
x aus [4; 5]
11
S3(x) = (x-4)^2 + 6(x-4) + 9
12
      = x^2 - 2x + 1
Da kann man nicht meckern ;-)

Ich habe es mal für eine PT1000 und drei Stützstellen probiert.
Aus 
http://www.umnicom.de/Elektronik/Schaltungssammlung/Temperatur/Pt1000/Pt1000.html
(-20,30 und 70 Grad)
PT1000 ist ja sehr gut quadratisch näherbar, dann ist die Umkehrung ja 
eine Wurzelfunktion
1
    921,599   -20
2
  1116,729    30
3
  1270,751    70
4
Zuerst b_0,b_3 = 0 ,
5
x aus [921,599; 1116,729]
6
S0(x) = 3e-8(x-921,599)^3 + 0,25527155(x-921,599) - 20
7
      = 3e-8x^3 - 0,00007028x^2 + 0,32004254x - 275,15563072
8
x aus [1116,729; 1270,751]
9
S1(x) = -3e-8(x-1116,729)^3 + 0,00001488(x-1116,729)^2 + 0,2581752(x-1116,729) + 30
10
      = -3e-8x^3 + 0,00012277x^2 + 0,10445485x - 194,90462
11
S0( 980,444 ) = -4,973366192092  // == -5 Grad Pt1000 DIN DIN EN 60751 (ITS68)
12
S1(1193,971 ) =50,015909781608// ==50 Grad

Durch einsetzen von b_0= 0,00001488 vor dem quadratischem Term in S1(x) 
ergibt sich:
1
x aus [921,599; 1116,729]
2
S0(x) = 1e-8(x-921,599)^3 + 0,00000744(x-921,599)^2 + 0,25443893(x-921,599) - 20
3
      = 1e-8x^3 - 0,00001788x^2 + 0,26406311x - 255,34082984
4
x aus [1116,729; 1270,751]
5
S1(x) = -3e-8(x-1116,729)^3 + 0,0000128(x-1116,729)^2 + 0,25838867(x-1116,729) + 30
6
      = -3e-8x^3 + 0,00010562x^2 + 0,12614481x - 204,00170742
7
Ergibt:
8
S0(980,444) = -4,999912398313  wesentlich besser
9
S1(1193,971 ) = 50,022068489742 schlechter :-(

Durch einsetzen von diesmal b_n= 0,0000128 vor dem quadratischem Term in 
S1(x) ergibt sich:
1
x aus [921,599; 1116,729]
2
S0(x) = 1e-8(x-921,599)^3 + 0,00000744(x-921,599)^2 + 0,25453074(x-921,599) - 20
3
      = 1e-8x^3 - 0,00001122x^2 + 0,25801054x - 253,53789604
4
x aus [1116,729; 1270,751]
5
S1(x) = -1e-8(x-1116,729)^3 + 0,00001139(x-1116,729)^2 + 0,25820504(x-1116,729) + 30
6
      = -1e-8x^3 + 0,00004757x^2 + 0,19236302x - 229,10106521
7
Ergibt:
8
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.

von Frank (Gast)


Lesenswert?

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!

von Vuvuzelatus (Gast)


Lesenswert?

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.

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.