2016-06-22 12 views
3

Matlabのソースワークスペースを定義し、関数内で使用すると「線形化」する方法はありますか?MATLABのソースワークスペースを 'linearize'に変更するにはどうしたらいいですか?

ここ短い最小実施例:

clear all 
sys = 'watertank'; 
open(sys) 
sys_io(1) = linio('watertank/PID Controller',1,'input'); 
sys_io(2) = linio('watertank/Water-Tank System',1,'openoutput'); 
linsys  = GetLinsys(sys,sys_io); 
disp(linsys.a) 

関数である:

function linsys = GetLinsys(sys,sys_io) 
A  = 10; 
linsys = linearize(sys,sys_io); 
end 

linearizeが中Aのinital値を使用するため、出力が

​​

あります'現在の'作業領域(A = 10)の値ではなく、 'ベース'作業領域(A = 20)。

しかし、私は、関数のコードがスクリプトに含まれている場合、これが得られる

-0.1000 

期待:

clear all 
sys = 'watertank'; 
open(sys) 
sys_io(1) = linio('watertank/PID Controller',1,'input'); 
sys_io(2) = linio('watertank/Water-Tank System',1,'openoutput'); 
A   = 10; 
linsys  = linearize(sys,sys_io); 
disp(linsys.a) 

はこのように、質問は:どのように私は同じことを得ることができます関数を使用して結果? simコマンドについては

、このオプションを経由して行うことができます。

options = simset('SrcWorkspace','current'); 
sim('modelname',[],options) 

hereを参照してください。 しかし、私は線形化のオプションで同様のものを見つけることができませんでした。

ご協力いただきありがとうございます。

答えて

1

Simulinkにパラメータを渡す標準的な方法は、MATLABのベースワークスペース経由で行われるようです。その後、

function linsys = GetLinsys(sys,sys_io) 
    assignin('base','A',10); 
    linsys = linearize(sys,sys_io); 
end 

sys = 'watertank'; 
open(sys) 
sys_io(1) = linio('watertank/PID Controller',1,'input'); 
sys_io(2) = linio('watertank/Water-Tank System',1,'openoutput'); 
linsys  = GetLinsys(sys,sys_io); 
disp(linsys.a) 

利回り

-0.1000 

などを呼び出す:つまり、関数からのSimulinkベースワークスペース内の変数を作成するためにA=10を渡すには、assignin関数を使用します期待される。

注、これはあなたが別の方法として、その時点でベースワークスペース...に存在する任意のAを、上書きするよう、少し危険であることを、私は次の関数

function linsys = GetLinsys(sys,sys_io) 

% Save old 'A', if exists 
if evalin('base', 'exist(''A'',''var'')'); 
    baseA = evalin('base','A'); 
end 
assignin('base','A',10) 

% Function call 
linsys = linearize(sys,sys_io); 

% Clean up 
evalin('base', 'clear(''A'')'); 
if exist('baseA', 'var') 
    assignin('base','A',baseA) 
end 

end 
を使用して提案したいです

Aという変数がベースワークスペースに存在し、その値がbaseAに保存されているかどうかを確認します。その後、安全に新しいAを割り当ててlinearizeに電話をかけることができます。最後に、clear Aを再度入力し、必要に応じて古いbaseAを再割り当てします。 - それほどエレガントではありませんが、より安全です。

私は簡単には存在しないことことから取ると思い

% Run the simulation. Do not need to simulate past 
    % the final specified time. Use the base workspace to write 
    % variables and simulate. This will be consistent with all 
    % linearization functions that require the model parameters be 
    % defined in the base workspace. 
    S = simset('DstWorkspace','base'); 
    pmgr.sim([Tstart Tfinal],S); 

simへの呼び出しの前に、以下のコメントが線形に関連MATLABROOT \ツールボックス内のファイル\ slcontrol \ slcontrolの様々な以内

+0

ご意見ありがとうございます。しかし、ベースワークスペースの変数を変更することは、私がその関数によって避けたいものです。 simコマンドでも可能なので、linearizeコマンドの解決策もあります。 –

+0

私は、関数呼び出しの前にベースワークスペースに存在する変数 'A 'を保存して復元する回避策を含んでいました。洗練されたソリューションではありませんが、仕事をしています。たぶん(うまくいけば!)誰かがこれを行う組み込みの、簡単な方法を思い付く - 私は本当にこの解決策が嫌いです。 – hbaderts

+0

ありがとうございました!しかし、もう一度:問題は、現在のワークスペースに変更する方法であり、ベースワークスペースをどのように操作するかではありません.-)誰かが考えてくれることを願っています。 –

1

/linearizeCaller Workspaceを使用するには、透明な(場合によっては難しくない)方法を使用します。それはCallersimがないあなたがlinearizeを呼び出しているところから、呼び出される関数形であると仮定してしまうためCallerワークスペースを使用することがsimに上記の呼び出しを変更

はオプションではありません。

Model Workspaceからデータを取得するように設定することができます。その場合は、linearizeを呼び出す前にそのワークスペースを設定して設定する必要があります。

関連する問題