PolynomMaker - Funktion für nichtlineare Bauelemente finden

(Firma: Bastler aus Mönchengladbach) Persönliche Seite #2925507
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.
Angehängte Dateien:
(Firma: Bastler aus Mönchengladbach) Persönliche Seite #3721160
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.
(Firma: Bastler aus Mönchengladbach) Persönliche Seite #3721208
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"
(Firma: mechapro GmbH) Persönliche Seite #3815738
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
(Firma: Bastler aus Mönchengladbach) Persönliche Seite #3815761
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?
(Firma: Bastler aus Mönchengladbach) Persönliche Seite #3816265
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.
Angehängte Dateien:
(Firma: Bastler aus Mönchengladbach) Persönliche Seite #3816502
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/
Angehängte Dateien:
Gast #5687570
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.
#5687654
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
>
Gast #5687730
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.
#5688133
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
Angehängte Dateien:
Gast #5691416
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.
Gast #5777537
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()
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren