Matlab_Simulink:fminsearch_fminconをSimulinkで活用・連携(無料公開)

実現したいこと

  • Simulinkを用いたfminsearchによる最適化

Matlabのバージョン

Matlab2021a
※ダウンロード形式として過去のバージョンも用意

必要なtoolbox

ダウンロードURL

【ダウンロードリンク】
Simulink_fminsearch - Google ドライブ

※ご利用中のMatlabバージョンのフォルダをダウンロードしてください。
 例:2021aバージョンであれば,下記リンクの「2021a」を選択
※上記プログラムの利用で生じたトラブルは一切の責任を負いかねます

フォルダ構成

上記ダウンロードし展開。
(下記のようなフォルダ構成になっていることを確認)

実行方法

「Main_fmin_test.m」を実行

問題設定

下記のSimulinkブロックにおいて,二つのブロックが全く同じ結果になるように,x1, x2を最適化したい。(解:x1=5, x2 = 10)

Simulink設定

ファイル名:fmin_simulink.slx

mファイルソースコード:①Main_fmin_test.mファイル

%% 初期化
clc         % コマンドウィンドウの初期化
clear       % ワークスペースの初期化
close all   % グラフを全部閉じる

%% Simulinkファイル名
N_File = 'fmin_simulink.slx'; % simulinkファイル名

%% fminsearch
ini_x = [0.5 0.5]; % 初期値
[x, fval] = fminsearch(@(x) func_fmin_test(x,N_File),ini_x);

%% Simulink実行(結果確認用)
sim(N_File);

%% Scopeデータの取得
t = ScopeData.time;
y1 = ScopeData.signals.values(:, 1);
y2 = ScopeData.signals.values(:, 2);

%% Simulinkの結果の描画
figure
plot(t, y1, 's-')
hold on
plot(t, y2, 'ro--')
grid on;
legend('true value','estimated value');
xlabel('$$ t {\rm [s]} $$', 'interpreter', 'latex');
ylabel('$$ y_1(t), y_2(t) $$', 'interpreter', 'latex');

mファイルソースコード:②func_fmin_test.mファイル

function f = func_fmin_test(x,filename)
%% 変数宣言
x1 = x(1);
x2 = x(2);

assignin('base','x1',x1);
assignin('base','x2',x2);

%% Simulink実行
sim(filename);

%% Scopeデータの取得
t = ScopeData.time;
y1 = ScopeData.signals.values(:, 1);
y2 = ScopeData.signals.values(:, 2);

%% 評価規範
f = sum((y1-y2).^2);

%% コマンドウィンドウ表示
fprintf('[x1, x2, fval] = %.3g, %.3g, %.3g\n',x1, x2, f);

実行結果

併せて確認推奨の過去記事

forfree.hatenablog.jp