Gibt es einen numerischen Algorithmus zum Auffinden einer asymptotischen Steigung?

23

Ich habe eine Reihe von Datenpunkten denen ich erwarte, dass sie (ungefähr) einer Funktion folgen , die zu einer Linie im großen asymptotisch ist . Im Wesentlichen nähert sich Null, wenn , und dasselbe kann wahrscheinlich von allen Ableitungen , gesagt werden. usw. Aber ich weiß nicht, wie die funktionale Form für lautet, wenn sie überhaupt eine hat, die mit elementaren Funktionen beschrieben werden kann.y ( x ) x(xi,yi)y(x)xf(x)y(x)(ax+b)xf(x)f(x)f(x)

Mein Ziel ist es, die bestmögliche Schätzung der asymptotischen Steigung . Die offensichtliche grobe Methode besteht darin, die letzten Datenpunkte auszuwählen und eine lineare Regression durchzuführen, aber dies ist natürlich ungenau, wenn innerhalb des Bereichs von für den ich Daten habe, nicht "flach genug" wird . Die offensichtliche weniger grobe Methode besteht darin, anzunehmen, dass (oder eine andere bestimmte funktionale Form) und unter Verwendung aller Daten, aber der einfachen Funktionen, die ich ausprobiert habe, wie passen oder stimmen nicht ganz mit den Daten am unteren überein, woaf(x)xf(x)exp(x)exp(x)1xxf(x)ist groß. Gibt es einen bekannten Algorithmus zur Bestimmung der asymptotischen Steigung, der besser geeignet wäre, oder der einen Wert für die Steigung zusammen mit einem Konfidenzintervall liefern könnte, da ich nicht genau weiß, wie sich die Daten der Asymptote nähern?


Diese Art von Aufgabe taucht in meiner Arbeit mit verschiedenen Datensätzen häufig auf, daher bin ich hauptsächlich an allgemeinen Lösungen interessiert, aber auf Anfrage verweise ich auf den bestimmten Datensatz , der diese Frage aufgeworfen hat. Wie in den Kommentaren beschrieben, gibt der Wynn Algorithmus einen Wert an, der, soweit ich das beurteilen kann, etwas abweicht. Hier ist eine Handlung:ϵ

Asymptotisch lineare Daten

(Es sieht so aus, als ob es bei hohen x-Werten eine leichte Abwärtskurve gibt, aber das theoretische Modell für diese Daten sagt voraus, dass sie asymptotisch linear sein sollten.)

David Z
quelle
Dies mag für diese Site zu elementar - oder zu vage - sein, aber ich dachte, dass die private Beta die Zeit ist, solche Dinge auszuprobieren.
David Z
Nein, ich denke das ist eine großartige Frage. Nicht alles muss fortgeschritten und ausgefallen sein. Gute Lösungen für einfache Probleme sind wichtig.
Colin K
@Dan: War das Ersetzen von wirklich gerechtfertigt? exp
JM
Exps zu haben, erschwert mir das Lesen, aber ich gebe zu, dass es klein genug war, dass ich es nicht hätte tun sollen.
Dan
Es ist mir wirklich egal, ich dachte nur, ich könnte die Änderungen genauso gut genehmigen, weil, na ja, warum nicht. Sie haben einen guten Ruf, was auch immer das wert ist.
David Z

Antworten:

13

Es ist ein ziemlich grober Algorithmus, aber ich würde das folgende Verfahren für eine grobe Schätzung verwenden: Wenn, wie Sie sagen, das angebliche , das Ihr zunehmendem bereits fast linear ist , was ich ' Nehmen Sie dazu die Differenzen und verwenden Sie dann einen Extrapolationsalgorithmus wie die Shanks-Transformation , um die Grenze der Differenzen zu schätzen. Das Ergebnis ist hoffentlich eine gute Schätzung dieser asymptotischen Steigung.( x i , y i ) x y i + 1 - y if(x)(xi,yi)xyi+1yixi+1xi


Was folgt, ist eine Mathematica- Demonstration. Der Wynn Algorithmus ist eine praktische Implementierung der Shanks-Transformation und als (versteckte) Funktion integriert . Wir probieren das Verfahren an der Funktion ausϵSequenceLimit[]

4x2+3+2x+e4x+3
xdata = RandomReal[{20, 40}, 25];
ydata = Table[(3 + 13*E^(4*x) + 6*E^(4*x)*x + x^2 + 3*E^(4*x)*x^2 + 
      2*E^(4*x)*x^3)/(E^(4*x)*(3 + x^2)), {x, xdata}];

SequenceLimit[Differences[ydata]/Differences[xdata],
              Method -> {"WynnEpsilon", Degree -> 2}]
1.999998

Ich könnte genauso gut zeigen, wie einfach der Algorithmus ist:

wynnEpsilon[seq_?VectorQ] := 
 Module[{n = Length[seq], ep, res, v, w}, res = {};
  Do[ep[k] = seq[[k]];
   w = 0;
   Do[v = w; w = ep[j];
    ep[j] = 
     v + (If[Abs[ep[j + 1] - w] > 10^-(Precision[w]), ep[j + 1] - w, 
         10^-(Precision[w])])^-1;, {j, k - 1, 1, -1}];
   res = {res, ep[If[OddQ[k], 1, 2]]};, {k, n}];
  Flatten[res]]

Last[wynnEpsilon[Differences[ydata]/Differences[xdata]]]
1.99966

Diese Implementierung wurde von Weniger übernommen .

JM
quelle
Nur neugierig, aber warum hast du die ursprüngliche Form der Funktion, anstatt alle Begriffe zu kombinieren?
Rcollyer
Es war nur zu Demonstrationszwecken. :) Ich habe den Ausdruck eingefügt, damit ihr wisst, wie die erwartete Antwort lauten sollte. Was ich demonstrieren wollte, war, dass Sie diese Art von Analyse für eine kompliziert aussehende Funktion durchführen können ...LEINTEX
JM
Wie flach müssen die Punkte sein, damit der Algorithmus effektiv ist?
Rcollyer
2
Okay, letzte Frage (ich schwöre), können Sie einen Fehler in der Schätzung erzeugen?
Rcollyer
1
Das ist etwas kniffliger. Ich habe in einigen Artikeln einige vorgeschlagene Methoden gesehen, aber ich gebe zu, keine Experimente damit gemacht zu haben. (Vielleicht sollte ich es eines Tages tun .) Das Buch von Brezinski und Redivo-Zaglia enthält einige Hinweise, die Sie sich ansehen sollten.
JM