Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

データからの太陽電池パラメーターの抽出

この例では、さまざまな温度にわたって定義されたデータを近似するための、Solar Cell ブロックのパラメーターの最適化を示します。MATLAB® 最適化関数 fminsearch を使用します。Simscape™ Electrical™ モデルに対するこの種のパラメーター近似の実行に使用可能なその他の製品には、Optimization Toolbox™ や Simulink® Design Optimization™ があります。これらの製品は、GUI またはコマンド ライン アプローチを使用してブロックの操作と解析を行うための、事前定義された関数を提供します。

手法

2 ステップの手順を使用して、8 パラメーターの Solar Cell の I-V 出力曲線をデータに近似します。

  1. Solar Cell の [メイン] ダイアログ タブのパラメーターを最適化して、出力曲線を室温におけるデータに一致させます。

  2. Solar Cell の [温度] ダイアログ タブのパラメーターを最適化して、出力曲線を室温以外の温度におけるデータに一致させます。

データとブロックのセットアップ

MATLAB データ ファイル ee_solar_iv_data.mat には、Solar Cell データが構造体配列として格納されます。各構造体には、temperaturei (電流)、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 ブロックの既定値、データシートの値、および次の方程式の組み合わせを使用して推定できます。

$$I_{ph} = I_{sc}$$

$$I_s = {I_{ph} \over (exp(V_{oc} / (.025*ec)) - 1)}$$

$$R_s = {-dV \over dI} @V_{oc}$$

$$R_p = {-dV \over dI} @I_{sc}$$

最適化前のパラメーターと初期値のリスト

  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)