Forum: Analoge Elektronik und Schaltungstechnik Polynom-Regression von Messwerten


von Hermann (Gast)


Angehängte Dateien:

Lesenswert?

Endlich habe ich herausgefunden, wie man Messwerte mit einem Polynom 
beliebigen Grades annähert. Das wollte ich euch nicht vorenthalten. Da 
bietet sich nätürlich Excel an (V2007). Wie das geht, habe ich mir aus 
dem Internet zusammengesucht. Im Anhang ist ein Beispiel.
Ich habe mir also ein Polynom 4.Grades erstellt: die Koeffizienten 
stehen in Zeile 5 und das Ergebnis in Spalte Y. Die Funktion RGP() 
liefert die Regression - aber leider ohne Tricks nur den linearen 
Koeffizienten A1.
Trick 1: Unter der Tabelle habe ich dargestellt wir man die weiteren 
Koeffizieten erhält (so beschreibt es Microsoft).
1.: Man markiert die Formeln zusammen mit den rechts daneben liegenden 
Zellen und 2.: drückt man F2. Dann 3.: drückt man Strg+Shift+Return
Und siehe da ... es erscheit der konstante Koeffizient A0. Mehr als 
lineare Regression macht RGP nicht ohne Trick 2:

Für A2, A3, .... macht man hinter der x-Spalte weitere Spalten mit X^2, 
X^3,... Jetzt gibt man für die X-Werte in RGP den gesamten Bereich mit 
den X^2...-Werten an, also z.B. A12:D32. Und schon liefert RGP Polynome 
beliebigen Grades, man muss nur genügend Zellen in Trick 2 markieren.

Im Diagramm sieht man die Ergebnisse. Die Regressionen 4.Grades habe ich 
nicht dargestellt - man sieht an den Koeffizienten, dass sie genau 
passt.

Vielleicht kennt ihr noch bessere Möglichkeiten.

von Hermann (Gast)


Angehängte Dateien:

Lesenswert?

Es geht noch viel mehr: ein Polynom passt ja nicht für jeden Verlauf. 
Deshalb noch ein Beispiel für Y=f(1/x). Man schreibt einfach für den 
x-Bereich z.B. 1/A12:D32 und schon liefert RGP die Koeffizienten für das 
Kehrwert-Polynom. Man kann auch noch logarithmische Regression machen, 
wenn man für den x-Bereich ln(A12:A32) schreibt.
Übrigens finde ich die Microsoft-Methode für die Ausgabe der Array-Werte 
recht umständlich. Mir ist die Index-Funktion sympatischer. Unter 
welchem Index die Koeffizienten zu finden sind, habe ich unter der 
Tabelle dargestellt. So kommt man auch besser an die ganzen Kennwerte. 
Z.B. liefert der "Bestimmtheitswert" R2 (0...1), wie gut die Regression 
geklappt hat.
Hier noch die passende Microsoft-Seite:
http://office.microsoft.com/de-de/excel-help/rgp-HP005209155.aspx

von Nase (Gast)


Lesenswert?

Hermann schrieb:
> Vielleicht kennt ihr noch bessere Möglichkeiten.

Ja, gnuplot kann beliebige Funktionen in beliebig vielen Parametern 
numerisch fitten. Das funktioniert mehr oder weniger gut, je nach dem, 
wie der Kern gewählt wurde. Manchmal muss man mit Startwerten 
nachhelfen, wenn der Algorithmus ansonsten in in falsches (lokales) 
Optimum läuft.

Deine Polynome eignen sich außerdem und im allgemeinen eher schlecht, um 
unbekannte Messwertverläufe anzunähern. Wenn man von vornherein weiß, 
dass es etwas Polynom-ähnliches wird, dann geht es. Oder beim 
allgemeinen numerischen Fitten, wenn man den Kurventyp kennt und nur die 
Parameter optimieren möchte (z.B. irgendeine Halbleiterkennlinie).

