Этот пример показывает оптимизацию параметров блока Solar Cell, чтобы соответствовать данным, заданным в области значений различных температур. Он использует оптимизационную функцию MATLAB ® fminsearch
. Другими продуктами, доступными для выполнения этого типа подгонки параметров с Simscape™ моделями Electrical™, являются Optimization Toolbox™ и Simulink ® Design Optimization™. Эти продукты обеспечивают предопределенные функции для манипулирования и анализа блоков с помощью графические интерфейсы пользователя или подхода командной строки.
Подгонка кривых I-V выходов для 8- Параметров Солнечной Камеры к данным с помощью 2-шаговой процедуры:
Оптимизируйте параметры в диалоговом окне Solar Камеры Main вкладки, чтобы соответствовать выходу кривых данным при комнатной температуре.
Оптимизируйте параметры в диалоговом окне Solar Камеры Temperature вкладки так, чтобы выход кривые совпадали с данными при не комнатной температуре.
Файл данных MATLAB, ee_solar_iv_data.mat, хранит данные Solar Cell как массив структур. Каждая структура содержит 3 поля: температура, i (ток) и v (напряжение). Блок Solar Cell ссылается на структуру данных, чтобы задать рабочую температуру устройства, значение Импульса блока VPulse, V2 и сгенерировать выходные токи симуляции при предписанных напряжениях. Заданные напряжения устанавливают путем выдачи результатов симуляции в установленные выходы раза. Чтобы задать время выхода, на вкладке Modeling, нажмите Model Settings; в разделе Параметры конфигурации, в категории Импорт/Экспорт данных, нажмите Дополнительные параметры и укажите время выхода. Возможности сохраняют выходные напряжения и токовые отклики как структурные данные, 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
является нелинейным оптимизатором без ограничений, который находит локальный минимум функции, изменение начальной оценки приведет к другому набору решений.
Загрузите 8 параметр Модель солнечной камеры и установите параметры
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
оператор возвращает большое значение ошибки.
% 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.14991e-07 Iph = 3.80143 ec = 1.39989 Rs = 0.00415127 Rp = 10.1088
% 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.00080491 EG = 1.1385 TXIS1 = 3.3812
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)