前項でスカラー関数の定義とその使用方法について説明しました。では、定義したスカラー関数がちゃんと意図したものになっているかどうかを確認するにはどうしたら良いでしょうか。ここでは、その一つの方法を紹介します。ここで紹介する“abstract node”と“genel:clamp”を用いる方法は、スカラー関数の可視化だけでなく、モデル中の任意の変数を可視化する場合にも適用することができます。
“abstract node”は、1つの自由度を持つ汎用のnodeです。nodesブロックの中で次のように定義します。
abstract: <node label>, algebraic, value, <initial value>;
“genel” elementに属する “clamp”は、任意のnode自由度にdriveで指定する値を強制的に与えます。elementsブロックの中で次のように定義します。
genel: <label>,
clamp,
<clamped node>,
<imposed value>;
ここで、<imposed value>は強制的に与える値で、drive callerによって定めます。
定義したスカラー関数 f (x) を -5 ≤ x ≤ 5 の範囲で可視化したい場合、時間0から10までのMBDyn解析(initial value problem)を行い、その間に x = Time - 5 と y = f (x) を各時間ステップで評価して出力すれば求めるデータが得られます。変数 x と y を出力するために、それぞれの変数の値を格納するabstract nodeを定義し、それらのabstract nodeにgenel:crampで値を与えます。次のコード1は、スカラー関数“myfunc2”を可視化するための入力ファイルの例です。
# scalarfunc.mbd
#-----------------------------------------------------------------------------
# Scalar Function
scalar function: "myfunc2",
cubicspline, do not extrapolate,
-2.0, 0.0,
-1.0, 0.0,
0.0, 0.0,
1.0, 1.0,
2.0, 1.0,
3.0, 1.0;
# X Range
set: real XL = -5.; # Lower Limit
set: real XU = 5.; # Upper Limit
set: real dX = 0.01; # Step
#-----------------------------------------------------------------------------
# [Data Block]
begin: data;
problem: initial value;
end: data;
#-----------------------------------------------------------------------------
# [<Problem> Block]
begin: initial value;
initial time: 0.;
final time: XU-XL;
time step: dX;
max iterations: 10;
tolerance: 1.e-6;
end: initial value;
#-----------------------------------------------------------------------------
# [Control Data Block]
begin: control data;
abstract nodes: 2;
genels: 2;
end: control data;
#-----------------------------------------------------------------------------
# Abstract Node Labels
set: integer NoAbs_X = 1;
set: integer NoAbs_Y = 2;
# Genel Labels
set: integer GeClamp_NoAbs_X = 1;
set: integer GeClamp_NoAbs_Y = 2;
#-----------------------------------------------------------------------------
# [Nodes Block]
begin: nodes;
abstract: NoAbs_X, algebraic,
value, XL;
abstract: NoAbs_Y, algebraic,
value, model::sf::myfunc2(XL);
end: nodes;
#-----------------------------------------------------------------------------
# Plugin Variable
set: [dof, X, NoAbs_X, abstract, algebraic];
#-----------------------------------------------------------------------------
# [Elements Block]
begin: elements;
genel: GeClamp_NoAbs_X,
clamp,
NoAbs_X, abstract,
string, "Time+XL";
genel: GeClamp_NoAbs_Y,
clamp,
NoAbs_Y, abstract,
string, "model::sf::myfunc2(X)";
end: elements;
コード1を入力ファイルとしてMBDynを実行すると、出力ファイルとして「scalarfunc.abs」が生成されます。このファイルにabstract nodeのデータが出力されます。absファイルのデータは2列から成り、1列目がnodeラベル、2列目がnodeの値となっています。コード2は、「scalarfunc.abs」のデータを読み込んで、スカラー関数“myfunc2”をプロットするMATLABスクリプトです(コード中の「MBDynLoad」関数については第11項参照)。このスクリプトによって図1のようなグラフが得られます。
% plot_scalarfunc.m
clear; close all;
[LABEL,DATA] = MBDynLoad('scalarfunc.abs');
X = DATA(:,2,LABEL==1);
Y = DATA(:,2,LABEL==2);
Xd = [-2, -1, 0, 1, 2, 3];
Yd = [0, 0, 0, 1, 1, 1];
figure(1)
plot(X,Y,'-b',Xd,Yd,'ob','LineWidth',1)
grid on;
set(gca,'FontSize',16);
xlabel('x','FontSize',16);
ylabel('f(x)','FontSize',16);
xlim([-3,4])
ylim([-0.2,1.4])