Ermitteln der Periode einer Funktion einer Interpolationsfunktion

Sep 02 2020

Ich habe zwei Mengen von Interesse, xund ydie Funktionen von$\theta$und damit implizit der Zeit. Sie hängen auch von zwei Parametern ab aund b. Ist yjedoch nur eine abhängige Gleichung. Sie werden definiert und gelöst durch

x[a_, b_] := a Cos[θ[t]]^2 + b Sin[θ[t]]^2 + θ'[t];
y[a_, b_] := 3 a^2 (Cos[2 θ[t]] + Sin[θ[t]]^2) - b Sin[θ[t]];
sol1 = First @ NDSolve[{x[1, 2] == 0, θ[0] == 0}, θ, {t, 0, 10}];

Offensichtlich yist eine periodische Funktion der Zeit. Wenn ich jedoch versuche, den Zeitraum dieser Funktion mit zu ermitteln

FunctionPeriod[y[1, 2] /. sol1, t]

Ich bekomme jedes Mal 0. Dies scheint aufgrund der Art der Lösung als Interpolationsfunktion ein Problem zu sein, aber ich habe mich gefragt, ob es einen guten Weg gibt, den Zeitraum zu ermitteln.

Antworten

2 RohitNamjoshi Sep 03 2020 at 01:37

Ein anderer Ansatz

Zeichnen Sie den absoluten Wert

absPlot = Plot[Abs@y[1, 2] /. sol1, {t, 0, 10}];

Extrahieren Sie Punkte aus dem Plot

points = absPlot // Cases[#, Line[x_] :> x, All] & // First;

Finden Sie Peaks der y-Werte

yPeaks = FindPeaks[points[[All, 2]]];

Punkte, die den Spitzen entsprechen

peakPoints = points[[yPeaks[[All, 1]]]];

Plot zu überprüfen

Plot[Abs@y[1, 2] /. sol1, {t, 0, 10}, Epilog -> {Red, PointSize[Large], Point[#] & /@ peakPoints}]

Abhängig von Ihrer Definition von "Periode"

peakPoints // Select[Last@# > 2.5 &] // Part[#, All, 1] & // Differences
(* {1.56407, 2.87684, 1.56662, 2.87797} *)

peakPoints // Select[Last@# < 2.5 &] // Part[#, All, 1] & // Differences
(* {4.44382} *)
1 m_goldberg Sep 03 2020 at 00:07

re Schauen wir uns die Ausdrücke, mit denen Sie arbeiten, genauer an, als Sie angeben.

x[a_, b_] := a Cos[θ[t]]^2 + b Sin[θ[t]]^2 + θ'[t]
y[a_, b_] := 3 a^2 (Cos[2 θ[t]] + Sin[θ[t]]^2) - b Sin[θ[t]]

Ich denke, es ist einfacher, θals reine Funktion zu arbeiten, also NDSolveValuelöse ich sie.

θ = NDSolveValue[{x[1, 2] == 0, θ[0] == 0}, θ, {t, 0, 3 π}]

Jetzt können wir y[1, 2]über die Domäne von θ:

Plot[y[1, 2], {t, 0, 3 π}]

Es sieht regelmäßig aus, nicht wahr? Aber das ist es natürlich nicht. Es ist nur eine gute polynomielle Annäherung an eine periodische Funktion über ein kleines geschlossenes Intervall der Realzahlen. Sie können jedoch eine anständige numerische Annäherung an die Periode der zu approximierenden Funktion erhalten, indem Sie das Intervall zwischen den beiden im Diagramm gezeigten negativen Minima berechnen. Wie so:

Subtract @@ Flatten[FindArgMin[y[1, 2], {t, #}] & /@ {8, 33/10}]
4.44288

Hinweis: Wenn Sie eine echte periodische Funktion erstellen möchten, y[1, 2]finden Sie Methoden dazu, indem Sie diesem Link folgen