Платформа для управления запусками Matlab - PullRequest
1 голос
/ 08 апреля 2019

TL; DR: Как следует управлять пользовательскими прогонами симуляции в Matlab?Подробные вопросы в конце.

Я работаю с Matlab, где я создал некоторый код для проверки влияния различных параметров на моделируемую систему.Он имеет много входов и выходов, но MWE будет:

function [number2x,next_letter] = test(number, letter) 
    number2x = number * 2;
    next_letter = letter + 1;
    disp(['next letter is ' next_letter])
    disp(['number times 2 is ' num2str(number2x)])
end

Это работает, если это все, что нужно проверить.Однако со временем необходимо было добавить несколько новых входов и выходов.Кроме того, из-за растущего числа тестируемых параметров необходимо было создать какой-то журнал:

xlswrite('testfile.xlsx',[num2str(number), letter,num2str(number2x),next_letter],'append');

Кроме того, поскольку расчет занимает несколько часов и должен выполняться в течение ночи, нужно было запустить несколько наборов параметров.в одной точке.Это легко сделать с помощью [x1,y1] = test(1,'a');[x2,y2] = test(2,'b'); в одной строке или добавлением новых задач, пока старые еще выполняются.Однако, таким образом, вы не можете отслеживать, сколько еще открыто.

Итак, в общем, мне нужен какой-то каркас тестирования, который может не отставать от изменения ввода и вывода, отслеживает уже выполненные вычисления ив идеале также обрабатывает открытые трассы.

Я чувствую, что не могу быть единственным, кто сталкивается с этой проблемой, на самом деле я думаю, что так много людей сталкиваются с этой проблемой, что Mathworks уже нашел решение.

Для Simulink это было сделано в виде Simluationmanager , но для функций Matlab самое близкое, что я нашел, это Среда тестирования (пример ниже), который, кажется,скорее для разработки и отладки программного обеспечения, а не для того, что я пытаюсь.И в какой-то момент кажется, что есть сторонние решения , но они больше не поддерживают эту платформу тестирования.

function solutions = sampleTest
    solutions = functiontests({@paramtertest});
end

function paramtertest(vargin)
    test(1,'a');
    test(2,'b');
end

function [number2x,next_letter] = test(number, letter) 

    number2x = number * 2;
    next_letter = letter + 1;
    disp(['next letter is ' next_letter])
    disp(['number times 2 is ' num2str(number2x)])

    xlswrite('testfile.xlsx',[num2str(number), letter,num2str(number2x),next_letter],'append');
end

В качестве альтернативы я мог бы создать свой тест как класс, создать интерфейс, похожий на Simulationmanager, создать многочисленные функции для управления входами и выходами и визуализировать прогресс, а затем создать несколько экземпляров, если я хочу установитьсоздать новый набор параметров во время симуляции.Возможно, но много работы, которая не связана с симуляцией напрямую.

В итоге возникают следующие вопросы:

  • Есть ли встроенная функция Matlab для управления симуляциями, которую я полностью пропустилдо сих пор?
  • Можно ли использовать для этой цели инфраструктуру тестирования?
  • Есть ли уже какая-то платформа (не из Mathworks), которая может справиться с этим?
  • Если я создаюмой собственный класс, могут ли несколько экземпляров работать по отдельности и отслеживать свой прогресс?И будут ли они обрабатываться одновременно или Matlab в конечном итоге выполнит команду в том порядке, в котором они начали?

Я знаю, что этот вопрос несколько не в тему : порекомендуйте или найдите инструмент, библиотекуили любимый сторонний ресурс область.Если вы чувствуете, что это слишком много, пожалуйста, обратите внимание на последний вопрос.

Спасибо!

1 Ответ

0 голосов
/ 08 апреля 2019

Я провел подобные тесты, используя элементы графического интерфейса. Основная часть симуляции была внутри цикла while, например, в вашем случае:

iter = 0;
iter_max = 5; %the number of your times, you will call script
accu_step = 2; %the accuracy of stored data
Alphabet = 'abcdefghijklmnopqrstuvwxyz'
while iter < iter_max
    iter = iter+1;
    [x1,y1] = test(i,Alphabet(i));
end

Теперь вы должны создать дескриптор для индикатора прогресса в вашем скрипте вычислений. Он покажет вам, на каком шаге вы находитесь, и прогресс текущего шага.

global h;
global iter_opt;
if isempty(h)
  h=waitbar(0,'Solving...');
else
  waitbar(t/t_end,h,sprintf('Solving... current step is:%d',iter));
end

Вы не указали, какую функцию вы используете, если она, например, зависит от времени, приведенный выше пример t/t_end является оценкой текущего прогресса.

Решение результата также необходимо менять при каждом выполнении цикла, например:

global iter;
i_line = (t_end/accu_step+2)*(iter-1);
xlswrite('results.xlsx',{'ITERATION ', iter},sheet,strcat('A',num2str(i_line+5)))
xlswrite('results.xlsx',results_matrix(1:6),sheet,strcat('D',num2str(i_line+5)))

Приведенный выше пример также предполагал, что ваши результаты связаны со временем, поэтому вы сохраняете данные каждые 2 единицы времени (день, часы, минуты, что вам нужно), от t_0 до t_end, с дополнительными 2 ряда разделения, между ступенями. Количество столбцов приведено только для примера, вы можете настроить его в соответствии со своими потребностями.

После завершения расчета вы можете закрыть waitbar с помощью:

global h
close(h)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...