WhenEvent

WhenEvent[event,action]

NDSolveおよび関連関数中の方程式について,event がトリガした場合に発生する action を指定する.

詳細とオプション

  • NDSolve[eqns,]では,WhenEvent式は eqns に含まれ,特に区分系あるいは混成系の解の指定の一部であるとみなされる.
  • WhenEvent式は,NDSolveNDSolveValueParametricNDSolveParametricNDSolveValueDSolveDSolveValueで使うことができる.
  • 事象は,NDSolveにおける eqns の積分中に が交差した特定の時点に対応する.
  • f の根において事象がTrueになるような関数 f によって事象の式が明示的に与えられた場合は,WhenEventは数値によるこん探索法を使って区間 を決定する.ただし,は関数が根を持つ時点である.以下は,明示的に与えられた事象の例である.
  • f0解の変数の関数 f がゼロと交差する
    f>0f が下からゼロと交差する
    f<0f が上からゼロと交差する
    Mod[t,Deltat]0時間変数 における規則的な区間 でのサンプル
  • 明示的な事象の式 ev を使うと,形式 ev && pred を使って述語 pred を条件とする事象が作成できる.この場合,事象は事象関数の根で predTrueの場合にのみトリガされる.
  • 事象が上記の明示的な形式に直接変換できないような形式で与えられたなら,事象の式はTrueまたはFalseのいずれかの述語 pred であるとみなされる.この場合,区間 は,二分法を使って求められる.
  • 条件を含む明示的な事象と述語とみなされる事象の解釈は多少異なる.明示的な事象は検出される可能性が高く根を求める方がはるかに効率的なので,可能な場合は明示的な事象を使用するのが望ましい. »
  • WhenEvent[{event1,},action]{WhenEvent[event1,action],}として扱われる.
  • WhenEvent[event,{action1,action2,}]の場合,アクションは連続的に評価される.
  • アクションの評価からの値は,使われるとNDSolveに影響を与えるような特殊な値を持つ場合以外は,WhenEventによって無視される.次の特殊な値が認められる.
  • "StopIntegration"で積分を中止し,解を返す
    "RestartIntegration"で積分を再開する
    "CrossDiscontinuity"iまで積分を行い,外挿して で再開する
    "CrossSlidingDiscontinuity"まで積分し,外挿してスライディングモードの条件をチェックし,で再開する
    "RemoveEvent"事象を削除する
    y[t]->val状態変数 yval に変更する
    d[t]->"DiscontinuitySignature"不連続のシグナチャ変数 d を変更する
  • WhenEvent[f==0,d->"DiscontinuitySignature"]のとき,不連続性は曲面 f==0で,d は値{-1, 0, 1}あるいは{-1, 1}を取り,事実上,事象に続く についてはSign[f]に設定される離散変数でなければならない.
  • WhenEventには属性HoldAllがあり,デフォルトで,eventaction は変数に近似値が割り当てられたときにのみ評価される.
  • WhenEventが取り得るオプション
  • "DetectionMethod" Automatic事象の検出に使用するメソッド
    "LocationMethod" Automatic時間ステップ内で事象を見付けるために使用するメソッド
    "IntegrateEvent" Automatic事象関数を積分するかどうか
    "Priority" Automatic同時事象の際のアクションの優先順位
  • "DetectionMethod"の可能な設定値
  • Automatic検出メソッドを自動的に決定する
    "Sign"符号変換を使う
    "DerivativeSign"符号変換と時間導関数を使う
    "Interpolation"密な解の出力の補間を使う
  • "Sign"検出法はオーバーヘッドが最も小さいが,急激に変化する関数内の事象を検出し損なう可能性がある."Interpolation"検出法はより強力で,ステップごとに複数の事象を検出する可能性がある.
  • "LocationMethod"の可能な設定値
  • Automatic位置メソッドは自動的に決定する
    "StepBegin"ステップの始めに事象を見付ける
    "StepEnd"ステップの最後に事象を見付ける
    "LinearInterpolation"ステップ内で線形補間する
    "Brent"ステップ内でブレント(Brent)の根の位置を使う
  • "IntegrateEvent"の可能な設定値
  • Automatic自動的に決定する
    False事象関数は積分しない
    True事象関数を積分する
  • "Priority"の設定値は任意の整数またはInfinityである.同時事象の場合,アクションはソートされた優先順で評価される.

例題

すべて開くすべて閉じる

  (1)

各バウンドでその速度の95%を保持するボールのバウンドのシミュレーションを行う:

スコープ  (16)

事象  (6)

x[t]1/2と交差するごとに値tを出力する:

x[t]1/2より大きくなるごとに値tを出力する:

x[t]1/2より小さくなるごとに値tを出力する:

規則的な時間間隔 で解のサンプルを取る:

いくつかの事象をリストに指定して,そのうちのどれかが起るたびにある事象が引き起こされるようにする:

事象 を条件 とともに使って正の 軸との交差を検出する:

一般に,事象はTrueになるかどうかの検定が行える任意の式でよい:

ボタンが押されたときに積分を停止する事象をトリガする:

停止ボタンが十分早い段階で押されると,積分は になる前に停止する:

アクション  (9)

いくつかのアクションをリストに指定して,順に実行されるようにする:

"StopIntegration"を使って何らかの事象によって解を終了するようにする:

"RemoveEvent"を使って事象を初回の出現後に削除する:

事象を3回目の出現後に削除する:

"RestartIntegration"を使って,事象の後で積分を強制的に再開する:

離散状態変数a[t]を使うとこの変更をよりうまく扱うことができる:

規則を使ってDependentVariablesあるいはDiscreteVariablesに変更を加えることができる:

"CrossDiscontinuity"を使って不連続交差を処理する:

"CrossSlidingDiscontinuity"を使ってFilippovの連続性が使えることを示唆する:

DiscreteVariables"DiscontinuitySignature"を使って効率的に不連続性を交差する:

Filippovのスライディングモードの場合は,"DiscontinuitySignature"が0になる:

ソルバ  (1)

WhenEventは,NDSolveで使うことができる:

DSolveで:

ParametricNDSolveで:

NDSolveValueで:

ParametricNDSolveValueで:

DSolveValueで:

一般化と拡張  (2)

条件によって積分を止める:

条件によって事象を取り除く:

オプション  (11)

"DetectionMethod"  (3)

デフォルトの事象検出メソッドは"Sign"である.これは,ステップ間で符号が変化するかどうかをチェックする:

上記は以下と等価である:

"Sign"はステップ間に偶数の交差がある場合に事象を見付けられないことがある:

"DerivativeSign"は,符号は等しいが導関数の符号が異なる場合にはステップを半分にする:

急激に変化する事象関数の場合は"Interpolation"メソッドを使って事象の位置を求める:

"LocationMethod"  (3)

デフォルトの位置メソッド"Brent"は事象の位置を正確に求める:

"LinearInterpolation"メソッドは事象の位置をほぼ正確に求める:

事象の位置を求める際に正確さがさほど重要ではない場合は,"StepBegin"あるいは"StepEnd"を使うとよい:

"IntegrateEvent"  (2)

事象関数が解より速く変化する場合は,交差が見逃されることがある:

から までの事象関数を時間ステップと見付かった交差とともにプロットする:

"IntegrateEvent"->Trueでは,取られたステップははるかに少ない:

事象検出動作を比較するための関数を定義する:

"DetectionMethod"->"Interpolation"では,事象はロバスト性のためにデフォルトで積分される:

動作を比較する:

"Priority"  (3)

同時に起きる,この場合は整数tごとに起きる事象の優先順位を設定する:

Automaticという優先順位は,任意の有限の優先順位の後,しかし優先順位Infinityの前に起きる:

優先順位はSortで使われる標準的な順序で並べられる:

アプリケーション  (21)

バウンドするボール  (3)

バウンドしながら階段を降りていくボールをモデル化する:

ボールの運動,ポテンシャル,総エネルギーをプロットする:

異なる高さから同時に落とされた20個のバウンドするボールをモデル化する:

正方形の箱の中で,壁に当って方向を変えるボールの動きをモデル化する:

無理数の初速ベクトルを使うと周期的な解は得られなくなる:

最適化  (1)

事象検出を使った微分方程式の解法を使って限られた範囲における関数 のすべての極大値と極小値を求めることができる.関数 について考える:

探索範囲を設定する:

関数の導関数が0になるところで微分方程式を解いてその点を保存する:

関数および極大値と極小値をプロットする:

交差検出  (3)

パラメトリック曲線について,弧の長さ1ごとの点に印を付ける:

パラメータ解が環状領域に入る,あるいはそこから出る点に印を付ける:

パラメータ解が領域を出る点のみに印を付ける:

パラメータ解が領域に入る点のみに印を付ける:

解が領域に入るまたは出る点に印を付ける:

ハイブリッドの動的な系  (3)

線形振動解が負の 軸と交差するたびに,これを 軸に沿って投影する:

