Forum: Projekte & Code PolynomMaker - Funktion für nichtlineare Bauelemente finden


von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe mir heute noch ein Tool erstellt und möchte es euch nicht 
vorenthalten, vieleicht kann es der ein oder andere gebrauchen bei 
Basteleien oder der Arbeit.

Anwendung: Für nichtlineare Bauteile wie NTC's usw. oder sonstige 
allgemeine Kurvenverläufe (auch z.B. Motorkennlinien) ist es meist 
schwierig eine passende mathematische Funktion für die Implementation in 
Microprozessoren zu finden. Meist behilft man sich mit Wertetabellen, 
was aber oft umständlich ist.
Mein Tool erstellt aus mehr oder weniger Stützstellen (die man gemessen 
hat oder kennt) eine passende Funktion mit korrekten Koeffizienten. 
Diese lässt sich nun anstelle der Wertetabellen in das MC-Programm 
übertragen.
Es kann aus 6 Funktionsmöglichkeiten ausgewählt werden, wobei die meist 
am besten passende die Polynom-Funktion mit wählbarer Ordnung ist.
Die Grafik ist mit der Maus verschiebbar (Achsen laufen mit).
Das Programm ist portabel und benötigt keine Installationsroutinen.

Viel Spass damit.

: Verschoben durch User
von Karl H. (kbuchegg)


Lesenswert?

Damit dieses Tool nicht in den Tiefen des Forums verschwindet, 
verschiebe ich das mal in die Codesammlung

von micha (Gast)


Lesenswert?

Sehr schönes Tool, Danke!
Mit online-access kann man mal http://zunzun.com/ ausprobieren; dabei 
werden die Daten gegen eine riesige Liste von Funktionen gefittet und 
die besten angezeigt.

von Dennis (Gast)


Lesenswert?

Geniales Tool, es nimmt einem gut Arbeit ab beim "nachbauen" von 
Kennlinien.

@Albert: Vielen Dank dafür!

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

@Dennis

Freut mich, dass Dir mein Tool nützlich ist :)

: Bearbeitet durch User
von ... (Gast)


Lesenswert?

Eine Spline-Funktion oder ein Polynom n-ter Ordnung konnte man
schon mit den Matrixfunktionen eines Sharp PC1403H im letzten
Jahrtausend ausrechnen.

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

... schrieb:
> Eine Spline-Funktion oder ein Polynom n-ter Ordnung konnte man
> schon mit den Matrixfunktionen eines Sharp PC1403H im letzten
> Jahrtausend ausrechnen.

Du bist ja ein ganz Pfiffiger!
Ob das dann auch ein Hobbybastler könnte bleibt eher dahin gestellt.
Und genau für diese Klientel ist die Software gedacht.
So Schlaumeier wie Du packen da natürlich ihre teuer erworbenen Mathe 
Kenntnisse und den alten Sharp Rechner oder MatLab aus.

: Bearbeitet durch User
von Gibts N. (schneeblau)


Lesenswert?

Kannst du die Ordnung der möglichen Polynome erhöhen?

Vielleicht in den Optionen, ich würde gerne auch mal extreme Grenzen 
austesten und meinen Rechner ordentlich quälen;) Am besten nach oben 
keine Grenze und nach der Berechnung gleich noch die Bearbeitungszeit 
einblenden..:)

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

Gibts Ne schrieb:
> Kannst du die Ordnung der möglichen Polynome erhöhen?

Ja, das geht alles.
Allerdings nur um des Interesses an Rechenzeiten wegen eher nicht. Das 
Mehr an Kommastellen im Ergebnis bringt in der Praxis mit MC's wohl 
wenig und lohnt den Aufwand für mich nicht.

Und zur Zeit bin ich mit meinem anderen Projekt hier beschäftigt: 
Beitrag "Projekt: Virtuelle Instrumente an serielle Schnittstelle"

: Bearbeitet durch User
von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Ich habe das Programm eben mal ausprobiert, halte aber die Ergebnisse 
nicht für plausibel. Für meine Testdaten sind bei der 
Polynom-Approximation immer die höchsten 1-2 Koeffizienten Null. 
Angeblich erreiche ich mit einem Polynom 5. Ordnung eine Anpassung von 
1.0000. Wenn ich damit in Excel auf die Ausgangsdaten zurück rechnen 
will läuft die Funktion aber deutlich weg.

Hier mal meine Testdaten:
X     Y
 0    0
 0,4  0,72
 1    1,74
 4    5,68
10   11,78
20   21,07
30   30,0
40   38,93
50   48,22
56   54,32
59   58,26
59,6 59,28
60   60,0

Mit freundlichen Grüßen
Thorsten Ostermann

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Lesenswert?

Hallo Thorsten,
das liegt wahrscheinlich daran, dass ich die Nachkommastellen der 
Koeffizienten auf 3 Stellen begrenzt habe, damit die Anzeige nicht so 
viel Platz einnimmt. Das war wohl ein Fehler und schadet offensihtlich 
der Genauigkeit :)
Ich werde mir das mal in den nächsten Tagen in Ruhe anschauen.
Gruss
Ulrich Albert

