Мордовский государственный университет имени Н.П. Огарева
Опубликован: 30.11.2010 | Доступ: свободный | Студентов: 3283 / 1985 | Оценка: 4.12 / 4.13 | Длительность: 14:37:00
ISBN: 978-5-9963-0352-6
Лекция 9:

Планирование и обработка результатов пассивного эксперимента

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Практическая часть

1. Оценка параметров одномерной функции отклика

При создании моделирующего алгоритма оценивания параметров одномерной функции отклика принимаем во внимание, что наблюдения функции отклика представляют собой случайные величины, распределенные по нормальному закону [1, 12]. При этом ранг матрицы планирования будем считать равным числу оцениваемых параметров. Входные величины в принципе могут быть произвольными.

Моделирующий алгоритм будет следующим:

  1. Задание базы выхода.
  2. Задание входных воздействий по произвольному вероятностному закону.
  3. Определение вектора выхода для r опытов.
  4. Определение матрицы входа для r опытов.
  5. Определение оценки вектора параметров.
  6. Проверка заданной погрешности.
  7. Расчет остаточной суммы квадратов.

Пример 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

  1. В программе объясните цикл проверки условия погрешности по выходу.
  2. Проверьте программу для случая задания абсолютной погрешности по выходу.
  3. Видоизмените программу так, чтобы расчеты производились без формирования столбца единиц в матрице входных воздействий с повторными опытами.
  4. Расчет вектора оценочных параметров произведите по встроенной функции regress системы MATLAB (см. help\mbox{  }regress ).
  5. Расчет вектора оценочных параметров произведите по встроенной функции robustfit системы MATLAB (см. help\mbox{  }robustfit ). Для функции robustfit нет необходимости формировать столбец фиктивной переменной, равной единице.
  6. Расчет вектора оценочных параметров произведите по встроенной функции glmfit системы MATLAB (см. help\mbox{  }glmfit ). Произвести также расчет значений функции отклика с помощью функции glmval системы MATLAB (см. help\mbox{  }glmval ).

Примечание. Описание функций robustfit, glmfit, glmval на русском языке можно найти на сайте http://matlab.exponenta.ru в разделе Statistics Toolbox.

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Мария Ястребинская
Мария Ястребинская

Добрый день. Я приступила сегодня к самостоятельному изучению курса "Моделирование систем". Хочу понять - необходимо ли отсылать мои решения практических заданий на сайт, (и если да - то где найти волшебную кнопку "Загрузить...") или практические задания остаются полностью на моей совести? (никто не проверяет, и отчётности по ним я предоставлять не обязана?)

P.S.: тьютора я не брала

алена зянтерекова
алена зянтерекова