Advertisement
aidanozo

Untitled

Dec 8th, 2024
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 9.79 KB | None | 0 0
  1. % Tema 1: Identificarea instalației ASTANK2
  2.  
  3. % **Încărcarea datelor**
  4. load('Lab4_date_ASTANK2.mat'); % Încarcă datele din fișier (structura Did conține y (ieșiri) și u (intrări))
  5.  
  6. % **Extragerea datelor de intrare și ieșire**
  7. y1_ident = Did.y(:,1); % Ieșire sistem canal 1
  8. y2_ident = Did.y(:,2); % Ieșire sistem canal 2
  9. u1_ident = Did.u(:,1); % Intrare sistem canal 1
  10. u2_ident = Did.u(:,2); % Intrare sistem canal 2
  11.  
  12. % **Crearea obiectelor IDDATA pentru modelele ARX și ARMA**
  13. D1 = iddata(Did.y(:,1), [Did.u(:,1) Did.u(:,2)]); % Obiect IDDATA pentru canalul 1
  14. D2 = iddata(Did.y(:,2), [Did.u(:,1) Did.u(:,2)]); % Obiect IDDATA pentru canalul 2
  15.  
  16. % **Normalizarea ieșirilor (pentru comparații corecte)**
  17. y1_norm = norm(detrend(Did.y(:,1), 'constant')); % Norma ieșirii canalului 1
  18. y2_norm = norm(detrend(Did.y(:,2), 'constant')); % Norma ieșirii canalului 2
  19.  
  20. % **Generarea seturilor aleatoare de parametri pentru modelele ARX**
  21. index1ARX = randi([1 30],20,3); % Parametrii ARX pentru canalul 1: aleatori între 1 și 30
  22. index2ARX = randi([1 30],20,3); % Parametrii ARX pentru canalul 2
  23.  
  24. % **Generarea seturilor aleatoare de parametri pentru modelele ARMA**
  25. index1ARMA = randi([1 60],10,2); % Parametrii ARMA pentru canalul 1: aleatori între 1 și 60
  26. index2ARMA = randi([1 60],10,2); % Parametrii ARMA pentru canalul 2
  27.  
  28. % **Inițializarea variabilelor pentru modelele și rezultate**
  29. matrice1ARX = cell(20, 1); % Modelele ARX canal 1
  30. matrice2ARX = cell(20, 1); % Modelele ARX canal 2
  31. matrice1ARMA = cell(10, 1); % Modelele ARMA canal 1
  32. matrice2ARMA = cell(10, 1); % Modelele ARMA canal 2
  33.  
  34. v1 = cell(20,1); % Reziduurile ieșire reală - ieșire simulată pentru canal 1
  35. v2 = cell(20,1); % Reziduurile ieșire reală - ieșire simulată pentru canal 2
  36.  
  37. e1 = cell(10,1); % Erorile pentru modelele ARMA canal 1
  38. e2 = cell(10,1); % Erorile pentru modelele ARMA canal 2
  39.  
  40. % Variabile pentru calitatea modelelor (SNR)
  41. snr1ARX = zeros(20,1); % SNR pentru ARX canal 1
  42. snr2ARX = zeros(20,1); % SNR pentru ARX canal 2
  43. snr1ARMA = zeros(10,1); % SNR pentru ARMA canal 1
  44. snr2ARMA = zeros(10,1); % SNR pentru ARMA canal 2
  45.  
  46. ys1ARX = cell(20,1); % Ieșiri simulate ARX canal 1
  47. ys2ARX = cell(20,1); % Ieșiri simulate ARX canal 2
  48. ys1ARMA = cell(10,1); % Ieșiri simulate ARMA canal 1
  49. ys2ARMA = cell(10,1); % Ieșiri simulate ARMA canal 2
  50.  
  51. % **Bucla principală pentru generarea modelelor ARX**
  52. for i = 1:20
  53.    % Încearcă să creeze modelul ARX pentru canalul 1
  54.    try
  55.        matrice1ARX{i} = armax(D1, [index1ARX(i, 1) [index1ARX(i, 2) index1ARX(i, 3)] 0 [1 1]]);
  56.    catch
  57.        matrice1ARX{i} = []; % Dacă apare eroare, salvează un model gol
  58.    end
  59.  
  60.    % Încearcă să creeze modelul ARX pentru canalul 2
  61.    try
  62.        matrice2ARX{i} = armax(D2, [index2ARX(i, 1) [index2ARX(i, 2) index2ARX(i, 3)] 0 [1 1]]);
  63.    catch
  64.        matrice2ARX{i} = [];
  65.    end
  66.  
  67.    % Determinăm lungimea maximă a coeficienților
  68.    max1 = max(index1ARX(i,:));
  69.    max2 = max(index2ARX(i,:));
  70.  
  71.    % Salvează primele valori simulate (folosite pentru inițializare)
  72.    ys1ARX{i} = y1_ident(1:max1);
  73.    ys2ARX{i} = y2_ident(1:max2);
  74.  
  75.    % Calculează ieșirea simulată pe baza coeficienților (dacă modelul e valid)
  76.    if ~isempty(matrice1ARX{i})
  77.        a_matrice1 = matrice1ARX{i}.a(2:end);
  78.        b1_matrice1 = matrice1ARX{i}.b{1}(2:end);
  79.        b2_matrice1 = matrice1ARX{i}.b{2}(2:end);
  80.  
  81.        ys = ys1ARX{i};
  82.        for j = (max1 + 1):length(y1_ident)
  83.            yst = b1_matrice1 * flip(u1_ident((j-length(b1_matrice1)):(j-1))) + ...
  84.                  b2_matrice1 * flip(u2_ident((j-length(b2_matrice1)):(j-1))) - ...
  85.                  a_matrice1 * flip(ys((end-length(a_matrice1)+1):end));
  86.            ys = [ys; yst];
  87.        end
  88.        ys1ARX{i} = ys; % Salvează rezultatul simulării
  89.    else
  90.        ys1ARX{i} = [];
  91.    end
  92.    v1{i} = y1_ident - ys1ARX{i}; % Calculul reziduurilor pentru canalul 1
  93.  
  94.    % Proces similar pentru canalul 2
  95.    if ~isempty(matrice2ARX{i})
  96.        a_matrice2 = matrice2ARX{i}.a(2:end);
  97.        b1_matrice2 = matrice2ARX{i}.b{1}(2:end);
  98.        b2_matrice2 = matrice2ARX{i}.b{2}(2:end);
  99.  
  100.        ys = ys2ARX{i};
  101.        for j = (max2 + 1):length(y2_ident)
  102.            yst = b1_matrice2 * flip(u1_ident((j-length(b1_matrice2)):(j-1))) + ...
  103.                  b2_matrice2 * flip(u2_ident((j-length(b2_matrice2)):(j-1))) - ...
  104.                  a_matrice2 * flip(ys((end-length(a_matrice2)+1):end));
  105.            ys = [ys; yst];
  106.        end
  107.        ys2ARX{i} = ys;
  108.    else
  109.        ys2ARX{i} = [];
  110.    end
  111.    v2{i} = y2_ident - ys2ARX{i}; % Calculul reziduurilor pentru canalul 2
  112. end
  113.  
  114. % **Selectarea celui mai bun model ARX pe baza SNR**
  115. for i = 1:20
  116.     if ~isempty(ys1ARX{i})
  117.         snr1ARX(i) = 20 * log10(y1_norm / norm(v1{i}));
  118.     end
  119.     if ~isempty(ys2ARX{i})
  120.         snr2ARX(i) = 20 * log10(y2_norm / norm(v2{i}));
  121.     end
  122. end
  123.  
  124. [MSnr1, poz1ARX] = max(snr1ARX); % Modelul ARX optim pentru canalul 1
  125. [MSnr2, poz2ARX] = max(snr2ARX); % Modelul ARX optim pentru canalul 2
  126.  
  127. % **Generarea modelelor ARMA pe reziduurile ARX**
  128. D1ARMA = iddata(v1{poz1ARX}); % Datele reziduale pentru canalul 1
  129. D2ARMA = iddata(v2{poz2ARX}); % Datele reziduale pentru canalul 2
  130.  
  131. % **Generarea modelelor ARMA pentru reziduurile ARX**
  132. for i = 1:10
  133.    % Încearcă să creeze un model ARMA pentru canalul 1
  134.    try
  135.        matrice1ARMA{i} = armax(D1ARMA, [index1ARMA(i, 1) index1ARMA(i, 2)]); % Model ARMA pentru canalul 1
  136.    catch
  137.        matrice1ARMA{i} = []; % Dacă apare o eroare, salvează model gol
  138.    end
  139.  
  140.    % Încearcă să creeze un model ARMA pentru canalul 2
  141.    try
  142.        matrice2ARMA{i} = armax(D2ARMA, [index2ARMA(i, 1) index2ARMA(i, 2)]); % Model ARMA pentru canalul 2
  143.    catch
  144.        matrice2ARMA{i} = []; % Dacă apare o eroare, salvează model gol
  145.    end
  146.  
  147.    % Simulează ieșirile pentru ARMA canal 1 și calculează erorile
  148.    if ~isempty(matrice1ARMA{i})
  149.        ys1ARMA{i} = predict(matrice1ARMA{i}, D1ARMA); % Prevede valorile pentru canalul 1
  150.        e1{i} = v1{poz1ARX} - ys1ARMA{i}.y; % Calculul erorilor (reziduu - predicție)
  151.    else
  152.        e1{i} = []; % Dacă nu există model, lasă gol
  153.    end
  154.  
  155.    % Simulează ieșirile pentru ARMA canal 2 și calculează erorile
  156.    if ~isempty(matrice2ARMA{i})
  157.        ys2ARMA{i} = predict(matrice2ARMA{i}, D2ARMA); % Prevede valorile pentru canalul 2
  158.        e2{i} = v2{poz2ARX} - ys2ARMA{i}.y; % Calculul erorilor (reziduu - predicție)
  159.    else
  160.        e2{i} = [];
  161.    end
  162. end
  163.  
  164. % **Selectarea celui mai bun model ARMA pe baza SNR**
  165. for i = 1:10
  166.     % Calculul SNR pentru canalul 1
  167.     if ~isempty(e1{i})
  168.         snr1ARMA(i) = 20 * log10(norm(v1{poz1ARX}) / norm(e1{i}));
  169.     end
  170.  
  171.     % Calculul SNR pentru canalul 2
  172.     if ~isempty(e2{i})
  173.         snr2ARMA(i) = 20 * log10(norm(v2{poz2ARX}) / norm(e2{i}));
  174.     end
  175. end
  176.  
  177. % Determinarea celor mai bune modele ARMA
  178. [MSnr1ARMA, poz1ARMA] = max(snr1ARMA); % Cel mai bun model ARMA canal 1
  179. [MSnr2ARMA, poz2ARMA] = max(snr2ARMA); % Cel mai bun model ARMA canal 2
  180.  
  181. % **Combinarea modelelor ARX și ARMA**
  182. Yfinal1 = ys1ARX{poz1ARX} + ys1ARMA{poz1ARMA}.y; % Ieșirea finală simulată canal 1
  183. Yfinal2 = ys2ARX{poz2ARX} + ys2ARMA{poz2ARMA}.y; % Ieșirea finală simulată canal 2
  184.  
  185. % **Vizualizări**
  186.  
  187. % a) Intrările și ieșirile măsurate pentru fiecare canal
  188. figure;
  189. subplot(2,1,1);
  190. plot(u1_ident);
  191. title('Date de intrare - Canal 1');
  192. xlabel('Timp');
  193. ylabel('Amplitudine');
  194. subplot(2,1,2);
  195. plot(y1_ident);
  196. title('Date de ieșire - Canal 1');
  197. xlabel('Timp');
  198. ylabel('Amplitudine');
  199.  
  200. figure;
  201. subplot(2,1,1);
  202. plot(u2_ident);
  203. title('Date de intrare - Canal 2');
  204. xlabel('Timp');
  205. ylabel('Amplitudine');
  206. subplot(2,1,2);
  207. plot(y2_ident);
  208. title('Date de ieșire - Canal 2');
  209. xlabel('Timp');
  210. ylabel('Amplitudine');
  211.  
  212. % b) Ieșirea simulată a modelului ARX optim, comparată cu ieșirea măsurată
  213. figure;
  214. plot(ys1ARX{poz1ARX});
  215. hold on;
  216. plot(y1_ident);
  217. legend('ARX simulată', 'Ieșire măsurată');
  218. title('Comparare ARX Canal 1');
  219. xlabel('Timp');
  220. ylabel('Amplitudine');
  221. text(500, max(y1_ident), ['SNR ARX1 = ', num2str(snr1ARX(poz1ARX))]);
  222. hold off;
  223.  
  224. figure;
  225. plot(ys2ARX{poz2ARX});
  226. hold on;
  227. plot(y2_ident);
  228. legend('ARX simulată', 'Ieșire măsurată');
  229. title('Comparare ARX Canal 2');
  230. xlabel('Timp');
  231. ylabel('Amplitudine');
  232. text(500, max(y2_ident), ['SNR ARX2 = ', num2str(snr2ARX(poz2ARX))]);
  233. hold off;
  234.  
  235. % c) Ieșirea simulată a modelului ARMA optim, comparată cu zgomotul rezidual
  236. figure;
  237. plot(ys1ARMA{poz1ARMA}.y);
  238. hold on;
  239. plot(v1{poz1ARX});
  240. legend('ARMA simulată', 'Zgomot colorat');
  241. title('Comparare ARMA Canal 1');
  242. xlabel('Timp');
  243. ylabel('Amplitudine');
  244. text(500, max(v1{poz1ARX}), ['SNR ARMA1 = ', num2str(snr1ARMA(poz1ARMA))]);
  245. hold off;
  246.  
  247. figure;
  248. plot(ys2ARMA{poz2ARMA}.y);
  249. hold on;
  250. plot(v2{poz2ARX});
  251. legend('ARMA simulată', 'Zgomot colorat');
  252. title('Comparare ARMA Canal 2');
  253. xlabel('Timp');
  254. ylabel('Amplitudine');
  255. text(500, max(v2{poz2ARX}), ['SNR ARMA2 = ', num2str(snr2ARMA(poz2ARMA))]);
  256. hold off;
  257.  
  258. % d) Ieșirea totală simulată (ARX + ARMA), comparată cu ieșirea măsurată
  259. figure;
  260. plot(Yfinal1);
  261. hold on;
  262. plot(y1_ident);
  263. legend('Simulare totală', 'Ieșire măsurată');
  264. title('Simulare Totală ARX+ARMA Canal 1');
  265. xlabel('Timp');
  266. ylabel('Amplitudine');
  267. hold off;
  268.  
  269. figure;
  270. plot(Yfinal2);
  271. hold on;
  272. plot(y2_ident);
  273. legend('Simulare totală', 'Ieșire măsurată');
  274. title('Simulare Totală ARX+ARMA Canal 2');
  275. xlabel('Timp');
  276. ylabel('Amplitudine');
  277. hold off;
  278.  
  279. % e) Zgomot alb rezidual
  280. figure;
  281. plot(e1{poz1ARMA});
  282. title('Zgomot alb rezidual Canal 1');
  283. xlabel('Timp');
  284. ylabel('Amplitudine');
  285. text(500, max(e1{poz1ARMA}), ['\lambdae1^2 = ', num2str(norm(e1{poz1ARMA}))]);
  286.  
  287. figure;
  288. plot(e2{poz2ARMA});
  289. title('Zgomot alb rezidual Canal 2');
  290. xlabel('Timp');
  291. ylabel('Amplitudine');
  292. text(500, max(e2{poz2ARMA}), ['\lambdae2^2 = ', num2str(norm(e2{poz2ARMA}))]);
  293.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement