Control: Differential Equation
Model ElementControl_Diffは、MotionSolveで単一のユーザー定義一次微分方程式を定義します。単一の動的状態が、この微分方程式に関連付けられます。この状態は、他のシステム状態と共に積分されます。
説明
この微分方程式は、ユーザー定義の動的状態の関数や、MotionSolveの式を使用してアクセスできるシステムの他の瞬間的な状態の関数にすることができます。
Control_Diffモデリング要素には2つのタイプがあります。1つ目は、おそらく最も有用である式 タイプであり、2つ目はユーザーサブルーチンタイプです。
支配微分方程式は陽的でも陰的でもかまいません。
フォーマット
<Control_Diff
id = "integer"
label = "Name of Control_Diff element"
is_implicit = { "TRUE" | "FALSE" }
ic = "real"
[ ic_dot = "real" ]
[ is_static_hold = { "TRUE" | "FALSE" } ]
{
type = "EXPRESSION"
expr = "motionsolve_expression"
| type = "USERSUB"
usrsub_dll_name = "valid_path_name"
usrsub_param_string = "USER([[par_1[,...][,par_n]])
"
usrsub_fnc_name = "custom_fnc_name" >
| type = "USERSUB"
script_name = "valid_path_name"
interpreter = "PYTHON" | "MATLAB"
usrsub_param_string = "USER([[par_1[,...][,par_n]])
usrsub_fnc_name = "custom_fnc_name" >
}
/>
属性
- id
- 要素識別番号(整数 > 0)。この番号は、すべてのControl_Diff要素の中で一意です。
- label
- Control_Diff要素の名前。
- is_implicit
- 状態の導関数が微分方程式によって陰的に定義されるかどうかを指定するブール値。
"TRUE"は、導関数が陰的に定義されることを意味します。"FALSE"は、導関数が陽的に定義されることを意味します。
指定しない場合、is_implicitはデフォルトで"FALSE"になります。 3
- is_static_hold
- 静的平衡解析および擬似静解析の間、動的状態の値を固定するかどうかを指定するブール値。
"TRUE"は、静的解析および擬似静解析の間、動的状態の値が一定に保たれることを意味します。
"FALSE"は、静的平衡解析または擬似静解析の間、動的状態の値が変化可能であることを意味します。 7
指定しない場合、is_static_holdはデフォルトで"FALSE"になります。
- ic
- 動的状態の初期条件を定義します。このパラメータは必須です。指定しない場合、icはデフォルトで0.0になります。
- ic_dot
- 動的状態の時間導関数の初期条件を定義します。これは、微分方程式が陰的に定義された場合にのみ必要です。
指定しない場合、ic_dotはデフォルトで0.0になります。 3
- type
- EXPRESSIONまたはUSERSUBを選択します。Control_Diffの定義方法を指定します。EXPRESSIONオプションは、実行時に評価できるMotionSolveの式としてこの微分方程式が定義されることを指定します。USERSUBオプションは、ユーザー作成サブルーチンでこの微分方程式が指定されることを示します。パラメータusrsub_param_stringおよびusrsub_dll_nameは、このユーザー定義サブルーチンに関する詳細情報を提供するために使用されます。
- expr
- 微分方程式を定義する式を定義します。このパラメータは、type = EXPRESSIONである場合にのみ使用します。任意の有効な実行時MotionSolve式を入力として指定できます。
- usrsub_param_string
- データファイルからユーザー定義のDIFSUBに渡されるパラメータのリスト。このキーワードは、type = USERSUBが選択されている場合にのみ使用します。
- usrsub_dll_name
- ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、DLL内のusersub_fnc_nameで指定されたユーザーサブルーチンを実行時に読み込みます。このキーワードは、type = USERSUBが選択されている場合にのみ使用します。
- usrsub_fnc_name
- ユーザーサブルーチンDIFSUBの代替名を指定します。
- script_name
- usersub_fnc_nameで指定されたルーチンを含むユーザー作成スクリプトのパスと名前を指定します。
- interpreter
- Specifies the interpreted language that the user script is written in. Valid choices are MATLAB or PYTHON.
例
この例では、高次微分方程式を連立1次微分方程式のセットに変換してから、Control_Diff要素を使用してモデル化する方法を説明します。
図 1.
微分方程式の次数は、その方程式に含まれる最高次導関の次数です。例えば、1次微分方程式には1次導関数のみが含まれます。
したがって、上図のシステムの支配方程式は2次微分方程式です。この方程式を1次形式に変換するには、速度変数vxを導入します。この速度は、変位の時間導関数として定義されます。
これで、支配方程式を2つの1次微分方程式として記述できるようになります。
→
→
このシステムの初期条件をx=0.2mおよびvx=0.0とします。これで2つの微分方程式を次のように指定できます。
vxを定義する微分方程式(註:C/M=2*1e2、K/M=2*1e4):
<Control_Diff
id = "1"
label = "SolverDiff name"
is_static_hold = "FALSE"
ic = "0.0"
type = "EXPRESSION"
expr = "-200*DIF(1) - 20000*DIF(2)">
/>
xを定義する微分方程式:
<Control_Diff
id = "2"
label = "SolverDiff name"
is_static_hold = "FALSE"
ic = "0.2"
type = "EXPRESSION"
expr = "DIF(1)">
/>
- DIF(ID)関数は、Control_Diff、ID="id"で定義された状態を参照します。
- 速度状態は、Control_Diff、ID="1"で定義されます。したがって、速度状態にアクセスするには、DIF(1)を使用します。
- 変位状態は、Control_Diff、ID="2"で定義されます。したがって、変位状態にアクセスするには、DIF(2)を使用します。
- Control_Diff、ID="1"とControl_Diff、ID="2"は、連立微分方程式です。例えば、1つ目の方程式では2つ目の方程式の状態が参照され、その逆も同様です。
- ユーザー定義の状態の前方参照が可能です。例えば、1つ目の微分方程式では、2つ目の微分方程式のユーザー定義の状態を、その式がまだ定義されていなくても参照することができます。
システムの次数を低減するために使用する状態を追加することはよくあります。上記の低減手法を一般化することで、高次システムを扱うことができます。
表記の便宜上、とします。 Z0=Y
(1): | |
(2): | |
(3): | |
(…): | … |
(m-1): | |
(m): |
コメント
- Control_Diffは非常に用途が広いため、マルチボディシステムのモデル化において、さまざまな用途に適用できます。ユーザー定義の動的状態は、ローパスフィルタの作成、信号へのタイムラグの適用、シンプルなフィードバックループのモデル化、信号の積分でよく使用されます。信号は、力の定義に使用したり、スプラインや曲線での補間のための独立変数として、または一般的な制御モデリング要素の入力信号として使用したり、プログラムの出力信号の定義に使用したりすることができます。
MotionSolveの式およびユーザーサブルーチンでは、非常に複雑なユーザー定義の動的状態を定義できます。
- EXPRESSIONタイプは、微分方程式を定義するアルゴリズムがシンプルな式を表すのに十分シンプルである場合に使用されます。多くの場合、動的状態は実体論理とデータ操作によって決まります。このような場合は、プログラミング言語を使用してControl_Diffの値を定義することをお勧めします。ユーザー定義のサブルーチンを使用すると、このことが可能になります。Control_Diffモデリング要素のユーザーサブルーチンを定義する方法の詳細については、DIFSUBのドキュメントをご参照ください。
- 常微分方程式は、陽的でも陰的でもかまいません。
-
陽的微分方程式の形式は次のとおりです:
(4) y は定義される変数、uは状態依存の入力(システムの他の部分から取得されます)、tは独立変数です。
以下に、陽的2次微分方程式の例を示します:(5) (状態依存入力uは含まれていません)
これは、単振り子の運動方程式であることがわかります。
陰的微分方程式の形式は次のとおりです:(6) y は定義される変数、uは状態依存の入力(システムの他の部分から取得されます)、tは独立変数です。
以下に、陰的1次微分方程式の例を示します:(7) (状態依存入力uは含まれていません)
この方程式をシンボリックに変換して を陽的に定義することはできません。陰的微分方程式では、 の初期推測値も必要です。
上記の2つの表現の主な違いは以下のとおりです:- 陽的な場合、動的状態の導関数は陽的に定義されます。この式では、ユーザー定義の状態f(y,t)の導関数が定義されます。
- 陰的な場合、導関数の値を求める必要があります。この式では、微分方程式 の残差が定義されます。
- 陰的に定義された常微分方程式では、偏導関数 が常にゼロ以外であることが重要な要件となります。これは、陽的微分方程式が陰的に表された場合については満たされます。
-
- 陰的微分方程式を定義するには、CONTROL_DIFFに関連する動的状態の値と、この時間導関数の両方にアクセスする必要があります。
- DIF(ID)関数を使用すると、動的状態の値にアクセスできます。
- DIF1(ID)関数を使用すると、動的状態の時間導関数にアクセスできます。
- 効果的な解析を行うには、動的状態の時間導関数を(陽的にまたは陰的に)定義する方程式は滑らかである必要があります。以下によって、意図せずに方程式が滑らかでなくなる可能性があります。
- 実験データ(スプラインとしてサンプリングされたもの)このデータには多くのノイズが含まれている可能性があります。
- ユーザーサブルーチン内または関数式内のロジックのうち、注意しないと関数に折れや不連続性をもたらす可能性があるもの。
- 一連の微分方程式をモデルに導入するには、Control_StateEqnモデリング要素を使用します。Control_Diffとは異なり、Control_StateEqnは微分方程式の配列を扱うことができます。
- 静解析時および擬似静解析の間のControl_Diffオブジェクトに関連する動的状態の挙動は、次の属性によって制御されます。
is_static_hold="TRUE"
時間t=0で解析が行われる場合、状態は、icで指定された値で固定されたままです。動解析の後に解析が行われる場合、値は動的シミュレーションから取得された最後の値で固定されたままです。Control_Diffを定義する方程式は、次の方程式に置き換えられます:(8) ここで、y*は定数です。
動的状態の値が固定される場合、入力uは変化するため、時間導関数はゼロではなくなります。これにより、その後動解析が実行される場合、その解析で過渡応答が生じる可能性があります。
is_static_hold="FALSE"
解析プロセスの間、状態は一定に保たれず、システム全体の状態の変化に従って変えることができます。これがどのように実現されるかを以下に示します:- 静解析および擬似静解析では、動的状態の導関数はゼロに設定されます。これにより、Control_Diffがこれら2つの解析の代数方程式に変換されます。
陽的微分方程式は次のようになります:
f(y,u,t)=0
陰的微分方程式は次のようになります:
F(y,u,t)=0
平衡解析では、システムのコンフィギュレーションが変化すると、平衡条件を満たすように入力uが変化します。上記の式が解かれ、指定されたuの値に対するyが計算されます。
このメカニズムにより、静解析や擬似静解析の終了時に、動的状態の時間導関数が確実にゼロになり、後続の動解析が滑らかになります。
- 静解析および擬似静解析では、動的状態の導関数はゼロに設定されます。これにより、Control_Diffがこれら2つの解析の代数方程式に変換されます。