Forum: Digitale Signalverarbeitung / DSP / Machine Learning Inverse z-Übertragungsfunktion


von Christoph P. (peuki83)


Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

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

von Christoph P. (peuki83)


Angehängte Dateien:

Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

Kannst du die .mat-Datei irgendwie als Text-Datei bereitstellen?
Ich arbeite momentan mit Mathematica und habe gerade keinen Konverter 
zur Hand.
Gruß
RJdaMoD

von Christoph P. (peuki83)


Angehängte Dateien:

Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

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

von Christoph P. (peuki83)


Lesenswert?

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.

von Christoph P. (peuki83)


Lesenswert?

oh ich korrigiere ich meinte:
b_1+b_2*z^-1+b_3*z^-2+...+b_m*z^(-m+1).

von RJdaMoD (Gast)


Lesenswert?

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

von Christoph P. (peuki83)


Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

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.

von Christoph P. (peuki83)


Angehängte Dateien:

Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

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

von Christoph P. (peuki83)


Lesenswert?

Sehr konstruktiver Vorschlag. Das werde ich sofort versuchen...
Danke

von Christoph P. (peuki83)



Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

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

von Christoph P. (peuki83)


Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

Hm, kannst du nicht den ersten Antrieb verzögern?

von Christoph P. (peuki83)


Lesenswert?

Unter Umständen, da muss ich mich mal kundig machen. Gibt es irgendeine 
andere Möglichkeit?

von Christoph P. (peuki83)


Lesenswert?

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

von RJdaMoD (Gast)


Lesenswert?

Gern geschehen!
Gruß
RJdaMoD

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.