データからの太陽電池パラメーターの抽出
この例では、さまざまな温度にわたって定義されたデータを近似するための、Solar Cell ブロックのパラメーターの最適化を示します。MATLAB® 最適化関数 fminsearch
を使用します。Simscape™ Electrical™ モデルに対するこの種のパラメーター近似の実行に使用可能なその他の製品には、Optimization Toolbox™ や Simulink® Design Optimization™ があります。これらの製品は、GUI またはコマンド ライン アプローチを使用してブロックの操作と解析を行うための、事前定義された関数を提供します。
手法
2 ステップの手順を使用して、8 パラメーターの Solar Cell の I-V 出力曲線をデータに近似します。
Solar Cell の [メイン] ダイアログ タブのパラメーターを最適化して、出力曲線を室温におけるデータに一致させます。
Solar Cell の [温度] ダイアログ タブのパラメーターを最適化して、出力曲線を室温以外の温度におけるデータに一致させます。
データとブロックのセットアップ
MATLAB データ ファイル ee_solar_iv_data.mat には、Solar Cell データが構造体配列として格納されます。各構造体には、temperature、i (電流)、v (電圧) の 3 つのフィールドがあります。Solar Cell ブロックはデータ構造体を参照して、デバイスの動作温度と VPulse ブロックのパルス値 V2 を設定し、規定電圧におけるシミュレーションの出力電流を生成します。規定電圧は、規定の出力時間にシミュレーション結果を出力することによって設定されます。出力時間を設定するには、[モデル化] タブで [モデル設定] をクリックし、[コンフィギュレーション パラメーター] の [データのインポート/エクスポート] カテゴリで、[追加パラメーター] をクリックして [出力時間] を指定します。スコープは、出力電圧の応答と出力電流の応答を構造体データ Io.signal.values と Vo.signal.values として保存します。
% Load Solar Cell data load ee_solar_iv_data.mat % Display the Solar Cell model Model = 'ee_solar'; open_system(Model)
close_system(Model, 0);
初期パラメーター指定
fminsearch
の開始値は、Solar Cell ブロックの既定値、データシートの値、および次の方程式の組み合わせを使用して推定できます。
最適化前のパラメーターと初期値のリスト
ParsListMain = {'Is', 'Iph', 'ec', 'Rs', 'Rp'}; InitGuessMain = [ 3e-7 3.8 1.5 .004 10 ]; ParsListTemp = {'TIPH1', 'EG', 'TXIS1'}; InitGuessTemp = [ .001 1.11 3 ];
fminsearch
は関数の局所的最小値を特定する、制約なしの非線形オプティマイザーであるため、初期推定値を変更すると解のセットが変わります。
初期パラメーターを使用した、Solar Cell の出力に対するデータのプロット
8 パラメーターの Solar Cell モデルを読み込み、パラメーターを設定します。
load_system(Model); set_param([Model '/Solar Cell'], 'prm', '3') Pars = reshape([ParsListMain; cellstr(num2str(InitGuessMain'))'],1,[]); set_param([Model '/Solar Cell'], Pars{:}) Pars = reshape([ParsListTemp; cellstr(num2str(InitGuessTemp'))'],1,[]); set_param([Model '/Solar Cell'], Pars{:}) % Generate preliminary model curves and plot against data num_lines = length(iv_data); v_model = cell(1, num_lines); i_model = cell(1, num_lines); legend_info_data = cell(1, num_lines); legend_info_model = cell(1, num_lines); for idx_data = 1:num_lines sim(Model); v_model{idx_data} = Vo.signals.values; i_model{idx_data} = Io.signals.values; legend_info_data{idx_data} = [ 'Temp = ' ... num2str(iv_data(idx_data).temperature) '\circC, Data']; legend_info_model{idx_data} = [ 'Temp = ' ... num2str(iv_data(idx_data).temperature) '\circC, Model']; end plot([iv_data.v], [iv_data.i], 'd', [v_model{:}], [i_model{:}]) xlabel('Solar cell output voltage (V)'); ylabel('Solar cell output current (A)'); legend([legend_info_data legend_info_model], 'Location', 'Best'); title('Model with Initial Parameter Values');
誤差の二乗和の計算
ee_solar_lse
は、fminsearch
で最小化される関数です。この関数は、太陽電池の出力電流とデータの差に対する誤差の二乗和を返します。fminsearch
によって無効なパラメーター値が供給された場合、catch
ステートメントは、誤差として大きな値を返します。
室温における [メイン] タブ ダイアログのパラメーターの最適化 (手順 1)
% Find room temperature data index idx_data = find([iv_data.temperature]==25);%#ok % Optimize parameters in main dialog tab of Solar Cell ParsList = ParsListMain; OptParsMain = fminsearch(@ee_solar_lse, InitGuessMain, ... optimset('TolX', 1e-3)); % Update Solar Cell block with optimized parameters Pars = reshape([ParsList; cellstr(num2str(OptParsMain'))'],1,[]); set_param([Model '/Solar Cell'], Pars{:}); % Display optimized parameters display(sprintf(['Optimized parameters for the solar cell main ' ... 'dialog tab are:\n'])); display(sprintf('\t%5s = %s\n', Pars{:}));
Optimized parameters for the solar cell main dialog tab are: Is = 3.14978e-07 Iph = 3.80137 ec = 1.39989 Rs = 0.00415132 Rp = 10.1093
温度依存を制御するパラメーターの最適化 (手順 2)
% Find index into data for non-room temperatures idx_data = find([iv_data.temperature]~=25); % Optimize parameters in temperature dialog tab of Solar Cell ParsList = ParsListTemp; OptParsTemp = fminsearch(@ee_solar_lse, InitGuessTemp, ... optimset('TolX', 1e-3)); % Update Solar Cell block with optimized temperature parameters Pars = reshape([ParsList; cellstr(num2str(OptParsTemp'))'],1,[]); set_param([Model '/Solar Cell'], Pars{:}); % Display optimized parameters display(sprintf(['Optimized parameters for the solar cell ' ... 'temperature dialog tab are:\n'])); display(sprintf('\t%5s = %s\n', Pars{:}));
Optimized parameters for the solar cell temperature dialog tab are: TIPH1 = 0.00080492 EG = 1.1384 TXIS1 = 3.3842
最適化された曲線の表示
for idx_data = 1:num_lines sim(Model); v_model{idx_data} = Vo.signals.values; i_model{idx_data} = Io.signals.values; end plot([iv_data.v], [iv_data.i], 'd', [v_model{:}], [i_model{:}]) xlabel('Solar cell output voltage (V)'); ylabel('Solar cell output current (A)'); legend([legend_info_data legend_info_model], 'Location', 'Best'); title('Model with Optimized Parameter Values');
bdclose(Model)