====== Różnice ====== Różnice między wybraną wersją a wersją aktualną.
aniss2016_17 [2018/01/08 15:48] miller [Lab. 7] |
aniss2016_17 [2018/01/17 09:21] (aktualna) miller [Lab. 7 (2017)] |
||
---|---|---|---|
Linia 149: | Linia 149: | ||
- Kalibracja modelu - znajdowanie optymalnych wartości parametrów modelu. | - Kalibracja modelu - znajdowanie optymalnych wartości parametrów modelu. | ||
- Aproksymacja danych pomiarowych w przypadku braku opisu teoretycznego. | - Aproksymacja danych pomiarowych w przypadku braku opisu teoretycznego. | ||
- | ====== Lab. 7 ====== | + | ====== Lab. 7 (2017) ====== |
- | Plan: | ||
- | - Kartkówka - zagadnienia: | + | |
+ | 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, | * 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". | * 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". | ||
- | - Aproksymacja danych pomiarowych | ||
- | * Metody optymalizacji w aproksymacji. | ||
- | * Aproksymacja danych pomiarowych dla wypływu wody. | ||
- | * Kalibracja i walidacja modelu wypływu wody ze zbiornika. | ||
- | * Aproksymacja przebiegu czasowego stanu wody w rzece. | ||
- | * Kryterium doboru parametrów funkcji aproksymującej na przykładzie aproksymacji funkcji jednej zmiennej. | ||
- | * Zależność od dwóch zmiennych, | ||
- | - regularna i nieregularna siatka danych, | ||
- | - wybór funkcji bazowych - wielomiany, funkcje radialne, | ||
- | - aproksymacja nieparametryczna - algorytm LOWESS (locally weighted scatterplot smoothing). | ||
+ | **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'); | ||
- | Temat: Aproksymacja dyskretna | + | **Budowa modelu na podstawie danych pomiarowych - Aproksymacja dyskretna.** |
- | + | * Aproksymacja przebiegu czasowego stanu wody w rzece. | |
- | 1. Aproksymacja przepływu fali wezbraniowej 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: |
- | + | ||
- | * 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 198: | 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 241: | 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; | ||
Linia 253: | Linia 270: | ||
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 treningowych | + | 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 267: | 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) | ||