このリセットされた振動子の解はカオス的振舞いを示している:

負の 軸上に,反射点のヒストグラムとともに解をプロットする:

自由度1の衝突振動子を正弦波を強制してモデル化する:

一定の時間間隔でキックされる減衰振動子をモデル化する:

軌跡は最終的には一定した軌道に落ち着く:

同じ振動子を使うが,一定の時間間隔でランダムなキックを与える:

摩擦モデル  (1)

摩擦力 に異なるモデル(粘性,クーロン,ストライベック,静止)を使ってバネで壁に固定され,動いているベルトコンベアーの上に置かれたブロックをモデル化する.モデルごとの位置と速度を比較する:

ブロックについてのニュートンの方程式:

「粘性摩擦」は相対速度 に比例する:

ブロックはバネの自然長1より少し長い位置で安定する:

「クーロン摩擦」は相対速度 の符号に比例する:

バネの力が十分強くなるまでは,ブロックはベルトとともに動く:

「ストライベック摩擦」は精緻化されたクーロン摩擦 F_(str)=gamma sgn(v) e^(-2 TemplateBox[{v}, Abs])である:

低速での変化は若干小さくなる:

「静止摩擦」はバネの力が値 μ (表面の荒さに依存する)を超えるまでブロックを静止させる.ブロックが動かなくなっている場合は離散変数 stuck を1に設定し,その他の場合はこれを0に設定する:

バネの力が μ より小さいかどうか,またベルトと相対的に見てブロックが動いているかどうかをチェックする:

ブロックは,ベルトに張り付き,次にバネの力で滑り出すことを繰り返す:

さまざまなモデルを比較する:

パワーエレクトロニクス  (4)

出力を平滑化するための4個のダイオードとコンデンサを使って,交流から直流への「全波整流器」をモデル化する:

入力電圧 vi と整流電圧 vr

