보간 함수의 함수 기간 찾기

Sep 02 2020

두 가지 관심 수량이 있으며 x, y이는$\theta$따라서 암묵적으로 시간입니다. 또한 두 개의 매개 변수 a및 b. 그러나 y단지 종속 방정식입니다. 그들은 다음에 의해 정의되고 해결됩니다.

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}];

분명히 y시간의 주기적 함수입니다. 그러나이 함수의 기간을 찾으려면

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

매번 0을 얻습니다. 보간 함수로서 해답의 특성상 문제인 것 같지만, 기간을 구하는 좋은 방법이 있는지 궁금합니다.

답변

2 RohitNamjoshi Sep 03 2020 at 01:37

또 다른 접근법

절대 값 플로팅

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

플롯에서 포인트 추출

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

y 값의 피크 찾기

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

봉우리에 해당하는 포인트

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

확인할 플롯

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

"기간"의 정의에 따라

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 여러분이 제공하는 것보다 더 자세하게 작업하는 표현을 살펴 보겠습니다.

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]]

θ순수한 함수 로 작업하는 것이 더 쉽다고 생각 하므로 NDSolveValue해결하기 위해 사용합니다.

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

이제 우리는 y[1, 2]의 영역에 대해 플롯 할 수 있습니다 θ.

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

주기적으로 보이지 않습니까? 그러나 물론 그렇지 않습니다. 이것은 실수의 작은 닫힌 구간에 걸쳐주기 함수에 대한 좋은 다항식 근사입니다. 그러나 int 플롯에 표시된 두 음의 최소값 사이의 간격을 계산하여 근사되는 함수 기간의 적절한 수치 근사치를 얻을 수 있습니다. 이렇게 :

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

참고 :에서 실제주기 함수를 생성 y[1, 2]하려면 이 링크 를 따라가는 방법을 찾을 수 있습니다.