Ansonsten neigen höhergradige Polynome gern zum Oszillieren.

Zum Glätten gibts geeignetere Methoden mit Splines und so.

von Hermann (Gast)


Lesenswert?

Nase schrieb:
> gnuplot kann beliebige Funktionen in beliebig vielen Parametern
> numerisch fitten

Naja, je nachdem wofür man es braucht. gnuplot ist doch die 
command-line-Geschichte. Ich kenne es nicht, aber die Einarbeitung ist 
wohl schon mal nicht von Pappe. Ich hab mir mal die absoluten Basics in 
youtube angesehen.
Zum Glätten von Messwerten ist Spline sicherlich gut.

Meine Intension ist aber eher das Berechnen von Zwischenwerten, oft auch 
im Mikroproz. Da brauche ich eine Näherungsfunktion. Dafür scheint mir 
gnuplot und spline eher ungeeignet. Wenn die Funktion nicht passt, nehme 
ich lieber eine Wertetabelle und interpoliere.
Vielleicht sehe ich das auch falsch.

von Kai K. (klaas)


Lesenswert?

>Vielleicht sehe ich das auch falsch.

Polynom-Regressionen sind tükisch. Es wimmelt hier nur so von 
Fallstricken. Fast immer ist die stückweise lineare Interpolation oder 
sogar eine simple "Look-Up"-Tabelle völlig ausreichend. Man kommt 
schneller zum Ziel und hat nicht mit einem Sack voller Flöhe zu kämpfen.

von Mathelehrling (Gast)


Lesenswert?

Hermann schrieb:
> Endlich habe ich herausgefunden, wie man Messwerte mit einem Polynom
> beliebigen Grades annähert.

Sehr gut, das ist ein schöner Anfang!

Wenn Du mehr lernen möchtest und deutlich mächtigere Dinge machen 
möchtest, solltest Du Deine Energie nicht weiter mit dem Excel-Mist 
verschwenden und statt dessen Dich auf SciPy konzentrieren:

   http://www.scipy.org

bzw., konkreter:

   http://docs.scipy.org/doc/numpy/reference/routines.polynomials.polynomial.html

und mit deutlich mehr Möglichkeiten:

   http://docs.scipy.org/doc/scipy/reference/optimize.html

von Sven B. (scummos)


Lesenswert?

Mathelehrling schrieb:
> Wenn Du mehr lernen möchtest und deutlich mächtigere Dinge machen
> möchtest, solltest Du Deine Energie nicht weiter mit dem Excel-Mist
> verschwenden und statt dessen Dich auf SciPy konzentrieren:

+1, Excel ist zur Datenauswertung ziemlich ungeeignet und SciPy ist eine 
feine Sache.

von Pandur S. (jetztnicht)


Lesenswert?


von ./. (Gast)


Lesenswert?

Um ein Polynom n-ter Ordnung durch n Punkte zu faedeln,
braucht man nur ein lineares Gleichungssystem n-ter Ordnung loesen.

Das ist nun wirklich keine Raketenwissenschaft...
(Und ein Excel braucht man dazu auch nicht unbedingt.)

Im allgemeinen wird das damit erzeugte Polynom aber nicht den
Anspruechen gerecht, die man gemeinhin an eine "nutzbare" Approximation
stellt.

Deswegen werden dort eher Splines und Bezierkurven verwendet.

von Sven B. (scummos)


Lesenswert?

Splines und Bezierkurven sind für wissenschafftliche Zwecke Unfug. Du 
musst ein Modell des zugrundeliegenden Prozesses haben und das fitten. 
Einen Spline durchfitten ist total bedeutungslos, was willst du damit 
erreichen, außer dass die Kurve hübsch aussieht?

von Hermann (Gast)


Angehängte Dateien:

Lesenswert?

Kai Klaas schrieb:
> Polynom-Regressionen sind tükisch. Es wimmelt hier nur so von
> Fallstricken

Ihr scheint ja alle was gegen Polynome zu haben. Ich weiß auch, das die 
nicht immer passen. Das war ja nur ein Beispiel.
Wenn man sich mit RGP() beschäftigt, merkt man irgend wann, dass man der 
Funktion alles unterjubeln kann - also belibig unterschiedliche 
Funktionsteile gespickt mit Bedingungen und sonstwas. Ich bin nun mal 
ein Excel-Fan und muss euch noch beweisen, dass das Schimpfen über 
Polynome das Einrennen von offenen Türen ist.
Also habe ich im Anhang mit Exp()-Funktionen einen krummen Verlauf 
hingebastelt, der am Schluss über eine Wenn()-Funktion abschmiert. 
Hierfür soll RGB jetzt eine Regression zaubern.
Dazu muss ich RGP etwas passendes anbieten: ein bisschen sieht die Kurve 
wie zwei Parabeln aus, eine nach oben und eine nach unten geöffnet und 
auf der x-Achse verschoben. Also biete ich RGP zwei Parabeln mit einem 
x-Offset an, wobei die zweite über eine Bedingung erst ab dem Offset 
einsetzt. Ein bisschen am Offset gespielt, und die Regession sieht schon 
mal ganz gut aus.

Mathelehrling schrieb:
> mit dem Excel-Mist
> verschwenden und statt dessen Dich auf SciPy konzentrieren

Meckern kann jeder, aber es wäre mir lieber, wenn du dich als 
Mathelehrer gemeldet und mal ein Beispiel vorgeführt hättest. Aber 
nichts für ungut, ich gucke mir das SciPy mal an. Das Gnuplot und 
Splines waren für meine Zwecke schon mal nichts.
Aber über Excel lasse ich nichts kommen - damit habe ich bisher fast 
alles hingekriegt.

von Mathelehrling (Gast)


Lesenswert?

Hermann schrieb:
> Meckern kann jeder, aber es wäre mir lieber, wenn du dich als
> Mathelehrer gemeldet und mal ein Beispiel vorgeführt hättest.

Gerne. Folgendes Progrämmchen findet die Parameter exakt:

1
from numpy import *
2
from scipy import *
3
from scipy.optimize import curve_fit
4
5
@vectorize
6
def f(x, a0, a1, a2, a3):
7
    if x > 4:
8
        return a0 + a1*e**(x-2) + a2*e**(-x) + a3*(x-4)**2
9
    else:
10
        return a0 + a1*e**(x-2) + a2*e**(-x)
11
12
13
x = arange(0, 5, 0.2)
14
y = f(x, 5, 0.5, 5, -20)
15
16
popt, pcov = curve_fit(f, x, y, ones(4))
17
18
print(popt)


Mir ging es aber gar nicht darum, irgendwie zu meckern. Ja, mir ist auch 
bekannt, dass ganze Unternehmen auf Excel basieren. Ich wollte nur 
darauf hinweisen, dass es deutlich mächtigere Software für solche 
Aufgaben gibt, die auch noch OpenSource und völlig kostenlos ist.

Klar, am Anfang ist es etwas schwieriger als Excel. Aber sobald man sich 
damit regelmäßig beschäftigt will man nie wieder zu Excel zurück.

von Possetitjel (Gast)


Lesenswert?

./. schrieb:

> Um ein Polynom n-ter Ordnung durch n Punkte zu faedeln,
> braucht man nur ein lineares Gleichungssystem n-ter Ordnung
> loesen. [...]
>
> Im allgemeinen wird das damit erzeugte Polynom aber nicht
> den Anspruechen gerecht, die man gemeinhin an eine "nutzbare"
> Approximation stellt.

Es ist nicht verwunderlich, dass ein Interpolationspolynom
nicht die an eine Approximation gestellten Ansprüchen genügt,
in der Tat.

Ein Fahrrad erfüllt auch nicht unbedingt die an eine
Schubkarre gestellten Ansprüche.

von Hermann (Gast)


Lesenswert?

Mathelehrling schrieb:
> Folgendes Progrämmchen findet die Parameter exakt:

Vielen Dank, da kann man sich wenigstens etwas vorstellen. Habe ich 
schon festgestellt: Scipy ist eine Programmiersprache mit einer großen 
Bibliothek. Die Einarbeitung, bis ich die Lösung schnell mal 
hinschreiben kann, tue ich mir erstmal nicht an. Dann kann ich ja auch 
VBA in Excel nehmen, da kenn ich mich schon aus.

Man kann das ja halbwegs lesen was da passiert. Ist das so richtig?:
- Def definiert die Funktion
- X=arange und Y=f(x...) füllt die Testdaten
- curve_fit optimiert die Parameter
Es müsste dann das herauskommen, was in y=f(x...) angegeben ist

Das macht einen sehr guten Eindruck!!
Aber leider kostet das die Einarbeitung. Wenn ich ständig 
unterschiedliche Probleme lösen muss, würde sich das lohnen. Andenfalls 
fange ich wieder von vorne an.
Und dann müsste ich noch Gnuplot, Splines, Simulink, ....
Ich bleibe erstmal bei meinem geliebten Allerwelts-Tool Excel.
Nochmal Danke Mathelehrer

von Possetitjel (Gast)


Lesenswert?

Hermann schrieb:

> Ich bin nun mal ein Excel-Fan und muss euch noch
> beweisen, [...]

Nee.

Missionieren führt nur zu Glaubenskriegen. Davon hat
keiner 'was.

von Mathelehrling (Gast)


Lesenswert?

Hermann schrieb:
> Scipy ist eine Programmiersprache mit einer großen
> Bibliothek.

Genau genommen ist die Programmiersprache Python. Python hat nun schon 
fast 25 Jahre auf dem Buckel:

  https://www.python.org/

SciPy ist in der Tat im Prinzip eine große Bibliothek. Die ersten 
Anfänge von SciPy liegen knapp 15 Jahre zurück. Die Module setzen 
teilweise auf richtig gute abgehangene Software die z.B. in Fortran 
geschrieben ist und sich schon seit Jahrzehnten bewährt.


> Die Einarbeitung, bis ich die Lösung schnell mal
> hinschreiben kann, tue ich mir erstmal nicht an. Dann kann ich ja auch
> VBA in Excel nehmen, da kenn ich mich schon aus.

Excel ist nicht schlecht. Für Formulare die auch noch ein bisschen 
rechnen und hübsch aussehen sollen, super. Sobald man aber VBA anwirft, 
sollte man darüber nachdenken, ob Excel noch das richtige Vehikel ist.


> Man kann das ja halbwegs lesen was da passiert. Ist das so richtig?:
> - Def definiert die Funktion

Exakt.

> - X=arange und Y=f(x...) füllt die Testdaten

Genau. arange(0, 5, 0.2) erzeugt ein Array mit den Werten 0, 0.2, 0.4 
etc.

Und dann wird die Funktion 'f' mit dem Array aus den X-Werten aufgerufen 
(und den Parametern). Das '@vectorize' bei der Funktionsdefinition sorgt 
dafür, dass 'f' als ersten Parameter ein Array verwenden kann und für 
jeden Wert im Array durchlaufen wird.


> - curve_fit optimiert die Parameter

Richtig. curve_fit bekommt die Funktion für die die Parameter gesucht 
werden sollen, ein Array mit den X-Werten, ein Array mit den dazu 
passenden Y-Werten. Zusätzlich benötigt curve_fit noch ein Array mit der 
ersten "Schätzung" für die zu suchenden Parameter. Hier habe ich einfach 
'ones(4)' genommen, das wiederum ein Array bestehend aus vier Einsen 
erzeugt.


> Es müsste dann das herauskommen, was in y=f(x...) angegeben ist

curve_fit() sucht die Parameter a0 bis a3 und gibt ein Array mit den 
Parametern zurück (und noch einigen anderen Werten die uns hier nicht 
interessieren).


> Aber leider kostet das die Einarbeitung. Wenn ich ständig
> unterschiedliche Probleme lösen muss, würde sich das lohnen. Andenfalls
> fange ich wieder von vorne an.

Naja. Python + SciPy ist sehr mächtig. Man lernt es nur einmal, und 
kann damit einen haufen Kram berechnen, analysieren etc.


> Und dann müsste ich noch Gnuplot, Splines, Simulink, ....

Gnuplot brauchst Du nicht. Plotting ist in SciPy integriert und malt 
viel schönere Diagramme. Splines kannst Du, wenn Du willst, natürlich 
auch mit SciPy rechnen.

Das ist ja das schöne an Python + SciPy: Ein Schweizer Taschenmesser auf 
Steroide. Heute einfache Polynome oder ein curve_fit. Morgen willst Du 
vielleicht Tschebyscheff-Polynome berechnen. Übermorgen Daten 
statistisch untersuchen und nächste Woche Filtern designen.

von Possetitjel (Gast)


Lesenswert?

Mathelehrling schrieb:

> Sobald man aber VBA anwirft, sollte man darüber nachdenken,
> ob Excel noch das richtige Vehikel ist.

Also doch Missionierung.

Ein Einäugiger missioniert den anderen, doch mal das andere
Auge zu benutzen.

Naja.

von Schlauberger (Gast)


Lesenswert?

Possetitjel schrieb:
> Mathelehrling schrieb:
>
>> Sobald man aber VBA anwirft, sollte man darüber nachdenken,
>> ob Excel noch das richtige Vehikel ist.
>
> Also doch Missionierung.
>
> Ein Einäugiger missioniert den anderen, doch mal das andere
> Auge zu benutzen.
>
> Naja.

Nee das sehe ich ganz und gar nicht so. Der Lehrling hat da Recht, 
warum? Ganz einfach: Eine Tabellenkalkulation (es gibt durchaus andere, 
auch freie Produkte, die das gleiche können wie der genannte MARKENNAME) 
hat da seine Vorteile, wenn es mal eben schnell gehen soll/muss. 
Spätestens wenn man mit VBA anfängt oder anfangen muss, ist es mit 
schnell und einfach ganz schnell vorbei. Und VBA ist für mathematische 
Aufgabenstellungen sicher nicht optimal geeignet. Von daher sehe ich die 
Aussage des Lehrlings nicht als Missionierer sondern als jemanden, der 
was von der Sache versteht.

von arne (Gast)


Lesenswert?

Mathelehrling schrieb:
> from numpy import *
> from scipy import *
> from scipy.optimize import curve_fit
>
> @vectorize
> def f(x, a0, a1, a2, a3):
>     if x > 4:
>         return a0 + a1*e**(x-2) + a2*e**(-x) + a3*(x-4)**2
>     else:
>         return a0 + a1*e**(x-2) + a2*e**(-x)
>
> x = arange(0, 5, 0.2)
> y = f(x, 5, 0.5, 5, -20)
>
> popt, pcov = curve_fit(f, x, y, ones(4))
>
> print(popt)

Nur mal so zum Verständnis: die Funktion f ist eine frei erfundene 
Funktion, die keinen Zusammenhang hat zu dem Original-Post Polygon?

Denn ich bin hier etwas ratlos.

von Sven B. (scummos)


Lesenswert?

Das zitierte ist auch nicht gerade numpy-Code, den ich als Referenz 
empfehlen würde (das @vectorize ist völlig unsinnig, stattdessen np.exp 
benutzen, und from numpy import * ist auch Murks). Schau dich lieber 
woanders um, wenn du ein Beispiel suchst.

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.