Ermitteln der Periode einer Funktion einer Interpolationsfunktion
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
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} *)
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