P.S.
Ich habe gesehen, dass Du dich hier auch oft mit Schrittmotoren befasst. 
Ich bastele da auch gerade rum und würde gerne Deine Meinung hierzu 
hören:
Beitrag "Stepper Motor / CNC Windows-Frontend für GRBL mit ATMega 328"
Ist das sinnig oder reichen die verfügbaren Tools aus?

von ich (Gast)


Lesenswert?

Wenn du den csv Imnport noch realisierst wird das tool tauglich..bis 
dahin muss man weiter scilab nutzen.

von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Angehängte Dateien:

Lesenswert?

Anbei neue Version PolynomMaker 0.6

Change Log
----------
Koeffizienten werden jetzt mit 6 anstatt 3 Nachkommastellen angezeigt.


ich schrieb:
> Wenn du den csv Imnport noch realisierst wird das tool tauglich..bis
> dahin muss man weiter scilab nutzen.

csv/txt - Import werde ich demnächst bei Gelegenheit hinzufügen.

: Bearbeitet durch User
von Albert M. (Firma: Bastler aus Mönchengladbach) (albertm) Benutzerseite


Angehängte Dateien:

Lesenswert?

Anbei neue Version PolynomMaker 0.7

Change Log
----------

csv / txt - File-Import implementiert (Semikolon als Separator).

Koeffizienten jetzt mit 7 anstatt 6 Nachkommastellen.

Homepage:
http://www.serialcominstruments.com/

: Bearbeitet durch User
von Michael W. (Gast)


Lesenswert?

Gehtes auch als Fi mit einem höheren Polynomgrad als 8?

von gys (Gast)


Lesenswert?

Ich fände es nicht schlecht, wenn man Grafiken als Hintergrund laden 
kann, also eine Kurve aus einem Datenblatt. Um dann eine neue Kurve 
drüber zu legen.

von Michael W. (Gast)


Lesenswert?

Gute Idee. Dann aber bitte mit hohem Zoom und korrigierbaren Punkten.

von Kolja L. (kolja82)


Lesenswert?

gys schrieb:
> Ich fände es nicht schlecht, wenn man Grafiken als Hintergrund laden
> kann, also eine Kurve aus einem Datenblatt. Um dann eine neue Kurve
> drüber zu legen.

Fänd ich auch sehr gut!

von Wolfgang (Gast)


Lesenswert?

Markus W. schrieb:
> Gehtes auch als Fi mit einem höheren Polynomgrad als 8?

Wenn ein Polynom 8ten Grades nicht reicht, ist ein Polynom als Modell 
für den Zusammenhang nicht geeignet.

von Oliver K. (oliver_k480)



Lesenswert?

Die ersten drei bis vier Werte sind annähernd genau, dann läuft das 
Ergebnis extrem weg. Woran liegt das? An den noch zu geringen 
Nachkommastellen?

von Egon D. (Gast)


Lesenswert?

Oliver K. schrieb:

> Die ersten drei bis vier Werte sind annähernd genau,
> dann läuft das Ergebnis extrem weg. Woran liegt das?
> An den noch zu geringen Nachkommastellen?

Das ist gut möglich.

Zwar hat k5 sieben Nachkommastellen, aber nur eine
(EINE!) geltende Ziffer. Das ist ziemlich sicher zu
wenig.

Außerdem ist es in der Regel günstig, Polynomen nach
dem HORNER-Schema auszuwerten:

y = ((((k5*x+k4)*x+k3)*x+k2)*x+k1)*x+k0

Man vermeidet damit extreme Zahlen, wie sie z.B. bei
k5*x^5 auftreten können.

von Helmut S. (helmuts)


Lesenswert?

Der Polynommaker gibt zu wenig Stellen aus. Du benötigts mindestens 2 
Stellen mehr für die Koeffizienten. Damit ist eine Berechnung mit 
"double" Pflicht.

Mach das einfach mit dem kostenlosen Matheprogramm Octave.

>> format long

>> x=[0,10,20,30,40,50,60,70,80,90]
x =    0   10   20   30   40   50   60   70   80   90

>> y=[0,-4,-10,-19,-29,-37,-44,-53,-70,-102]
y =     0    -4   -10   -19   -29   -37   -44   -53   -70  -102

>> p=polyfit(x,y,5)
p =
 Columns 1 through 4:
  -6.923076923076858e-08   8.088578088577917e-06  -6.631701631700006e-05 
-2.012820512820581e-02
 Columns 5 and 6:
  -1.388764568764448e-01  -1.300699300699920e-01

>> z=polyval(p,x)
z =
 Columns 1 through 4:
  -1.300699300699920e-01  -3.524009324009318e+00  -1.041678321678320e+01 
-1.933286713286713e+01
 Columns 5 through 8:
  -2.851701631701631e+01  -3.676503496503496e+01  -4.425454545454544e+01 
-5.337575757575757e+01
 Columns 9 and 10:
  -6.956223776223779e+01  -1.021216783216783e+02

>> plot(x,y)
>> hold on
>> plot(x,z)
>> grid
>

: Bearbeitet durch User
von Egon D. (Gast)


