Hallo, ich schreibe derzeit an meiner Diplomarbeit. Ich stehe momentan vor folgendem Problem. Als Zwischenergebnis habe ich folgende z-Übertragungsfunktion mit der Methode der kleinsten Quadrate berechnet: B(z^-1) b_1*z^-1 + b_2*z^-2 + ... + b_m*z^-m G(z^-1) = -------- = ----------------------------------------------------- ------ A(z^-1) 1 + a_1*z^-1 + a_2*z^-2 + ... + a_m*z^-m Wie zu sehen ist, ist b_0=0. Die Modellordnung ist m=10. Die Parameter sind: a1 = −2, 3264; b1 = 1, 1903 • 10^8 a2 = 0, 8816; b2 = −3, 9431 • 10^8 a3 = 0, 8649; b3 = 3, 7566 • 10^8 a4 = 0, 0771; b4 = 3, 4853 • 10^6 a5 = −0, 3673; b5 = −9, 3205 • 10^7 a6 = −0, 2822; b6 = −5, 2039 • 10^7 a7 = 0, 0271; b7 = 7, 3993 • 10^6 a8 = 0, 1296; b8 = 3, 6554 • 10^7 a9 = −0, 0047; b9 = 1, 1522 • 10^7 a10 = 0, 0003; b10 = −1, 4101 • 10^7 Die Funktion ist stabil und auch alle Nullstellen liegen innerhalb des Einheitskreises. Ich benötige aber das inverse Verhalten. Die oben genannte Übertragungsfunktion lässt sich natürlich invertieren. Allerdings kann man die invertierte Übertragungsfunktion nicht nutzen. Der Versuch das Antwortsignal mit der lsim-function in Matlab zu ermitteln lieferte folgende Fehlermeldung: ??? Error using ==> lti.lsim at 117 Error using ==> ltipack.ltidata.utCheckComputability at 27 Cannot simulate the time response of LTI models with more zeros than poles. Die Ordnung des Zählers der invertierten Übertragungsfunktion ist größer als die des Nenners, darum kann ich damit nichts anfangen (zudem ist dann das a0 der inversen Übertragungsfunktion ungleich 1-> Kausalität verletzt). Ich habe versucht mittels Egalisation die inverse Übertragungsfunktion zu bilden. Dies führte aber nicht zum gewünschten Ergebnis. Außerdem habe ich mit der Matlab internen arx-function die Übertragungsfunktion berechnet (diese enthält b0). Wenn ich diese Funktion invertiere und das Antwortsignal simuliere, erhalte ich instabile Lösungen. Hat irgendjemand eine Idee, wie ich die inverse Übertragungsfunktion bilden bzw. approximieren kann? Vielen Dank im Voraus Christoph
Hallo, deine ÜF ist leider nicht kausal invertierbar, da deren Nullstellen nicht alle im Einheitskreis liegen. Ich habe dazu die Nullstellen samt Beträgen asugerechnet: {{-0.545861 - 0.21549 I , 0.586856}, {-0.545861 + 0.21549 I , 0.586856}, {-0.230021 - 0.585955 I , 0.629486}, {-0.230021 + 0.585955 I , 0.629486}, { 0.892652 - 0.0313572 I, 0.893203}, { 0.892652 + 0.0313572 I, 0.893203}, { 1.00002 - 0.0908961 I, 1.00415 }, { 1.00002 + 0.0908961 I, 1.00415 }, { 1.07911 , 1.07911 }} Die letzten drei liegen offensichtlich außerhalb des Einheitskreises, wenn auch nur marginal. Damit lässt sich die ÜF nicht kausal invertieren. Der Vollständigkeit halber hier noch die Polstellen samt Beträgen: {{-0.558072 - 0.225462 I , 0.601895 }, {-0.558072 + 0.225462 I , 0.601895 }, {-0.233345 - 0.592234 I , 0.636546 }, {-0.233345 + 0.592234 I , 0.636546 }, { 0.0181033 - 0.0443178 I, 0.0478727}, { 0.0181033 + 0.0443178 I, 0.0478727}, { 0.954623 - 0.118144 I , 0.961906 }, { 0.954623 + 0.118144 I , 0.961906 }, { 0.963782 , 0.963782 }, { 1. , 1. }} Der Pol genau auf dem Einheitskreis erscheint mir bedenklich. Gruß RJdaMoD
Hallo RJdaMoD, vielen Dank für deine Antwort. Meine Ergebnisse sind geringfügig anders, da ich mit den ungerundeten Werten gerechnet habe. Entschuldige, ich hätte gleich eine Datei anhängen sollen. Ich hole das an dieser Stelle nach. Die Nullstellen liegen ganz nah am Einheitskreis (innerhalb), allerdings nicht darauf. Ich müsste meine inverse Übertragungsfunktion irgendwie annähern, damit ich diese implementieren kann. Hat jemand schon mal so etwas gemacht? In der mat-Datei sind die benötigten Daten. Einfach m-file starten... Grüße Christoph
Kannst du die .mat-Datei irgendwie als Text-Datei bereitstellen? Ich arbeite momentan mit Mathematica und habe gerade keinen Konverter zur Hand. Gruß RJdaMoD
Ich habe alle Vektoren als csv-Dateien angehängt. Mir viel momentan keine bessere Lösung ein, aber du solltest sie auf jeden Fall öffnen können... Die zu invertierende Übertragungsfunktion G musst du aus Nenner_G und Zaehler_G zusammensetzen. P.s.: die inverse Übertragungsfunktion wäre dann: G_inv=Nenner_G/Zaehler_G, das war zumindest meine Herangehensweise... VG
Gut, damit kann ich arbeiten. Die Daten von Zähler und Nenner besitzen aber keine höhere Genauigkeit als die, die du bereits angegeben hast. Ich nehme an, dass du diese aus den anderen Daten berechnet hast, da du Regression erwähnt hast. Leider geht aus deiner m-Datei nicht hervor, wie du das gemacht hast. Noch etwas zu der Null im Zähler, also das erste Glied: Diese bewirkt eine Verzögerung des Eingangssignals um ein Sample, wodurch der inverse Filter ein Sample in die Zukunft schauen müsste, was natürlich nicht kausal ist. Du kannst dies aber einfach umgehen, indem du diese Null streichst und alle Glieder des Zählers nach links aufrückst. Dadurch wird lediglich die Gruppenlaufzeit um ein Sample verringert, der Frequenzgang bleibt unbeeinflusst. Wenn du dann das Problem mit der Genauigkeit der Nullstellen löst, solltest du die ÜF problemlos invertieren können. Gruß RJdaMoD
Das ist komisch, da ich genau Matlab-Werte direkt exportiert habe. Wie auch immer ich versuche erstmal deinen Tipp umzusetzen. Ähnliches habe ich auch schon gedacht, aber dann wieder veworfen, da ich dachte dass die Verschiebung (Totzeit) ein Problem bereitet. Wenn der Frequenzgang uunbeeinflusst bliebe, dann wäre das genau das was ich brauche... Wenn ich dich recht verstanden habe, sieht dann mein Zähler so aus: b_1+b_2*z^-1+b_3*z^-2+...+b_m*z^(m-1). Müsste ich dann den Zähler nicht mit z multiplizieren? Das man das so machen kann ist mir unbekannt. Aber das liegt wahrscheinlich daran, dass ich eigentlich aus einer Fachrrichtung komme... Ich werde erstmal in Ruhe versuchen deinen Tipp umzusetzen und mich nochmal melden. Recht vielen Dank erstmal.
oh ich korrigiere ich meinte: b_1+b_2*z^-1+b_3*z^-2+...+b_m*z^(-m+1).
Genau, durch Multiplikation mit z verschiebst du so gesehen nur das Ausgangssignal um ein Sample in die Vergangenheit, wodurch der Frequenzgang unbeeinflusst bleibt. Lediglich die Phase und die Gruppenlaufzeit ändern sich, letztere wird bei jeder Frequenz um eine Sample-Länge kleiner. Gruß RJdaMoD
Hallo, ich habe jetzt hin und her versucht auf eine Lösung zu kommen, allerdings vergeblich. Ist mir schon fast peinlich so ein einfaches Problem nicht in den Griff zu bekommen. Ich beschreibe kurz meinen Gedankengang: Ausgehend von der ursprünglichen Form: B(z^-1) b_1*z^-1 + b_2*z^-2 + ... + b_m*z^-m G(z^-1) = -------- =------------------------------------------, A(z^-1) 1 + a_1*z^-1 + a_2*z^-2 + ... + a_m*z^-m kann ich natürlich schreiben: B(z^-1) b_1 + b_2*z^-1 + ... + b_m*z^(-m+1) G(z^-1) = -------- = -------------------------------------------------------------- *z^-1 A(z^-1) 1 + a_1*z^-1 + a_2*z^-2 + ... + a_m*z^-m (ausklammern von z^-1). Das bedeutet die Totzeit meines Systems ist d=1. Ich muss die Übertragungsfunktion umformen, bevor ich sie invertiere, da ich sonst in die „Zukunft schauen“ müsste. Das ist mir soweit klar. Aber genau da liegt mein Problem. Zunächst wollte ich überprüfen, dass ich nach dem Umformen meiner ursprünglichen Übertragungsfunktion eine Übertragungsfunktion erhalte, die die gleiche Antwort auf meinen Systemeingang liefert. Du hast vorgeschlagen durch Multiplikation mit z das Ausgangssignal um ein Sample in die Vergangenheit zu verschieben. Natürlich muss ich die Übertragungsfunktion im Zähler und im Nenner mit z multiplizieren, so dass ich wie bereits geschrieben folgenden Zähler erhalte: b_1 + b_2*z^-1 + ... + b_m*z^(-m+1) Allerdings bereitet mir der Nenner Probleme. Meine z-transformierte Differenzengleichung lautet: Y(z) + a_1*(z^-1)*Y(z) + a_2*(z^-2)*Y(z) + ... + a_m*(z^-m)*Y(z)=[b_1 + b_2*(z^-1)*X(z) + ... + b_m*z^(-m+1) *X(z)]*(z^-1), Die Multiplikation dieser Gleichung mit z ergibt: Y(z)*z + a_1*Y(z) + a_2*(z^-1)*Y(z) + ... + a_m*(z^(-m+1)*Y(z)=b_1*X(z) + b_2*(z^-1)*X(z) + ... + b_m*(z^(-m+1))*X(z). Den Term Y(z)*z kann ich nicht so recht deuten. Ich habe versucht, diesen einfach wegzulassen, so dass mein Nenner folgende Form aufweist: A(z^-1)= a_1 + a_2*(z^-1) + ... + a_m*(z^(-m+1)) Einsetzen der Werte und teilen durch a_1 im Nenner ergibt folgenden Nenner ([a_1 + a_2*(z^-1) + ... + a_m*(z^(-m+1))]/ a_1): 1 - 0.379 z^-1 - 0.3718 z^-2 - 0.03315 z^-3 + 0.1579 z^-4 + 0.1213 z^-5 - 0.01165 z^-6 - 0.05573 z^-7 + 0.002 z^-8 - 0.0001475 z^-9 Diese Form hätte genauso viele Pol- wie Nullstellen und wäre invertierbar. Die ermittelte Übertragungsfunktion liefert aber nicht das gleiche Antwortsignal wie die ursprüngliche Ü-Funktion… Was habe ich falsch gemacht bzw. übersehen? VG
Wenn du sowohl Zähler als auch Nenner mit z multiplizierst, erweiterst du nur den Bruch, wodurch sich die ÜF überhaupt nicht ändert. Multiplikation des Zählers mit z ergibt das gewünschte Ergebnis, der Nenner bleibt unberührt. Oder anders: Einfach das ausgeklammerte z^-1 weglassen.
Einfach toll!! So einfach, so gut! Es hat funktioniert. Somit konnte ich meine Übertragungsfunktion problemlos invertieren. Ich möchte mich vielmals bei dir bedanken, dass du so schnell reagiert hast. Du hast mir sehr geholfen!!! Darf ich dich noch eine Kleinigkeit fragen bzw. kannst du mir einen Rat geben? Ich habe meine Übertragungsfunktion ermittelt, indem ich mein System mit einem Eingangssignal angeregt (Verfahrvorgang eines Antriebes mit hohem Ruck und hoher Beschleunigung) und den Ausgang gemessen habe (zugehörige Motorkraft). Mit der Methode der kleinsten Quadrate habe ich mir die Koeffizienten bestimmt. Somit habe ich eine Funktion gefunden mit der ich die entstehende Motorkraft gut prognostizieren kann. Die Motorkraft ist von nichtlinearen (sinusförmigen) Kraftschwankungen überlagert, die nicht prognostiziert werden können und auch nicht abgebildet werden müssen. Mit der inversen Übertragungsfunktion will ich aus einem vorgegebenen Kraftverlauf den zugehörigen Sollweg bestimmen. Natürlich kann ich nicht das genaue Sollbahnprofil erhalten, da der Eingang (Motorkraft) in mein inverses System (inverse Übertragungsfunktion), eben die genannten nichtlinearen Kraftschwankungen enthält. Leider unterscheidet sich mein rekonstruierter Weg stark vom eigentlich vorgegebenen Weg. Die Position spielt eine untergeordnete Rolle. Vielmehr sind die "Rundungen" (Beschleunigungs- bzw. Bremsphasen) im Profil entscheidend. Auf den ersten Blick sehen diese ähnlich aus. Wenn man aber genauer hinschaut, erkennt man, dass der Start der Bechleunigungsphasen zeitverzögert abgebildet wird (Siehe angehangenes Bildchen -> blau: Sollbahnprofil, rot: rekonstruierter Verlauf mit der inversen Übertragungsfunktion). Das ist sehr ungünstig, weil mich gerade das interessiert. Zudem ist ein wegdriften zu beobachten... Ich wollte dich nur fragen, ob du mir einen Rat geben könntest, was man vielleicht verbessern könnte? Könntest du dir vorstellen, dass mit dem Einsatz eines adaptiven Filters zur inversen Modellierung bessere Ergebnisse erzielt werden könnten. Oder hältst du das für aussichtslos? VG
Nun, du könntest dir zunächst die zweiten Ableitungen der beiden Kurven, also die Beschleunigungen, anschauen, um heraus zu finden, wo das Problem liegt. Zur Berechnung der zweiten Ableitung im diskreten Fall würde ich diese Formel nehmen:
Dabei ist
die Zeitdauer eines Samples. Dann könnte man feststellen, ob die Beschleunigungen wirklich zeitverschoben sind. Wenn dies der Fall ist, ist wohl die bei der Inversion unterschlagene Verzögerung schuld. Du müsstest dann bei der invertierten Simulation deinen inversen Filter ein Sample in die Zukunkt schauen lassen. Ich vermute aber, dass da noch ein Skalierungsproblem vorhanden ist. Bilde dazu bitte erst einmal die Beschleunigungskurven, dann lässt sich mehr sagen. Gruß RJdaMoD
Sehr konstruktiver Vorschlag. Das werde ich sofort versuchen... Danke
Habe die Beschleunigungen gebildet. Die rote Kurve entspricht dem rekonstuierten Vergleich zugehörig zum pdf der Sollbahnen. Die überlagerten Schwankungen sind nicht weiter verwunderlich, da mein Motorkraftsignal ebendiese enthält... Das werde ich nicht beseitigen können ohne meinen Ansatz ändern zu müssen. Wenn man genau hinschaut, erkennt man zusätzlich, dass die rekonstruierte Beschleunigung genau einen Takt verspätet "reagiert bzw. startet". ich habe dazu mal die erste Beschleunigungsphase raus gezoomt und angehängt. Könnte man diesen Effekt irgendwie unterdrücken? Am schönsten wäre es, wenn die Übertragungsfunktion angepasst werden könnte. Oder ich müsste zum Erhalten meines rekonstruierten Eingangs meine Motorkraft einen Takt früher in das System eingehen lassen. Diese Lösung ist aber bestimmt mit Problemen verbunden. VG
Nun, es scheint mir so, als ob die Verzögerung das kleinere Problem wäre. Viel gravierender ist der scheinbare Offset, den man im zweiten Bild sieht. Es könnte natürlich sein, dass dieser durch die Kraftschwankungen verursacht wird. Vielleicht könnte man diese mit einem Tiefpassfilter etwas begrenzen. Oder du hast wirklich einen Offset in der Beschleunigung. Dann wäre das System aber nicht mehr linear. Könntest du vielleicht noch genau erläutern, welche Bedeutung und welchen Zusammenhang die Variablen in dem Matlab-Export haben, und wie genau du die ÜF errechnet hast? Wenn ich das nachvollziehen und -rechnen kann, kommen wir vielleicht schneller auf eine Lösung. Gruß RJdaMoD
Hi, ich gebe zu, es ist etwas Erklärung notwendig: Gegeben ist ein Antrieb der mit hoher Dynamik verfährt und zur Bearbeitung eines Werkstückes genutzt wird. Aufgrund der hohen Beschleunigungsänderung (Ruck) dieses Antriebes, regt dieser, die Maschinenstruktur an. Ein zweiter Schlitten befindet sich auf derselben Führung und fährt in die Gegenrichtung. Der eingeleitete Impuls wird kompensiert bzw. minimiert. Ich habe meinen Bearbeitungs-Antrieb identifiziert, um die entstehenden Motorkräfte prognostizieren zu können. Vor der eigentlichen Verfahrbewegung muss aufgrund der Sollwegvorgaben des Bearbeitungsschlittens die Kraft bekannt sein, welche entsteht. Diese muss der andere Antrieb aufbringen. Dem anderen Antrieb kann ich auch nur einen Weg vorgeben. Deshalb brauch ich die inverse Übertragungsfunktion. Damit ich von der prognostizierten Kraft auf die Wegvorgabe des anderen Antriebs schließen kann. Vorher wird die prognostizierte Kraft gefiltert, um den Verfahrweg gering zu halten. Fazit: der zweite Antrieb soll die Schwingungsanregung des Bearbeitungsantriebes minimieren, aber selbst geringe Wege fahren. Ich habe herausgefunden, dass es besser ist die prognostizierten Kräfte in meine inverse Übertragungsfunktion zu geben nach dem ich die prognostizierte Motorkraft gefiltert habe (So soll es auch sein :-) ). Die prognostizierte Kraft enthält keine nichtlinearen Effekte. Den plot den ich gepostet habe, habe ich erhalten, indem ich die nichtlinearen Kräfte in mein Modell "geschickt" habe. Daher kann nicht der genaue Weg herauskommen. Ich habe eben die Erkenntnis gewonnen, dass diese Herangehensweise ungeeignet ist. Mein Ziel ist es nicht den genauen Verlauf der Beschleunigung zu rekonstruieren. Den Verlauf kenne ich ja schon, da ich den Sollbeschleunigungsverlauf des Antriebs A kenne. Die Prognose der Kraft ist zwar nicht genau, aber mit der inversen Übertragungsfunktion muss natürlich wieder der Sollweg rauskommen, der als Eingang in mein Modell diente (Sollweg des Bearbeitungsschlittens). Dies ist trivial. Zur Begrenzung des Verfahrweges wird aber die prognostizierte Kraft gefiltert und dient dann erst als Eingang für meine inverse Übertragungsfunktion. Die Wege die ich damit erhalte sind viel kleiner als des Bearbeitungsantriebes. Zudem ist die Schwingungsanregung stark reduziert. Das ist sehr gut. Ich erhalte also auf diese Weise gute Ergebnisse, obwohl die prognostizierten Kräfte nicht den tatsächlichen Antriebskräften des Bearbeitungsschlittens entsprechen. Demzufolge werde ich das zuletzt angesprochene/gepostete Problem nicht weiter verfolgen. Dennoch bleibt das Problem, dass der rekonstruierte Weg genau einen Takt verspätet "startet" (Unterschlagung von z^-1). Daraus folgt, dass der zweite Antrieb die Bewegung nicht synchron mit dem Bearbeitungsschlitten beginnt. Dadurch verschlechtert sich die Wirkung der Schwingungskompensation. Entschuldige, dass ich dich auf eine falsche Fährte gelockt habe :-) Trotzdem bleibt das Problem der nicht synchronen Wegvorgabe... Ich hoffe du konntest meine Ausführungen nachvollziehen. VG
Unter Umständen, da muss ich mich mal kundig machen. Gibt es irgendeine andere Möglichkeit?
Hi RJdaMoD, ich bins nochmal. Ich habe die Verzögerung implementiert. Auf diese Weise haut es natürlich wunderbar hin. Ich denke, dass man die Verzögerung auch im Steuerungsrechner implementieren kann. Zunächst unternehme ich eh erstmal nur simulative Untersuchungen und dafür reicht diese Annahme aus. Ich bin damit jetzt zufrieden. Jetzt muss ich erstmal Ergebnisse produzieren :-) Aber ich bin guter Dinge. Ich bin nun wunschlos glücklich. Ich hoffe, dass das auch so bleibt. Auch möchte ich mich nochmals in aller Form bei dir bedanken. Du hast immer sehr schnell geantwortet. Deine Beiträge haben mir sehr geholfen und waren wirklich konstruktiv. Vielen vielen Dank. :-) VG Christoph
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.