Verfasst am: 27.09.2014, 13:18
Titel: Polstellen einer Funktion annähern
Hallo zusammen,
ich hoffe hier ist der richtige Ort für meine Frage. Im Zusammenhang mit Polstellen habe ich bisher nur Beiträge im Bezug auf Regelungstechnische Systeme gefunden.
Mein Problem ist folgendes: Ich habe Messwerte gegeben und möchte den Verlauf dieser Messwerte annähern. Die Messwerte enthalten jedoch augenscheinlich mehrere Polstellen, daher dachte ich mir, dass diese Annäherung mit einer Padé-Approximation möglich sein müsste.
Da die grundsätzliche Form einer Padé-Approximation die folgende zu sein scheint:
dachte ich mir, dass ich mithilfe des Curve Fitting Tools unter Verwendung einer Custom Equation mit eben solch einer Gleichung bereits eine Annäherung erreichen könnte, die Polstellen scheinen aber ein Problem darzustellen. Der Fit ist lediglich eine Gerade.
Ich habe das Problem erstmal vereinfacht und versucht folgende Funktion mit einer einzigen Polstelle anzunähern:
durchführe, bleibt der Fit in diesem Ausschnitt wieder annähernd eine Gerade: der Pol wird komplett ignoriert (Er merkt auch an: "! Ignoring Inf in Data").
Kann mir jemand helfen? Ich weiß gerade nicht was ich falsch mache. Gibt es einen anderen Weg Polstellen in Funktionen anzunähern?
Ich bin leider noch nicht so erfahren in Matlab, daher hoffe ich, dass diese Frage jetzt nicht allzu dämlich ist...
Bin für jede Hilfe dankbar.
Mein Problem ist jedoch, dass ich eigentlich nur Messwerte habe, und keinen Funktionsausdruck von dem ich Polstellen aus dem Nennerpolynom ermitteln könnte. Ich suche ja gerade einen Funktionsausdruck (als Näherung) für meine Messwerte.
ja quasi die Polstellen zurückgibt, könnte ch mir jetzt vorstellen, ein Script zu schreiben, das das Nennerpolynom so modelliert, dass es die Pole an diesen Stellen erzeugt, aber ist das wirklich der einzige/beste weg?
Den restlichen Verlauf habe ich so ja noch nicht berücksichtigt, und müsste dann ja die Optimierung der Koeffizienten selber durch Methode der kleinsten Quadrate o.ä. von Hand schreiben.
Ansonsten: es gibt sicher viele Wege, in diesem einfachen Beispiel den Pol zu finden. Kannst du echte Beispieldaten zur Verfügung stellen, damit man sehen kann, was da geht?
Hallo,
tut mir Leid, dass ich nicht mehr geantwortet habe, ich hatte zwischenzeitlich andere Probleme und meine Frage hier fast vergessen.
Im Anhang habe ich mal einen Ausschnitt des Verlaufs der Daten angefügt.
Das Problem ist halt, dass es Messdaten sind und da natürlich nie ein Pol im Sinne von unendlichen Messwerten gemessen wird.
In der Zwischenzeit wurde mir eine Optimierungsroutine für lineare Funktionen zur Verfügung gestellt, diese habe ich etwas abgewandelt:
Ich erzeuge eine Modellfunktion (welchen Grades auch immer):
Für lineare Funktionen (also der Form m*x + b), quadratische, kubische, ... etc. funktioniert das auch wunderbar. Sobald ich jedoch einen Nennerterm in der Modellfunktion habe
funktioniert das gar nicht mehr. Egal wieviele Iterationen ich durchlaufen lasse, die Parameter bleiben exakt die Startparameter, es wird also nichts optimiert.
Ich weiß auch nicht so recht wie ich hier erkennen kann wo das Problem liegt, da ich ja nicht wirklich sehe was fminsearch im Hintergrund eigentlich macht.
Wenn ich mal Messwerte einer bekannten Funktion generiere und die Startwerte für die Parameter auf die Koeffizienten der bekannten Funktion setze, passt die Approximation
natürlich, aber dann brauch ich ja auch nichts mehr zu optimieren....
Hat evtl. jemand Rat für mich warum diese Methode bei gebrochenrationalen Funktionen in meinem Fall versagt? Ich habe mich etwas zu dem hinter fminsearch steckenden
Nelder-Mead Simplex Algorithmus belesen, konnte aber nicht erkennen, warum dieser hier nicht funktionieren sollte.
bitte ein lauffähiges Beispiel posten, das die genannten Probleme aufweist.
sum ist hier meines Erachtens nicht sinnvoll, da sich so positive und negative Abweichungen aufheben. Ich würde stattdessen wenn norm verwenden.
Noch besser wäre es allerdings, das als Kurvenanpassungsproblem zu sehen, also z.B. lsqcurvefit zu verwenden.
Hilfreich wäre auch die Selbstdiagnose des Solvers.
Die Werte für die Koeffizienten a0, a1, ... ändern sich hierbei gar nicht.
Da mir im Command Window gemeldet wird:
"Maximum number of function evaluations has been exceeded
- increase MaxFunEvals option."
bzw.
"Exiting: Maximum number of iterations has been exceeded
- increase MaxIter option."
Habe ich mit diesen beiden Optionen schon rumprobiert, allerdings ohne Erfolg. Die Rechenzeiten steigen sehr stark an und es müssten sich die Koeffizienten ja wenigstens ein bisschen verbessern, auch wenn die Funktion irgendwann abbricht...
Ein Diagnose-Menü kenne ich nur aus Simulink, was meinst du mit Selbstdiagnose des Solvers?
Ich habe bisher fminsearch verwendet, weil ich auf spezielle Toolboxes weitestgehend verzichten wollte, werde mir jedoch mal lsqcurvefit anschauen.
das macht Sinn. Bei dem generierten Beispiel funktioniert das jetzt tatsächlich. Ist zwar noch sehr stark von der Wahl der Anfangsparameter abhängig, aber ok.
Bei den Messdaten versagt es allerdings immernoch komplett, vielleicht liegt das echt an den Anfangswerten, im Gegensatz zur bekannten Funktion kann ich die hier ja nur schwer schätzen.
Vielen Dank jedenfalls für deine Hilfe! Hab wieder einiges gelernt.
naja, ich hatte oben ja schonmal so einen Ausschnitt der Messwerte angehängt. Der komplette Verlauf besteht nur aus mehreren solchen Polen, ich wäre ja erstmal zufrieden wenn es mit einem einzigen klappt.
Eigentlich erscheint mir der Verlauf nicht so verschieden zu generierten Funktionen bei denen das ganze funktioniert und soweit ich das sehe, sollte dafür auch kein Polynom wesentlich höherer Ordnung nötig sein.
Wenn ich das Beispiel aber durchlaufen lasse erhalte ich nur eine Gerade...
Ich hatte gedacht, dass die doch recht großen X-Werte (im Verhältnis zu den kleinen Startwerten) evtl. ein Problem darstellen, und habe daher mal von den X-Werten den Mittelwert abgezogen und auch mal mit der "TypicalX" Option rumgespielt (wobei mir deren Auswirkung noch nicht ganz einleuchtet) aber beides ergab keine Verbesserung.
sorry, als du die Datei zuerst gepostet hattest, war nur bruchstückhaft klar, was du damit machst. Daher hatte ich die Datei da nicht weiter beachtet, und jetzt nicht nochmal alles durchgeschaut.
Das Problem liegt in der Tat in den hohen x-Werten. Wenn du sie vorher skalierst, klappt es problemlos:
Ich hatte sowas ähnliches gemacht, die ganzen X-Werte quasi um ihren Mittelwert verringert, das funktionierte nur nicht so ganz. So wie du es gemacht hast geht es aber wunderbar.
Den Ausschnitt aus den Messwerten den ich geposted habe kann ich damit ganz gut annähern. Für den kompletten Verlauf muss ich noch ein bisschen rumspielen, da der viele Polstellen enthält, aber es funktioniert schonmal und man sieht eindeutig, dass es eine Näherung des Verlaufes wird
Du hast mir sehr geholfen, Danke nochmal.
Ich setze das jetzt mal auf beantwortet.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.