Lesenswert?

Helmut S. schrieb:

> Der Polynommaker gibt zu wenig Stellen aus. Du
> benötigts mindestens 2 Stellen mehr für die
> Koeffizienten.

Ja.


> Damit ist eine Berechnung mit "double" Pflicht.

Nein. 0.000000123456 ist problemlos mit einfacher
Genauigkeit darstellbar. Das ist ja gerade der Witz
an Fließkommazahlen, dass die Zahl der Nachkommastellen
und die Zahl der geltenden Ziffern in Grenzen
voneinander unabhängig sind.

von Oliver K. (oliver_k480)


Angehängte Dateien:

Lesenswert?

Besten Dank für die zahl- und hilfreichen Antworten!
Habe gestern Abend noch eine Alternative im Netz gefunden, die mir 
genauere Ergebnisse lieferte:
https://arachnoid.com/polysolve/

0  0
10  -4
20  -10
30  -19
40  -29
50  -37
60  -44
70  -53
80  -70
90  -102

Mode: normal x,y analysis
Polynomial degree 5, 10 x,y data pairs.
Correlation coefficient (r^2) = 0.9998663304441232
Standard error = 0.3919350119765473
Coefficient output form: simple list:

  -1.3006993007066064e-001
  -1.3887645687550687e-001
  -2.0128205128297362e-002
  -6.6317016314043197e-005
   8.0885780885395550e-006
  -6.9230769230595802e-008

von Mario H. (rf-messkopf) Benutzerseite


Lesenswert?

Helmut S. schrieb:
> Mach das einfach mit dem kostenlosen Matheprogramm Octave.

Eine weitere und sehr mächtige Alternative ist die fit-Funktion von 
gnuplot. Damit kann man bis zu zwölf Parameter in beliebigen 
Funktionsausdrücken an gegebene Daten fitten. Mit ein paar Workarounds 
kann man damit sogar komplexwertige Funktionen fitten. Die fit-Funktion 
beruht auf dem Marquardt-Levenberg-Algorithmus. Plotten des Ergebnisses 
geht mit gnuplot natürlich auch.

von Oliver Kraus (Gast)


Lesenswert?

Dankeschön

von Joachim B. (jar)


Lesenswert?

Albert M. schrieb:
> Ich habe mir heute noch ein Tool erstellt und möchte es euch nicht
> vorenthalten

klappt das auch mit Lottozahlen?

von Michael W. (Gast)


Lesenswert?

Oliver K. schrieb:
> Die ersten drei bis vier Werte sind annähernd genau, dann läuft das
> Ergebnis extrem weg.

Vermutlich. Mit Excel muss man aufpassen!

von Shadow233 (Gast)


Angehängte Dateien:

Lesenswert?

Hier ne Lösung mit python3, numpy und matplotlib

Resultat vorweg:

Das Polynom:

-6.923e-08 x**5 + 8.089e-06 x**4 - 6.632e-05 x**3 - 0.02013 x**2 - 
0.1389 x - 0.1301

Die Koeffizienten mit mehr Nachkommastellen:
[-6.92307692e-08  8.08857809e-06 -6.63170163e-05 -2.01282051e-02
 -1.38876457e-01 -1.30069930e-01]

1
#!/usr/bin/env python3
2
# Bsp. von hier:
3
# https://scipy-lectures.org/intro/numpy/auto_examples/plot_polyfit.html
4
import numpy as np
5
import matplotlib.pyplot as plt
6
7
#--------------
8
# "User Input":
9
x=[0,10,20,30,40,50,60,70,80,90]
10
y=[0,-4,-10,-19,-29,-37,-44,-53,-70,-102]
11
PolyGrad=5
12
13
PlottVon=0
14
PlottBis=100
15
PlottAnzahlPunkte=200 # "Plott-Auflösung"
16
#--------------
17
18
p = np.poly1d(np.polyfit(x, y, PolyGrad))
19
print("Das Polynom:\n{}\n".format(p))
20
print("Die Koeffizienten mit mehr Nachkommastellen:\n{}".format(np.polyfit(x, y, PolyGrad)))
21
22
t = np.linspace(PlottVon, PlottBis, PlottAnzahlPunkte)
23
24
fig, ax = plt.subplots()
25
ax.plot(x, y, 'o', t, p(t), '-')
26
27
ax.set(xlabel='x', ylabel='f(x)',
28
       title='numpy.polyfit, Grad={}'.format(PolyGrad))
29
ax.grid()
30
31
#fig.savefig("poly.png")
32
plt.show()

von Michael W. (Gast)


Lesenswert?

Interessant wird es, wenn die Polynomgradzahl grösser wird, als die 
Hälfte der Punktezahl.

von Jonathan Schilling (Gast)


Lesenswert?

Wenn der Grad des Polynoms per default größer ist als die Anzahl der 
Datenpunkte, hat man entweder etwas falsch gemacht oder nimmt Occam's 
Razor, um den optimalen Grad des Polynoms zu bestimmen.
Näheres dazu z.B. in der Thesis von David MacKay:
www.inference.org.uk/mackay/thesis.pdf

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.