vr が上がって vo[t]=vr[t]になると,コンデンサが充電し,電気機器に電流が流れる.vr が下がり始めると(vr'[t]<0),コンデンサは電気機器を通して放電を始め,出力電圧は vo'[t]=vo[t]/c r に従う:

この系のシミュレーションを行う:

平滑化されたコンデンサの出力電圧をプロットする:

パルス幅変調フィードバック制御 q[t]を使い,入力電圧レベル vi から所望の出力電圧レベル vd への,直列から直列への「降圧コンバータ」をモデル化する:

Kirchhoffの法則を使って上記回路のモデルを得る:

制御信号 q[t]が,各周期 τvd/vi の割合でトランジスタをオンにする:

高圧 vi=24から低圧 vd=16に一気に下げる:

パルス幅変調フィードバック制御 q[t]を使って,入力電圧レベル vi から所望の電圧レベル vd への,直流から直流への「ブーストコンバータ」をモデル化する:

Kirchhoffの法則を使って上記回路のモデルを得る:

制御信号 q[t]は各周期 τvi/vd の割合でトランジスタをオンに切り換える:

低圧 vi=24から高圧 vd=36に押し上げる:

パルス幅変調フィードバック制御 q[t]を使って,入力電圧レベル vi から所望の電圧レベル vo への,直流から直流への「バックブーストコンバータ」をモデル化する:

Kirchhoffの法則を使って上記回路のモデルを得る:

制御信号 q[t]が,各周期につき vd/(vi+vd) の割合でトランジスタをオンにする:

低圧 vi=24から高圧 vd=36に押し上げる:

高圧 vi=24から低圧 vd=16に一気に下げる:

デジタル制御  (5)

離散時間コントローラ で安定化された系 のシミュレーションを行う:

シミュレーションと可視化を行う:

デットビート離散時間コントローラを使って二重積分器を制御する:

デットビートデジタルフィードバックコントローラ を使う:

シミュレーションと可視化を行う:

質量が1キロの動いている物体の位置をモデル化する:

サンプルを取った比例微分(PD)コントローラを使って位置を一定に保つ:

シミュレーションと可視化を行う:

状態方程式が , で出力が のプラントの離散時間コントローラを設計し,閉ループ系のシミュレーションを行う:

状態推定器と状態フィードバックを使って連続時間コントローラを設計する:

サンプル時間 でサンプルを取り,離散時間コントローラを得る:

離散時間コントローラを使う:

コントローラとプラントを一緒に使って閉ループ系のシミュレーションを行う:

結果をプロットする:

水平の力fを受けている可動の台車の位置xに角度θで固定された振子をモデル化する:

不安定な垂直の固定点で振子を安定させるためにコントローラを設計する:

WhenEventを使って一定のサンプル時間でフィードバックを適用する:

系のシミュレーションを行う:

振子の角度は倒立位置()で急速に安定する:

PDEモデル  (1)

部屋の中のサーモスタットで制御された熱発生をモデル化する.部屋の三方の壁は断熱されており,一方は外気温の影響を受けるガラスになっている:

ヒーターの負荷は事象によって増加したり減少したりする:

PDEは,サークル内での熱の生成,空気を通した熱拡散,そしてガラス窓を通した熱の損失をモデル化する:

位置にあるサーモスタットがトリガの上または下の温度を計測し,離散変数 が変化すると,ヒーターのスイッチが入ったり切られたりする:

初期条件を外気温と等しくしてPDFの時間積分をモニターする:

サーモスタットで計測した温度,外気温,ヒーターのトリガを可視化する.青い背景はヒーターが入っていることを示す:

積分中のステップにかかった時間を調べ,NDSolveValueが事象中に必要に応じてタイムステップサイズをどのように調整したかに注目する:

特性と関係  (2)

NDSolveは自動的にWhenEvent事象を設定し,における不連続性を処理しようとする:

自動的な不連続性の処理の後,次の等価である問題を解く:

がブラックボックス関数の場合,NDSolveは自動的に不連続性を処理することはできない:

この場合,適切な不連続性の処理はWhenEventを加えることで達成できる:

あるいは,不連続性は"CrossSlidingDiscontinuity"を使って交差することができる:

考えられる問題  (6)

事象の解釈  (1)

条件付きで明示的に与えられた事象の解釈は単一の述語の解釈とは多少異なる:

WhenEventは明示的な根の関数を求められないので,事象は predTrueになるときに出現する:

明示的な関数()が与えられると,事象は根 であるとみなされるが,Falseとなる述語()に制約されるので,決してトリガされない:

背景を条件がTrueのときは緑,Falseのときは赤にして,解の軌跡と事象の場所を示す:

明示的な関数()が与えられると,事象は根 であるとみなされる:

背景を条件がTrueのときは緑,Falseのときは赤にして,解の軌跡と事象の場所を示す:

事象の検出  (2)

デフォルトの"DetectionMethod"では,検出されない事象もある場合がある:

よりうまく事象を検出するために,"DerivativeSign"または"Interpolation"を試してみるとよい:

偶次数の根に対応する事象は検出され損なうことがある:

代りに,奇次数の根で書き直す:

任意の閉じた事象  (1)

系によっては有限の時間スパンに無限数の事象を許すものもある:

結局検出されない事象が出る:

事象を見付ける際の許容度を低くすると検出率が上がる:

これより近い事象は検出されない:

補間による検出では事象の検出率をさらに高めることができる:

最後の2つの事象間のギャップはこの極限に非常に近い:

事象が見逃される前に自動的に積分を止める:

積分が停止される点まで事象は検出される:

作業精度を高くすると事象の検出をより細かい時間スケールで行うことができる:

事象アクション  (2)

最高次の導関数は,常微分方程式では設定し直すことができない:

微分代数方程式として解く場合は,最高次の導関数を設定し直すことができる:

対応する の値は剰余が0になるように再初期化で求めることができる:

連続的な事象のアクションがある場合,変数は交互に変更される:

変数値を取り換える際は,同時事象を使う:

インタラクティブな例題  (2)

有理数と無理数の初期値を持つ箱の中のボールを比較する:

有理数と無理数の初期値を持つ箱の中のボールを比較する:

Wolfram Research (2012), WhenEvent, Wolfram言語関数, https://reference.wolfram.com/language/ref/WhenEvent.html (2014年に更新).

テキスト

Wolfram Research (2012), WhenEvent, Wolfram言語関数, https://reference.wolfram.com/language/ref/WhenEvent.html (2014年に更新).

CMS

Wolfram Language. 2012. "WhenEvent." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2014. https://reference.wolfram.com/language/ref/WhenEvent.html.

APA

Wolfram Language. (2012). WhenEvent. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/WhenEvent.html

BibTeX

@misc{reference.wolfram_2024_whenevent, author="Wolfram Research", title="{WhenEvent}", year="2014", howpublished="\url{https://reference.wolfram.com/language/ref/WhenEvent.html}", note=[Accessed: 24-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_whenevent, organization={Wolfram Research}, title={WhenEvent}, year={2014}, url={https://reference.wolfram.com/language/ref/WhenEvent.html}, note=[Accessed: 24-November-2024 ]}