Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Frage zu einer Polynominterpolation

  1. #1
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich will eine recht komplizierte Funktion durch ein Polynom 2. Grades ersetzen. Dazu setze ich Numpy ein, wie z.B.

    polynom=np.polyfit(x,y,2)
    funktion = np.poly1d(polynom)

    werte = funktion(x)

    wobei x = [0,1,2,3,4....]

    Das klappt auch gut. Der max. Fehler ist kleiner als 2% und das reicht für mich. Nun habe ich aber ein paar Parameter, die vom Benutzer geändert werden können und da es sich um eine SPS handelt, kann ich da nicht polyfit laufen lassem. Daher ich müsste die Form des Polynoms

    a+bx+cx^2

    nach

    a'( parameter) + b'(parameter) x + c'(parameter) x^2

    anpassen. Nun hab ich gleich 4 Parameter. Wie kann man da vorgehen? a, b und c sind dann funktionen von meinen Parametern.
    Geändert von drfunfrock (29.10.2013 um 16:00 Uhr)
    Zitieren Zitieren Frage zu einer Polynominterpolation  

  2. #2
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Kennst du die Originalfunktion bzw. wie sie von den Parametern abhängt?

  3. #3
    drfunfrock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Ja, aber die ist nicht stetig und hat nur das Aussehen einer Art Wurzelfunktion. Ich beziehe mich auf den Thread mit der Winch. Die ist voll und wird abgerollt. Gesucht die Funktion die mir die Länge in Abhängigkeit vom Enkoder gibt. Per Iteration habe ich dann die abgespulte Länge in Abhängigkeit von dem
    Enkoderzähler herausbekommen.

    Dabei kommen dann 2 Listen heraus, die X-Achse mit den Enkoderwerten [0,1,2,3,4,5....] und die Y-Achse mit den Längen [0,0.223 ....]Man hat also immer das komplette Ergebnis im Speicher.

    Analytisch hab ich das nicht fertiggebracht, weil der das Behandeln einer Startlage, die nicht voll ist, Probleme bereitet. Egal, das Ganze scheint mit einem Polynom 2. Grades hervorragend angenähert werden zu können, weil bei höheren Graden, die Koeffizienten sehr klein sind. Wenn du auf die Gleichung im vorherigen Thread schaust, die die Anzahl der Lagen in Abhängigkeit von der Kabellange herausbekommt, dann wird meine Vermutung bestätigt. Da kommen max. Wurzeln vor.

    Ich habe mir überlegt, einfach 2 verschiedene Polynome für jeweils einen Parameter zu generieren, dh. ich ändere den um den Faktor 2 oder 10. Damit sollte alles zu machen sein. Ich bekomme dann 8 Gleichungen für 4 bekannte Parameter. Sollte einer unter einer Wurzel sehen, bekomme ich Wurzel(2) oder 1/Wurzel(2) im Verhältnis, der Polynomkoeffizienten dabei heraus usw.

    Ich mach das zum ersten Mal. Das ist richtig spannend, weil das Ergebnis dann so richtig einfach wird. Die ganze Komplexität in unserer Progammierung löst sich in Nichts auf.

    Was mich faziniert, wie einfach es mit Numpy war eine Polynominterpolation für ein vorhandenes Funktionsergebnis zu finden.

    Parameter a' ist leicht zu finden, weil es einfach der Offset ist und der ist 0, weil das Kabel bei 0 startet.
    Parameter b' ist einfach, weil es grösster-umfang*pi*encoder/encoder_pulse_per_rev. Dh. es ist die Tangente (Änderung der Länge per Enkoderpuls). Es ist die grösstmögliche Änderung, weil mit jeder Lage, die abgerollt ist, der Umfang kleiner wird.
    Fehlt noch c'
    Geändert von drfunfrock (29.10.2013 um 19:46 Uhr)

  4. #4
    drfunfrock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Nach ein paar Problemen, hab ich die Polynomkoeffizienten gefunden. Zuerst beschränkte sich die Genauigkeit auf einen Fehler von 3%. Erst als ich anfing, die Konstanten meines Koeffizienten b, leicht zu varieren, kam ich auf einen max. Fehler von 0.1%. Damit lässt sich eine Trommel mit Draht, Seil etc. mathematisch ausreichend genau beschreiben, ohne auf eine Iteration zugreifen zu müssen. Ich kann Polynominterpolation nur weiterempfehlen. Wer feste Trommelparameter hat, der braucht nur eine Näherung per nummerischen Verfahren.

  5. #5
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.540
    Danke
    1.154
    Erhielt 1.254 Danke für 983 Beiträge

    Standard

    Ich finde die mathematische Problembeschreibung / Lösung sehr interessant.
    Was mir jetzt fehlt, ist der Bezug zur konkreten Aufgabe. Vielleicht könntest du hierzu ein paar Sätze schreiben.
    Wir haben auch schon einige Wickler und ähnliches gemacht und dabei nie so tief in die Mathematik einsteigen müssen.
    Auch wenn sich 0,1% im ersten Moment gut anhört, wirst du - meiner Meinung nach - trotzdem um die üblichen "Randthemen" wie Tänzer, Schlaufenregelung, Drehzahl-Drehmomentregelung nicht herumkommen.

    Gruß
    Dieter

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Wobei ich nicht verstehe, wenn es hier um das Problem mit der Bestimmung der Lage aus der Länge geht, du hier eine Näherung verwenden willst, und nicht einfach die analytische Lösung in der SPS umsetzt.

  7. #7
    drfunfrock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Der bezug ist der Thread Umfang der Kabelwicklung auf Kabeltrommel berechnen?

    Wenn du eine Trommel abwickelst, dann ergibts das eine nicht stetige Funktion der Länge des Kabels, die auch noch iteriert werden muss. Jede Lage produziert eine Gerade, die mit den inneren Lagen flacher wird. An den Übergängen von Lage zu Lage, ist die Funktion nicht differenzierbar. Ich brauche nämlich, die Länge in Abhängigkeit vom Enkoderzähler, der auch als Winkel interpretiert werden kann und dann die Länge des Kabels und dessen Geschwindigkeit in m/s und das für eine Trommel, die abgewickelt werden soll.

    Länge(Enkoder)

    Damit könnte man vor und zurückrechnen, wenn die Funktion differenzierbar wäre. Das ist wichtig, um z.B. die Geschwindigkeit des Kabels zu ermitteln. Eine nichtstetige Funktion führt zu Jitter. Da wurde die Idee geboren, eine Aproximation zu nehmen. Die Entscheidung für ein Polynom fiel, weil der Thread für die Anzahl der Lagen in Abhängigkeit von der Kabellänge ergab, dass dort max. quadratische Funktionen zu finden sind.

    Aproximation:

    Code:
    Länge(x) = a + bx + cx^2  
    
    X entspricht dem Enkoderzähler
    Bisher hatte ich nur eine Lösung für die Anzahl der Lagen. Also habe ich eine Python-Funktion geschrieben, die mir die Iteration macht, denn eine analytische Lösung hab ich nicht gefunden. Python zusammen mit Numpy ist Matlab-ähnlich. Dh. alles wird in Listen verwaltet. Beispiel:

    Code:
    x = [0 1 2 3 ]          # X Werte 
    y = [t*t for t in x]    # entspricht dem quadrat von x [0 1 4 9]
    plot(x,y)
    In meinem Falle habe ich dann die Funktion des Aufrollens eines Kabels iteriert. Abrollen ist nicht so einfach. Das gibt dann 2 Listen mit x und y-Achse

    x=[0 1 2 3 4 .... Enkoderendwert]
    y = [0 3.14 6.28 .... usw.]

    Die Y-Wert sind noch vom aufrollen, müssen also umgedreht (gespiegelt) werden und dann in Relation zum Kabelende gesetzt werden. Daher das Kabelende vom Aufrollen soll 0 beim Abrollen sein.

    y = [Kabellänge - t for t in y[::-1]]

    Mit y[::1] bekomme ich die gespiegelte Liste.

    Das ganze geplottet mit plot(x,y) ergibt dann eine Kurve aus vielen Geraden, die an die Wurzelfunktion erinnert. Damit hatte ich x und y für die Polyfit-Funktion von Numpy, die mir eine Liste (was sonst?) mit Polynomkoeffizenten numerisch errechnet

    Code:
    koeffizienten = polyfit(x,y,2) # 2. Ordnung. 
    
    Z.B. 
    [-1, 2, 0] was [c, b, a] entspricht für das Polynom a+bx+cx^2
    Du kannst auch eine höhere Ordnung probieren, aber die Koeffizienten sind dann wesentlich kleiner als 1E-3. Das Polynom kann man dann gleich ausprobieren mit

    Code:
    y2 = poly1d(x,koeffizienten)
    plot(x,y2)
    Die Fehlerfunktion wird einfach mit

    Code:
    error =  sqrt(((y2-y))/y)**2)*100.
    plot(x,error)
    geplottet.

    Jetzt hatte ich den Fehler und die numerische Lösung, die mit einem max Fehler am Ende <0.1% sehr genau ist.

    Wenn man jetzt die Winchparameter einzeln modifiziert, hat dass Konsequenzen für die Koeffizienten. a ist 0, weil Länge(0) = 0 ist.

    Wenn ich die Breite der Trommel um den Faktor 2 modifiziere, dann wird c um den Faktor 1 / 4 kleiner. Beipiel:

    Code:
    faktoren = koeffizienten_vor_modifikation / koeffizienten_nach_modifikation
    Daher

    c ~1 / b^2

    Das mache ich so mit allen Parametern und multipliziere die dann nur noch.

    Beim Koeffizienten b hab ich das einfacher gemacht, weil ich dort, den

    Code:
    b = max_Durchmesser*pi*enkoder/enkoderauflöung
    als Geschwindigkeit interpretiert habe. Dieser Koeffizient, war leider mal zu hoch, mal zu niedrig, so dass der Fehler bis auf 3% stieg. Es gab in der Gleichung für b eine Subtraktion, die ich dann leicht modifiziert habe.

    Als Resultat bin ich nun in der Lage mit m/s zu rechnen, ohne dass ich Jitter zusätzlich einbringe. Ich kann vom Enkoderzähler auf die Länge schliesse und umgekehrt.
    Geändert von drfunfrock (02.11.2013 um 12:36 Uhr)

  8. #8
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.540
    Danke
    1.154
    Erhielt 1.254 Danke für 983 Beiträge

    Standard

    Ok soweit verstanden. Du brauchst die Restlänge abhängig von der Geberpos.

    Wir "umgehen" das Problem ganz einfach dadurch, dass wir die Länge mit einem Geber direkt an den Abwickelrollen messen.
    Die 0,1%-Genauigkeit würden bei uns nicht reichen.

    Gruß
    Dieter

  9. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Demnach ist die Aufgabenstellung in dem anderen Thread aber eigentlich folgende:

    Wie kann ich die Länge bei gegebener Umdrehungs-/ bzw. Windungszahl bestimmen?

    Und nicht:
    Wie kann ich die Anzahl an Lagen bei gegebener Länge bestimmen?

  10. #10
    drfunfrock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Blockmove Beitrag anzeigen
    Ok soweit verstanden. Du brauchst die Restlänge abhängig von der Geberpos.

    Wir "umgehen" das Problem ganz einfach dadurch, dass wir die Länge mit einem Geber direkt an den Abwickelrollen messen.
    Die 0,1%-Genauigkeit würden bei uns nicht reichen.

    Gruß
    Dieter
    Wir haben bewusst auf jeglichen Sensor diesbezüglich erzichtet. Was ich erreichen will, ist eine halbwegs stabile Lageregelung, weil zur Zeit die Position jittert.

Ähnliche Themen

  1. Frage zu einer AWL Anweisung
    Von Bubi im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 27.11.2012, 11:03
  2. Frage zu einer Logo Steuerung
    Von JohnCarrier im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 01.06.2012, 19:07
  3. Frage zu Ausgangsvariabeln einer FC in AWL
    Von Rodewijn im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 28.10.2010, 07:48
  4. Frage zu einer Anweisung...
    Von Blade81 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.09.2010, 15:55
  5. Eine Frage zu einer AWL
    Von pinolino im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 03.04.2009, 12:33

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •