0

パラメータを決定できる正弦波があります(これらはユーザー入力です)。y = a * sin(m * x + t)の形式です

[0、x]から始まる特定の間隔のyの範囲を把握するための効率的なアルゴリズムを誰かが知っているかどうかを知りたいです(xは再び別の入力です)

例えば:

y = sin(x)(つまり、a = 1、t = 0、m = 1)の場合、区間[0、4]の場合[1、-0.756802]のような出力が必要です。

mとtは何でもかまいません。したがって、y曲線は0(または1)で開始(または終了)する必要はありません。どこからでも開始できます。

また、xは離散的であることに注意してください。

何か案は?

PS:アルゴリズムの実装にはPythonを使用します。

4

3 に答える 3

2

期間が1つを超える場合、結果は+/-aになります。

1期間未満の場合、開始/終了ポイントでyを評価し、次に、を解くことによって開始/終了ポイント間の最大値を見つけることができy' = 0ますcos(m*x + t) = 0

于 2010-12-25T19:17:45.553 に答える
2

関数y(x) = a*sin(m*x + t)は連続であるため、最大値は区間のいずれかの端か、最大の内部区間のいずれかになります。この場合dy/dx、ゼロに等しくなります。

したがって:
1。間隔の終わりでy(x)の値を見つけます。
2. dy / dx == a * m cos(mx + t)の間隔がゼロかどうかを調べ、ゼロでのy(x)の値を調べます。
3.y(x)最大値を持つポイントを選択します

于 2010-12-25T19:21:24.213 に答える
0

すべての答えは多かれ少なかれ同じです。ありがとうみんな=)

次のようなものを使用すると思います(「x」と呼んだ変数の名前を「end」に変更していることに注意してください。この「x」は最初にあり、X軸の間隔の終わりを示しています。 )::

1)yを0と「終了」で評価し、ifブロックを使用して、範囲の正しいPRELIMINARY「最小」と「最大」に2つの値を割り当てます。

2)進化の数を評価します: "evolNr" =(m * end)/2Pi。evolNr> 1の場合、[-a、a]を返します

3)evolNr <1の場合:最初に、「firstRoot」にある導関数のルートを見つけます=(1 / 2m)*Pi-フェーズ+q * 1 / m * Pi、ここでq = ceil(m / Pi *( (1 / 2m)* Pi-phase))---これにより、x> 0の位置に最初のルートが表示されます。それ以降、他のすべての極値がfirstRoot内にあり、「end」であることがわかります。 1 / m*Pi。

コード内:for(a = firstRoot; a <end; a + = 1 / m * Pi){aでyを評価し、最大値が0より大きい場合は、「max」を更新します。それ以外の場合は、「min」を更新します}

戻り値[最小、最大]

于 2010-12-25T22:57:35.837 に答える