Добрый день. Я приступила сегодня к самостоятельному изучению курса "Моделирование систем". Хочу понять - необходимо ли отсылать мои решения практических заданий на сайт, (и если да - то где найти волшебную кнопку "Загрузить...") или практические задания остаются полностью на моей совести? (никто не проверяет, и отчётности по ним я предоставлять не обязана?) P.S.: тьютора я не брала |
Планирование и обработка результатов пассивного эксперимента
Практическая часть
1. Оценка параметров одномерной функции отклика
При создании моделирующего алгоритма оценивания параметров одномерной функции отклика принимаем во внимание, что наблюдения функции отклика представляют собой случайные величины, распределенные по нормальному закону [1, 12]. При этом ранг матрицы планирования будем считать равным числу оцениваемых параметров. Входные величины в принципе могут быть произвольными.
Моделирующий алгоритм будет следующим:
- Задание базы выхода.
- Задание входных воздействий по произвольному вероятностному закону.
- Определение вектора выхода для r опытов.
- Определение матрицы входа для r опытов.
- Определение оценки вектора параметров.
- Проверка заданной погрешности.
- Расчет остаточной суммы квадратов.
Пример 1. По заданной базе выхода (например, 6.78) и трем входным воздействий, заданных по вероятностному закону, определите параметры линейной регрессионной зависимости. Произведите оценку погрешности и рассчитайте остаточную сумму квадратов.
Программный код решения примера:
clear,clc % ПАРАМЕТРЫ ДИАЛОГОВОГО ОКНА inputdlg options.Resize = 'on'; options.WindowStyle = 'normal'; options.Interpreter = 'tex'; %-------------------------------------- X = inputdlg({'\bf Ввод значения функции отклика...................'}, 'База функции отклика', 1, {'6.78'}, options); Xb = str2num(char(X)); if prod(size(Xb)) ~= 1 | isempty(Xb) == 1 | ... ~isreal(Xb) | isinf(Xb) | isnan(Xb) errordlg('Отклик функции должен быть одним действительным числом',... 'Ошибка ввода функции отклика'); return end ms = inputdlg({'\bfМатематическое ожидание нормального закона:','\bfСтандартное отклонение нормального закона: .......'},... 'Параметры',1,{'0','1'},options); m = str2num(char(ms(1))); s = str2num(char(ms(2))); if isempty(m) | prod(size(m)) ~= 1 | ~isreal(m) | isinf(m) | isnan(m) errordlg('Математическое ожидание должно быть одним действительным числом',... 'Ошибка ввода математического ожидания'); return end if isempty(s) | prod(size(s)) ~= 1 | ~isreal(s) | ... isinf(s) == 1 | s <= 0 | isnan(s) errordlg('Стандартное отклонение должно быть действительным числом больше нуля',... 'Ошибка ввода стандартного отклонения'); return end % ВВОД РАЗМЕРНОСТИ ВХОДА И ЧИСЛА ОПЫТОВ u = inputdlg({'\bfЧисло входов:...',... '\bfЧисло опытов в эксперименте:..................................'},... 'Параметры эксперимента:',1,{'3','10'},options); p = str2num(char(u)); if isempty(p) | prod(size(p(1))) ~= 1 | ~isreal(p(1)) | ... isinf(p(1)) | p(1) ~= round(p(1)) | p(1) <= 0 | isnan(p(1)) errordlg('Число входов должно быть натуральным числом',... 'Ошибка ввода числа входов'); return end if isempty(p(2)) | prod(size(p(2))) ~= 1 | isnan(p(2)) | ... ~isreal(p(2)) | isinf(p(2)) | p(2) ~= round(p(2)) errordlg('Число опытов должно быть натуральным числом',... 'Ошибка ввода числа опытов'); return end if p(2) <= p(1) + 1 errordlg('Число опытов должно быть больше числа входов на 2 единицы ',... 'Ошибка ввода числа опытов'); return end %----------------------------------------------------------------- % ЗАДАНИЕ ПОГРЕШНОСТИ ПО ВЫХОДУ if abs(Xb) > 0.001 zet = inputdlg({'\bfВеличина относительной погрешности в процентах:..................'},... 'Относительная погрешность по выходу',1,{'0.5'}, options); dz = str2num(char(zet)); if isempty(dz) | prod(size(dz)) ~= 1 | ~isreal(dz) | ... isinf(dz) == 1 | dz <= 0 | isnan(dz) errordlg('Погрешность должна быть действительным числом больше нуля...',... 'Ошибка ввода относительной погрешности'); return end else zet = inputdlg({'\bfВеличина абсолютной погрешности по выходу:...'},... sprintf('Абсолютная погрешность '),1,{'0.001'}, options); dz = str2num(char(zet)); if isempty(dz) | prod(size(dz)) ~= 1 | isreal(dz) == 0 | ... isinf(dz) == 1 | dz <= 0 | isnan(dz) errordlg('Погрешность должна быть действительным числом больше нуля',... 'Ошибка ввода абсолютной погрешности'); return end end %----------------------------------------------------------------- Ub = [1,randn(1,p(1))]; %------------------------------------------------------------------ k = p(2); % ЧИСЛО ОПЫТОВ d = 100; n = 0; % dz - ПОГРЕШНОСТЬ ПО ВЫХОДУ while d > dz n = n + 1; % ФОРМИРОВАНИЕ ВЕКТОРА ВЫХОДА С ПОВТОРНЫМИ ОПЫТАМИ for I = 1:k R(I) = normrnd(m,s); end X = Xb + R'; %------------------------------------ U = Ub(2) + randn(k,1); % p(1) - ЧИСЛО ВХОДОВ for J = 1:p(1) - 1 U = [U,Ub(J) + rand(k,1)]; end U1 = [ones(length(U(:,1)),1),U]; %------------------------------------ b = inv(U1'*U1)*U1'*X; %------------------------------------ % РАСЧЕТНОЕ ЗНАЧЕНИЕ ВЫХОДА Xpac = Ub*b; %------------------------------------ % ОТНОСИТЕЛЬНАЯ ПОГРЕШНОСТЬ В ПРОЦЕНТАХ if abs(Xb) > 0.001 d = abs(Xpac-Xb)/abs(Xb)*100; else d = abs(Xpac-Xb); end end %------------------------------------ % ОСТАТОЧНАЯ СУММА КВАДРАТОВ Q = (X - U1*b)'*(X - U1*b); %------------------------------------ disp(sprintf('\n ОБРАБОТКА РЕЗУЛЬТАТОВ ПАССИВНОГО ЭКСПЕРИМЕНТА')); disp(sprintf(' Базовый выход Xb = %g',Xb)) fprintf(' Параметры нормального закона для формирования повторных опытов выхода:\n'); fprintf('\t математическое ожидание m = %g\n',m); fprintf('\t cтандартное отклонение s = %g\n',s); disp(sprintf('\t Число входов m = %g',length(Ub) - 1)); disp(sprintf('\t Значения входного воздействия:')); for J = 2 : length(Ub) fprintf('\t %-g\n', Ub(J)); end fprintf('\n'); if abs(Xb) > 0.001 fprintf('\t Заданная относительная погрешность в процентах: %g%s\n',dz,'%') else fprintf('\t Заданная абсолютная погрешность: %g\n',dz); end disp('--------------------------------------------------------------') fprintf('\t Число повторных опытов в эксперименте: %d\n',p(2)) fprintf('\n\t Расчетная матрица входных воздействий с повторными опытами:\n'); disp(U1) fprintf('\t Расчетный вектор выхода с повторными опытами:\n') fprintf('\t %-g\n',X) if abs(Xb) > 0.001 disp('--------------------------------------------------------------') disp(sprintf('\t Расчетный выход Xpac = %g\n\t Погрешность расчета в процентах d = %g%s',... Xpac,d,'%')) elseif abs(Xb) <= 0.001 disp('--------------------------------------------------------------') disp(sprintf('\t Расчетный выход Xpac = %g\n\t Абсолютная погрешность расчета d = %g', Xpac,d)) end fprintf('\t РАСЧЕТНЫЕ КОЭФФИЦИЕНТЫ УРАВНЕНИЯ РЕГРЕССИИ:'); for J = 1 : length(b) fprintf('\n\t b%d = %-g', J-1, b(J)); end fprintf('\n'); disp(sprintf('\t Остаточная сумма квадратов Q = %g',Q)) disp(sprintf('\t Число итераций по условию проверки погрешности n = %g',n)) fprintf('\n\t 1) Символьное уравнение регрессии:\n'); bn = length(b); fprintf('\t\t y = '),fprintf('b0 + '); for J = 1:bn - 2 fprintf('b%d*x%d + ',J,J); end fprintf('b%d*x%d\n',bn - 1,bn - 1); fprintf('\t 2) Уравнение регрессии с числовыми оценочными параметрами:\n') bn = length(b); fprintf(' y = '),fprintf('%g + ',b(1)); for J = 2 : (bn - 1) fprintf('(%g)*x%d + ',b(J),J - 1); end fprintf('(%g)*x%d\n',b(end), bn - 1); disp('--------------------------------------------------------');
Ниже приводится одна из возможных реализаций выполнения программы (т. к. выход и входы смоделированы по случайным законам).
ОБРАБОТКА РЕЗУЛЬТАТОВ ПАССИВНОГО ЭКСПЕРИМЕНТА Базовый выход: Xb = 6.78 Параметры нормального закона для формирования повторных опытов выхода: математическое ожидание: m = 0 cтандартное отклонение: s = 1 Число входов: m = 3 Значения входного воздействия: -1.01743 -1.4031 -0.260899 Заданная относительная погрешность в процентах: 0.5% -------------------------------------------------------------- Число повторных опытов в эксперименте: 10 Расчетная матрица входных воздействий с повторными опытами: 1.0000 -0.0259 1.8706 -0.8428 1.0000 -2.0962 1.5201 -0.2298 1.0000 -0.7237 1.4284 -0.1887 1.0000 -1.4151 1.6469 -0.7250 1.0000 -0.8569 1.3781 -0.1382 1.0000 -0.3895 1.9245 -0.0297 1.0000 -2.4837 1.0058 -0.9198 1.0000 0.0256 1.7664 -0.6273 1.0000 -1.1517 1.6920 -0.8416 1.0000 -0.9158 1.1305 -0.5560 Расчетный вектор выхода с повторными опытами: 5.86991 5.30057 9.27119 9.05969 6.35003 9.75507 8.46856 6.92237 9.01667 5.847 -------------------------------------------------------------- Расчетный выход: Xpac = 6.80021 Погрешность расчета в процентах: d = 0.298114% РАСЧЕТНЫЕ КОЭФФИЦИЕНТЫ УРАВНЕНИЯ РЕГРЕССИИ: b0 = 6.48866 b1 = -0.159952 b2 = -0.0359629 b3 = -0.376992 Остаточная сумма квадратов: Q = 9.89971 Число итераций по условию проверки погрешности: n = 184 1) Символьное уравнение регрессии: y = b0 + b1*x1 + b2*x2 + b3*x3 2) Уравнение регрессии с числовыми оценочными параметрами: y = 6.48866 + (-0.159952)*x1 + (-0.0359629)*x2 + (-0.376992)*x3 --------------------------------------------------------------
Задание 1
- В программе объясните цикл проверки условия погрешности по выходу.
- Проверьте программу для случая задания абсолютной погрешности по выходу.
- Видоизмените программу так, чтобы расчеты производились без формирования столбца единиц в матрице входных воздействий с повторными опытами.
- Расчет вектора оценочных параметров произведите по встроенной функции
системы MATLAB (см.
).
- Расчет вектора оценочных параметров произведите по встроенной функции
системы MATLAB (см.
). Для функции
нет необходимости формировать столбец фиктивной переменной, равной единице.
- Расчет вектора оценочных параметров произведите по встроенной функции
системы MATLAB (см.
). Произвести также расчет значений функции отклика с помощью функции
системы MATLAB (см.
).
Примечание. Описание функций ,
,
на русском языке можно найти на сайте http://matlab.exponenta.ru в разделе Statistics Toolbox.