====== Różnice ====== Różnice między wybraną wersją a wersją aktualną.
aniss2016_17 [2017/12/11 11:43] miller [Lab. 7] |
aniss2016_17 [2018/01/17 09:21] (aktualna) miller [Lab. 7 (2017)] |
||
---|---|---|---|
Linia 96: | Linia 96: | ||
- | ====== Lab. 6 ====== | + | ====== Lab. 6 (2017) ====== |
- | Kartkówka: | + | Kartkówka - wg zagadnień i przykładowych zadań wysłanych do systemu Dziekanat. |
- | * Budowanie diagramów modeli ciągłych w Simulinku, np.: | + | |
- | - Ze zbiornika (jak na ćwiczeniu) woda wylewa się rurką w dnie do drugiego zbiornika położonego niżej. Z niższego zbiornika też wypływa woda rurką w dnie. Symulujemy poziomy wody w obu zbiornikach. | + | |
- | - W zamkniętym, pustym pomieszczeniu (np. pokoju) jest grzejnik elektryczny o mocy P i znikomej pojemności cieplnej. Powietrze w pomieszczeniu nagrzewa się, ale jednocześnie ciepło przenika przez ściany (ilość tego ciepła zależy proporcjonalnie od różnicy temperatur w pomieszczeniu i na zewnątrz, temperatura otoczenia jest stała. Symulujemy przebieg temperatury powietrza w pomieszczeniu. | + | |
- | - Układ elektryczny RC - do źródła prądu dołączony równolegle połączony kondensator i rezystor. Symulujemy natężenie prądu przepływającego przez rezystor, | + | |
- | - Dwa poprzednie obiekty łączymy w jeden układ: grzejnik z przykładu (2) jest rezystorem z przykładu (3). | + | |
- | - W pokoju stoi lodówka, która jest włączona i pobiera z sieci moc P dla "pompowania" ciepła z lodówki na zewnątrz tj. do pokoju. Ilość ciepła przepompowanego w jednostce czasu jest k razy większa niż pobrana w tym czasie energia elektryczna z sieci (energia elektryczna jest w tym procesie zamieniana na ciepło rozpraszane w pokoju. Pokój jest izolowany - nie traci ciepła. Symulujemy temperaturę w pokoju i lodówce. | + | |
- | - Lodówkę z przykładu (5) traktujemy jako grzejnik z przykładu (2). | + | |
- | - Symulacja poziomu wody w dwóch naczyniach połączonych rurką o małej średnicy. | + | |
- | * Metody numerycznego rozwiązywania zagadnienia początkowego: | + | |
- | - metoda Eulera - kilka kroków rozwiązania przykładowego równania, | + | |
- | - różnice między metodami jedno- i wielokrokowymi, | + | |
- | - różnice między metodami jedno- i wieloetapowymi, | + | |
- | - różnice między metodami jawnymi a niejawnymi, | + | |
- | - błąd lokalny a błąd globalny rozwiązania, | + | |
- | - zależność błędu od wielkości kroku i od rzędu metody, | + | |
- | - dobór kroku wg kryterium stabilności absolutnej. | + | |
- | + | ||
- | ====== Lab. 7 ====== | + | Ćwiczenie nr 6: **Wstęp do kalibracji modelu** |
- | Plan: | + | **Zadanie**: Zbudować model umożliwiający symulację wypływu wody ze zbiornika. Dopuszczalne błędy: |
+ | - względny błąd symulacji bieżącego poziomu wody ''rel_err_max'' = 1e-3, | ||
+ | - błąd bezwzględny ''abs_err_max'' = 2[mm]. | ||
- | - Kartkówka - zagadnienia: | + | **Parametry zbiornika** |
- | * zależność błędu numerycznego symulacji od kroku i rzędu metody, | + | - Geometria |
- | * aproksymacja danych pomiarowych - aproksymacja a interpolacja, miary błędu aproksymacji, kiedy zagadnienie aproksymacji sprowadza się do zagadnienia liniowego, | + | - średnica zbiornika ''D'' = 218 mm, |
- | * numeryczne metody znajdowania minimum funkcji - przykłady metod bezgradientowych oraz gradientowych 1, i 2, rzędu, różnice między metodą Newtona a metodami quasi-newtonowskimi, ogólny schemat metod: minimalizacji wzdłuż współrzędnych (coordinate descent method), najszybszego spadku, Newtona i metody "trust region". | + | - średnica poziomej rurki wypływowej ''d'' = 9 mm, |
- | - Aproksymacja danych pomiarowych | + | - oś rurki wypływowej jest na wysokości ''h_r'' = 15 mm nad dnem zbiornika. |
- | * Metody optymalizacji w aproksymacji. | + | - Na dnie zbiornika stoi (na większej podstawie) stożek ścięty (nie jest wypełniany wodą): |
- | * Aproksymacja danych pomiarowych dla wypływu wody. | + | - średnica dolna ''DS'' = 90 mm, |
- | * Kalibracja i walidacja modelu wypływu wody ze zbiornika. | + | - średnica górna ''ds'' = 50 mm, |
- | * Aproksymacja przebiegu czasowego stanu wody w rzece. | + | - wysokość ''h_s'' = 55 mm. |
- | * Kryterium doboru parametrów funkcji aproksymującej na przykładzie aproksymacji funkcji jednej zmiennej. | + | - Początkowa wysokość lustra wody (liczona od dna zbiornika) ''h0'' = 145 mm. |
- | * Zależność od dwóch zmiennych, | + | |
- | - regularna i nieregularna siatka danych, | + | **Model teoretyczny** zgodny z równaniami Bernoulliego. |
- | - wybór funkcji bazowych - wielomiany, funkcje radialne, | + | |
- | - aproksymacja nieparametryczna - algorytm LOWESS (locally weighted scatterplot smoothing). | + | |
- | Ćwiczenie nr 6: **Kalibracja modelu** | + | Energia potencjalna zgromadzonej wody jest zamieniana na energię kinetyczną wody wypływającej. |
- | - ppp | + | Otrzymujemy równanie różniczkowe: ''dh/dt = -k sqrt(h)'', gdzie ''k=(d/D)^2*sqrt(2*g)''. |
+ | Model w SIMULINKu. | ||
- | ====== Lab. 8 ====== | + | **Dane pomiarowe:** Czas ''t'' (w sekundach), poziom wody mierzony od dna naczynia ''h'' (w metrach) |
- | Temat: Aproksymacja dyskretna | + | t = [0 7.05 14.24 21.95 30.00 38.32 47.08 56.46 66.89 78.72 90.65 104.58 113.64 123.07 135.75]; |
- | 1. Aproksymacja przepływu fali wezbraniowej w rzece. | + | h = [0.145 0.135 0.125 0.115 0.105 0.095 0.085 0.075 0.065 0.055 0.045 0.035 0.030 0.025 0.020]; |
- | + | ||
- | * 69 pomiarów na posterunku w Stróży przepływu wody w Rabie od 17.11.2015 g. 10.00 do 20.11 g. 6.00: | + | **Porównanie wyników symulacji z danymi pomiarowymi**. |
+ | - wykres danych, | ||
+ | - sprawdzenie spełnienia założonych wymagań, | ||
+ | - potencjalne źródła rozbieżności: | ||
+ | - "driver" symulacji - jak zweryfikować? | ||
+ | - model (parametry lub struktura) - analiza założeń upraszczających. | ||
+ | |||
+ | **Ilościowa ocena błędu symulacji** | ||
+ | Rozwiązanie analityczne dla ''h(0)=h0'': | ||
+ | |||
+ | - ''h(t) = (sqrt(h0) - k*t/2)^2'', albo: | ||
+ | - ''t(h) = 2*(sqrt(h0) - sqrt(h))/k''. | ||
+ | |||
+ | Tę relację zapisujemy w pliku typu ''function'' (skorzystamy na następnym laboratorium). | ||
+ | |||
+ | **Plan następnego ćwiczenia** | ||
+ | - Kalibracja modelu - znajdowanie optymalnych wartości parametrów modelu. | ||
+ | - Aproksymacja danych pomiarowych w przypadku braku opisu teoretycznego. | ||
+ | ====== Lab. 7 (2017) ====== | ||
+ | |||
+ | |||
+ | |||
+ | Kartkówka - (z zagadnień wymienionych w przesłanych materiałach - 18.12.2017): | ||
+ | * aproksymacja danych pomiarowych - aproksymacja a interpolacja, miary błędu aproksymacji, kiedy zagadnienie aproksymacji sprowadza się do zagadnienia liniowego, | ||
+ | * numeryczne metody znajdowania minimum funkcji - przykłady metod bezgradientowych oraz gradientowych 1, i 2, rzędu, różnice między metodą Newtona a metodami quasi-newtonowskimi, ogólny schemat metod: minimalizacji wzdłuż współrzędnych (coordinate descent method), najszybszego spadku, Newtona i metody "trust region". | ||
+ | |||
+ | **Kalibracja modelu teoretycznego na przykładzie wypływu wody ze zbiornika**. | ||
+ | - Wybór funkcji aproksymującej: | ||
+ | * ''h(t) = (sqrt(h0) - k*t/2)^2'' | ||
+ | * ''t(h) = 2*(sqrt(h0) - sqrt(h))/k'' | ||
+ | - Sprowadzenie problemu do zagadnienia liniowego. | ||
+ | - Obliczenie wartości przebiegu symulowanego w punktach pomiaru. | ||
+ | - Funkcja błędu. | ||
+ | - Obliczenie optymalnych wartości parametrów modelu. | ||
+ | - Walidacja modelu. | ||
+ | |||
+ | % Kalibracja modelu wypływu wody | ||
+ | format long e, format compact | ||
+ | % Dane pomiarowe: | ||
+ | t = [0 7.05 14.24 21.95 30.00 38.32 47.08 56.46 66.89 78.72 90.65 104.58 113.64 123.07 135.75]; | ||
+ | h = [0.145 0.135 0.125 0.115 0.105 0.095 0.085 0.075 0.065 0.055 0.045 0.035 0.030 0.025 0.020]-0.015; | ||
+ | h0 = 0.13; % początkowy poziom lustra wody. | ||
+ | % Wybór danych do kalibracji (ponad stożkiem): | ||
+ | ti = t(1:10); hi = h(1:10); | ||
+ | % Obliczania optymalnego parametru a(=1/k): | ||
+ | ds = sqrt(h0)-sqrt(hi); | ||
+ | a = 0.5*ds*ti'/(ds*ds'); % uwaga: w*w' to iloczyn skalarny | ||
+ | k = 1/a | ||
+ | % Wykres pomiarów ('o') i symulacji ('-') | ||
+ | ts = 0:0.1:140; hs = (sqrt(h0)-k*ts/2).^2; | ||
+ | plot(t,h,'o',ts,hs), legend('pomiary','symulacja'); | ||
+ | |||
+ | **Budowa modelu na podstawie danych pomiarowych - Aproksymacja dyskretna.** | ||
+ | * Aproksymacja przebiegu czasowego stanu wody w rzece. | ||
+ | * Dane: 69 pomiarów na posterunku w Stróży przepływu wody w Rabie od 17.11.2015 g. 10.00 do 20.11 g. 6.00: | ||
q = [2.40 2.56 2.56 2.56 2.72 2.88 3.20 4.04 5.56 6.20 9.30 14.70 ... | q = [2.40 2.56 2.56 2.56 2.72 2.88 3.20 4.04 5.56 6.20 9.30 14.70 ... | ||
Linia 172: | Linia 210: | ||
% to plot the FittedCurve at the end. | % to plot the FittedCurve at the end. | ||
% | % | ||
- | function [sse, FittedCurve] = expfun(params) | + | function [sse, FittedCurve] = expfun(params) |
- | A1 = params(1); | + | A1 = params(1); |
- | lambda1 = params(2); | + | lambda1 = params(2); |
- | FittedCurve = A1 .* exp(-lambda1 * xdata); | + | FittedCurve = A1 .* exp(-lambda1 * xdata); |
- | ErrorVector = FittedCurve - ydata; | + | ErrorVector = FittedCurve - ydata; |
- | end | + | sse = sum(ErrorVector .^ 2); |
+ | end | ||
end | end | ||
* Wywołanie funkcji aproksymującej: | * Wywołanie funkcji aproksymującej: | ||
- | + | ||
- | [estimates, model] = fitcurveQ0(t,q); | + | % Dane pomiarowe: |
+ | q = [2.40 2.56 2.56 2.56 2.72 2.88 3.20 4.04 5.56 6.20 9.30 14.70 ... | ||
+ | 18.20 21.80 27.80 30.20 31.40 30.20 29.00 27.80 25.40 24.20 23.00 21.80 ... | ||
+ | 21.80 20.60 19.40 19.40 18.20 17.00 17.00 15.90 14.70 14.70 13.50 13.50 ... | ||
+ | 12.30 12.30 11.10 11.10 10.50 10.50 10.50 9.90 9.90 9.90 9.30 9.30 ... | ||
+ | 9.30 8.70 8.70 8.70 8.70 8.70 8.10 8.10 8.10 8.10 7.34 6.96 ... | ||
+ | 6.96 6.96 6.96 6.96 6.58 7.34 6.96 6.96 6.96]; | ||
+ | t = 1:52; q=q(18:end); | ||
% | % | ||
- | plot(t, q, '*'); hold on | + | [estimates, model] = fitcurveQ0(t,q); % aproksymacja nieliniowa |
- | [sse, FittedCurve] = model(estimates); | + | [sse, FittedCurve] = model(estimates); % wykres znalezionej aproksymacji |
- | plot(xdata, FittedCurve, 'r') | + | plot(t, q, '*',t, FittedCurve, 'ro') |
% | % | ||
- | xlabel('t') | + | xlabel('t'), ylabel('q'), title(['Fitting to function ', func2str(model)]); |
- | ylabel('q') | + | |
- | title(['Fitting to function ', func2str(model)]); | + | |
legend('data', ['fit using ', func2str(model)]) | legend('data', ['fit using ', func2str(model)]) | ||
- | hold off | ||
* Aproksymacja funkcją z większą liczbą parametrów | * Aproksymacja funkcją z większą liczbą parametrów | ||
- | 2. Aproksymacja wielomianowa - obliczanie współczynników wielomianu za pomocą macierzy Vandermonde'a: | + | 2. **Aproksymacja wielomianowa - obliczanie współczynników wielomianu za pomocą macierzy Vandermonde'a**: |
format compact | format compact | ||
Linia 215: | Linia 258: | ||
hold off | hold off | ||
- | 3. Aproksymacja wielomianowa - kryterium wyboru stopnia wielomianu: | + | 3. **Aproksymacja wielomianowa - kryterium wyboru stopnia wielomianu**: |
- | clear, close all | + | clear, close all, format short, format compact |
t = 0:0.001:1; y = sin(2*pi*t); % zależność aproksymowana | t = 0:0.001:1; y = sin(2*pi*t); % zależność aproksymowana | ||
tz = 0:0.05:1; | tz = 0:0.05:1; | ||
yz = sin(2*pi*tz) + (rand(1,21)-0.5); % wyniki pomiarów | yz = sin(2*pi*tz) + (rand(1,21)-0.5); % wyniki pomiarów | ||
% | % | ||
- | tp = tz(1:2:end); yp = yz(1:2:end); % zbiór ćwiczebny | + | tp = tz(1:2:end); yp = yz(1:2:end); % zbiór treningowy |
t_test = tz(2:2:end); y_test = yz(2:2:end); % zbiór testowy | t_test = tz(2:2:end); y_test = yz(2:2:end); % zbiór testowy | ||
% | % | ||
figure(1), plot(t,y,'r',tp,yp,'o',t_test,y_test,'x'), hold on, | figure(1), plot(t,y,'r',tp,yp,'o',t_test,y_test,'x'), hold on, | ||
% | % | ||
- | err = zeros(1,10); err_t = zeros(1,10); % tablice błędów | + | err_trening = zeros(1,10); err_test = zeros(1,10); % tablice błędów |
for n = 1:10 | for n = 1:10 | ||
p = polyfit(tp,yp,n); % p - współczynniki wielomianu | p = polyfit(tp,yp,n); % p - współczynniki wielomianu | ||
ypa = polyval(p,tp); % wartości funkcji aproksymującej | ypa = polyval(p,tp); % wartości funkcji aproksymującej | ||
- | dy = ypa-yp; err(n) = sqrt((dy*dy')/11), % błąd w punktach ćwiczebnych | + | dy = ypa-yp; err_trening(n) = sqrt((dy*dy')/11), % błąd w punktach treningowych |
% | % | ||
y_test_a = polyval(p,t_test); % wartości f.aproks. w punktach testowych | y_test_a = polyval(p,t_test); % wartości f.aproks. w punktach testowych | ||
dy_test = y_test_a-y_test; | dy_test = y_test_a-y_test; | ||
- | err_t(n) = sqrt((dy_test*dy_test')/10), % błąd w punktach testowych | + | err_test(n) = sqrt((dy_test*dy_test')/10), % błąd w punktach testowych |
% | % | ||
plot(t,polyval(p,t)), pause, | plot(t,polyval(p,t)), pause, | ||
Linia 241: | Linia 284: | ||
hold off | hold off | ||
% | % | ||
- | figure(2), plot(1:10,err,'ro-',1:10,err_t,'bx-'); | + | figure(2), plot(1:10,err_trening,'ro-',1:10,err_test,'bx-'); |
xlabel('stopien wielomianu') | xlabel('stopien wielomianu') | ||
- | legend('blad w p. cwiczebnych','blad w p. testowych') | + | legend('blad w p. treningowych','blad w p. testowych') |
+ | |||
+ | |||
+ | ====== Terminy zaliczeń (2017/18) ====== | ||
+ | Drugi termin: 31 stycznia 2018. | ||
+ | Trzeci termin: 7 lutego 2018. | ||
+ | (Godziny - do ustalenia) | ||