Wstęp

Generator fal wykorzystywany w Instytucie Budownictwa Wodnego jest wyposażony w program WS sterujący ruchem klapy. Ten program potrafi wygenerować tylko najprostrze przebiegi falowe, które nie zawsze spełnieją wymagania pracowników naukowych Instytutu. Na szczęście program WS potrafi odczytać przebiegi falowe zapisane w pliku. Jednak program potrafi przeczytać tylko pliki zapisane we własnym formacie M11. Dlatego była potrzeba napisania programu, który pozwoliłby wygenerować dowolne przebiegi i zapisałby przebiegi ruchu klapy w pliku M11.

Początkowo powstał samodzielny program służący do generowania przebiegów falowych podawanych na klapę generatora fal o nazwie falorob. W 2005 roku został on zintegrowany z programem służącym do analizy offline o nazwie Winfi32. Programem Winfi32 program potrafi wygenerować 4 typy fal, przy czym pierwszy typ (fala regularna) może być generowana dla 4 różnych warunków brzegowych. Oprócz tego każdy typ jest sparametryzowany. Program potrafi zapisać wygenerowany przebieg w pliku o formacie INT (wewnętrzny format plików pomiarowych Instytutu Budownictwa Wodnego PAN), w formacie M11 (wymaganym przez program WS) oraz w pliku tekstowym.

Oprócz tego program Winfi32 potrafi czytać pliki tekstowe, które następnie można zapisać w formacie M11. Pozwala to użyć ten program jako prosty konwerter plików tekstowych na pliki M11. Format plików tekstowych jest bardzo prosty: jest to zapis macierzowy, w którym wiersze są separowane znakiem końca linii (para znaków CR i LF), a kolumny są separowane znakiem tabulatora. Liczby mają format swobodny, a separatorem dziesiętnym musi być znak kropki. Pierwsza kolumna jest czasem. Różnica między drugą wartością pierwszej kolumny a pierwszą wartością pierwszej kolumny jest uznawana za krok czasowy dt.

Generowanie przebiegu falowego

Program Winfi32 pracuje tylko w środowisku Windows 9x/2k/XP. Po uruchomieniu programu na ekranie ukazuje się główne okno programu. Aby wygenerować przebieg falowy należy z nenu Generate wybrać polecenie Kalman models. W oknie dialogowym, które się pojawi, należy wybrać model generacji fali a następnie wypełnić parametry, które są wykorzystywane przez ten model. Naciśnięcie przycisku OK spowoduje uruchomienie odpowiedniej procedury obliczeniowej. Po wygenerowaniu przebiegu zostanie otwarte nowe okno prezentujące ruch klapy w formie graficznej.

Wygenerowany sygnał jest traktowany w programie Winfi32 identycznie jak sygnał pomierzony kartą pomiarową lub wczytany z pliku. Dzięki temu można stosować te same narzędzia analityczne co do sygnałów pomiarowych.

Program sterujący ruchem klapy WS akceptuje tylko przebiegi steruące, które mają watości w zakresie od -0.025 do +0.025. Dlatego program Winfi32 po wygenerowaniu sygnału sterującego ruchem klapy poszukuje wartości ekstremalnych i jeśli znajdzie miejsca, w których wartości przekraczają ten przedział to zmniejsza cały sygnał tak aby, żadna wartość nie wykraczała poza przedział -0.025 ... +0.025.

Obliczenia nowego sygnału (np. ze zmienionymi parametrami generacji) można w każdej chwili powtórzyć przez wygranie polecenia Recalculate z menu Analysis lub przez naciśnięcia klawisza F9.

Wygenerowany przebieg ruchu klapy można zapisać na dysku poleceniem Save as z menu File. W oknie dialogowym z pytaniem o nazwę pliku należy pamiętać o wyborze właściwego formatu pliku. Aby zapisać plik akcetowany przez program WS trzeba wybrać drugi format o nazwie Wave syntesiser (*.M11).

Modele generacji

Część parametrów generacji jest wspólnych. Na przykład wspólnym parametrem jest długość fali wyrażona w metrach oraz głębokość wody również wyrażona w metrach.

Ze względu na możliwości techniczne faloroba trzeba zadbać aby łagodnie "rozpędzić" klapę i łągodnie wygasić drgania na końcu doświadczenia. Z tego względu wszystkie przebiegi są podzielone na 3 etapy: (a) narastenie, (b) przebieg właściwy, (c) wygaszanie. Czasy narastania, pracy i wygaszania nie są podawane w sekundach ale w postaci liczby fal. Pozwala się to uniezależnić od podstawowego okresu fali. Oprócz tego jest jeszcze jeden wspólny parametr, który dotyczy stanu narastania i zanikania. Jest to współczynnik bezwymiarowy, który decyduje o szybkości narastania i opadania. Powiększanie jego wartości powoduje, że sygnał szybciej narasta i zanika.

Fala regularna

Program Winfi32 generuje proces o krotności warunków brzegowych równej 3, dlatego wzory przedstawione poniżej dotyczą procesów o takiej krotności warunków brzegowych.

Fala regularna jest generowana według następującego algorytmu:

Obliczamy częstotliwość kątową i okres fali na podstawie długości fali L i głębokości h:

K = 2πhL ω = gKtgh(K) h T = 2πω

Obliczamy współczynnik narastania/zanikania na podstawie podanego współczynnika eta.

η = etaT

Obliczamy czterowymiarowy proces A(r) dla fazy narastania, stanu ustalonego i zanikania.

A(r) = Φ(Δt) A(r-1)

gdzie macierz Φ(Δt) dana jest wzorem

Φ(Δt) = e-ηΔt [ 1 0 0 0 ηΔt 1! 1 0 0 (ηΔt)2 2! ηΔt 1! 1 0 (ηΔt)3 3! (ηΔt)2 2! ηΔt 1! 1 ]

Warunek początkowy A(0) obliczamy ze wzoru:

[ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] [ A0(0) A1(0) A2(0) A3(0) ] = [ 0 0 0 1 ]

Obliczając wartość przemieszczenia klapy możemy jednocześnie obliczać pierwszą, drugą i trzecią pochodną:

[ A3(r) A3'(r) A3''(r) A3'''(r) ] = [ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] [ A0(r) A1(r) A2(r) A3(r) ]

W identyczny sposób obliczamy proces D(r). Zmienia się jedynie warunek początkowy:

[ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] [ D0(0) D1(0) D2(0) D3(0) ] = [ 1 0 0 0 ]

Ostatecznie budujemy sygnał zespolony, który dla fazy narastania i stanu ustalonego ma postać:

Z(r) = [ xa A3(r) + j [ 1 - D3(r) + xd A3(r) ] ] e-jωΔtr

a dla fazy zanikania ma postać

Z(r) = [ xa A3(r) + j [ D3(r) + xd A3(r) ] ] e-jωΔtr

Ruch klapy to część rzeczywista sygnału zespolonego:

x(r) = xa A3(r) cos(ωΔtr) + [ 1 - D3(r) + xd A3(r) ] sin(ωΔtr)

i dla zaniku:

x(r) = xa A3(r) cos(ωΔtr) + [ D3(r) + xd A3(r) ] sin(ωΔtr)

Aby zapewnić ciągłość między stanem ustalonym a zanikaniem trzeba policzyć warunki początkowe sygnału D(r+1) gdzie r+1 punkt jest początkiem fazy zanikania:

[ D0(r+1) D1(r+1) D2(r+1) D3(r+1) ] = [ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] -1 [ 1 0 0 0 ] - [ D0(r) D1(r) D2(r) D3(r) ]

Dla fali regularnej można wybrać jeden z czterech typów warunków początkowych przez, przy czym w jednym z nich można podać wartość parametru. Warunki początkowe zadane są przez wartości parametrów xa i xd. W pierwszym przypadku oba parametry są narzucone i obliczone ze wzorów:

xa = η3 3ω ( 1 + (η3ω) 2 ) xd = η 4ω xa

W drugim przypadku oba parametry są również narzucone i oba mają tę samą wartość obliczoną ze wzoru:

xa = xd = 2η2 3

W trzecim przypadku oba parametry są również narzucone i są równe 0. W czwartym ostatnim przypadku parametr xd jest wyzerowany a parametr xa może być dowolnie podany przez użytkownika.

Generowanie fali losowej

Program Winfi32 generuje falę losową również o krotności warunków brzegowych równej 3, dlatego wzory przedstawione poniżej są szczególnym przypadkiem dla n=3.

Fala losowa jest generowana według następującego algorytmu:

Obliczamy częstotliwość kątową i okres fali na podstawie długości fali L i głębokości h:

K = 2πhL ω = gKtgh(K) h T = 2πω

Obliczamy współczynnik narastania/zanikania na podstawie podanego współczynnika eta.

η = etaT

Obliczamy czterowymiarowy proces A(r) dla fazy narastania.

A(r) = Φ(Δt) A(r-1)

gdzie macierz Φ(Δt) dana jest wzorem

Φ(Δt) = e-ηΔt [ 1 0 0 0 ηΔt 1! 1 0 0 (ηΔt)2 2! ηΔt 1! 1 0 (ηΔt)3 3! (ηΔt)2 2! ηΔt 1! 1 ]

Warunek początkowy A(0) obliczamy ze wzoru:

[ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] [ A0(0) A1(0) A2(0) A3(0) ] = [ 0 0 0 π2 ]

Obliczając wartość przemieszczenia klapy możemy jednocześnie obliczać pierwszą, drugą i trzecią pochodną:

[ A3(r) A3'(r) A3''(r) A3'''(r) ] = [ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] [ A0(r) A1(r) A2(r) A3(r) ]

W identyczny sposób obliczamy proces D(r). Zmienia się jedynie warunek początkowy:

[ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] [ D0(0) D1(0) D2(0) D3(0) ] = [ π2 0 0 0 ]

Ostatecznie budujemy sygnał zespolony, który dla fazy narastania ma postać:

Z(r) = [ xa A3(r) + j [ 1 - D3(r) + xd A3(r) ] ] e-jωΔtr

Ruch klapy to część rzeczywista sygnału zespolonego:

x(r) = xa A3(r) cos(ωΔtr) + [ 1 - D3(r) + xd A3(r) ] sin(ωΔtr)

Teraz proces deterministyczny, odpowiedzialny za "rozbujanie" klapy przechodzi w proces losowy. Oba procesy A(r) i D(r) są generowane według identycznych wzorów dlatego poniższe wzory są podane tylko dla procesu A(r):

A(r) = Φ(Δt) A(r-1) + Q R(r)

gdzie R(r) jest czterowymiarową zmienną losową.

Szukaną macierz (dolną trójkątną) R znajdujemy ze związku:

P - Φ(Δt) P Φ'(Δt) = Q Q'

Elementy macierzy Pi,j liczymy według wzoru:

Pi,j = pnn PN,N 2i+j ( i+j j )

gdzie parametr pnn domyślnie przyjmuje się równy 1. W naszym przypadku macierz P dana jest wzorem:

P = pnn26 20 [ 1 121 122 123 121 222 323 424 122 323 624 1025 123 424 1025 2026 ]

Dla fazy zanikania generujemy oba procesy A(r) i D(r) według tego samego wzoru:

A(r) = Φ(Δt) A(r-1)

Sygnał zespolony dla fazy losowej i dla zanikania ma postać

Z(r) = [ A3(r) + j D3(r) ] e-jωΔtr

a ruch klapy liczymy ze wzoru:

x(r) = A3(r) cos(ωΔtr) + D3(r) sin(ωΔtr)

Aby zapewnić ciągłość między stanem narastania a fazą losową trzeba policzyć warunki początkowe sygnału D(r+1) gdzie r+1 punkt jest początkiem fazy losowej:

[ D0(r+1) D1(r+1) D2(r+1) D3(r+1) ] = [ 0 0 0 1 0 0 η -η 0 η2 -2η2 η2 η3 -3η3 3η3 -η3 ] -1 [ π2 0 0 0 ] - [ D0(r) D1(r) D2(r) D3(r) ]

Generowanie fali Stokes'a

Generowanie fali Stokes'a jest bardzo podobne do generowania fali regularnej. Najpierw generowana jest fala regularna z parametrami xa=0 i xb=0. Obliczony sygnał zespolony oznaczmy tu jako Z1. Zgodnie z wcześniejszymi wzorami jest on równy:

Z1(r) = j (1-D3(r)) e-jωΔtr

dla fazy narastania i stanu ustalonego, a dla fazy zanikania ma postać:

Z1(r) = j D3(r) e-jωΔtr

Teraz obliczamy drugą i trzecią potęgę tego sygnału:

Z2(r) = Z1(r) Z1(r) Z3(r) = Z2(r) Z1(r)

Ostateczny sygnał sterowania klapą uzyskujemy ze wzoru:

x(r) = W1 re(Z1(r)) - W2 im(Z2(r)) + W3 re(Z3(r))

gdzie W1, W2 i W3 są dowolnymi wagami podanymi przez użytkownika.

W przypadku fali Stokes'a uproszczono obliczanie pochodnej. Po wyznaczeniu sygnału ruchu klapy wywoływana jest funkcja policz_pochodna(), która numerycznie oblicza pochodą tego sygnału.

Różniczkowanie numeryczne

Obliczanie pochodnej dla wygenerowanej fali Stokes'a jest oparte na obliczaniu pochodnej wielomianu aproksymującego. Aby obliczenia były szybkie i aby zminimalizować wpływ aproksymacji (mały stopień uśredniania) wybrano aproksymację wielomianem drugiego stopnia (parabola) rozpiętą na pięciu punktach. Najlepsze efekty daje obliczanie pochodnej gdy brane są dwa punkty wcześniejsze i dwa punkty późniejsze. Takie postępowanie prowadzi do opracowania filtru o skończonej odpowiedzi impulsowej (moving average). Do przeanalizowania takiego filtru można zastosować klasyczną analizę filtrów dyskretnych i pokazać jego własności.

Celem jest znalezienie współczynników paraboli

f(x) = a0 + a1x + a2x2

która, najbliżej w sensie średniokwadratowym, przechodzi przez punkty: (x-2,y-2), (x-1,y-1), (x0,y0), (x1,y1), (x2,y2). Znając współczynniki paraboli możemy policzyć pochodną w dowolnym punkcie:

f'(x) = a1 + 2a2x

Pełny wzór jest nam potrzebny tylko na krańcach przedziału różniczkowania (dwa pierwsze i dwa ostatnie punkty pomiaru). Dla wszystkich pozostałych punktów liczymy pochodną dla x=0 i stosujemy wzór uproszczony:

f'(x) = a1

Współczynniki paraboli można znaleźć rozwiązując liniowy układ równań w postaci

[ i=-22xi0 i=-22xi1 i=-22xi2 i=-22xi1 i=-22xi2 i=-22xi3 i=-22xi2 i=-22xi3 i=-22xi4 ] [ a0 a1 a2 ] = [ i=-22xi0yi i=-22xi1yi i=-22xi2yi ]

co dla x-2=-2Δt, x-1=-Δt, x0=0, x1=Δt, x2=2Δt. daje układ równań w postaci:

[ 5 0 10Δt2 0 10Δt2 0 10Δt2 0 34Δt4 ] [ a0 a1 a2 ] = [ y-2 + y-1 + y0 + y1 + y2 Δt ( -2y-2 -y-1 +y1 +2y2 ) Δt2 ( 4y-2 +y-1 +y1 +4y2 ) ]

Jak widać są to dwa układy równań. Z jednego wyznaczamy współczynniki a0 i a2, a z drugiego a1.

a0 = | y-2 + y-1 + y0 + y1 + y2 10Δt2 Δt2 ( 4y-2 +y-1 +y1 +4y2 ) 34Δt4 | | 5 10Δt2 10Δt2 34Δt4 | 2a2 = 2 | 5 y-2 + y-1 + y0 + y1 + y2 10Δt2 Δt2 ( 4y-2 +y-1 +y1 +4y2 ) | | 5 10Δt2 10Δt2 34Δt4 | a1 = Δt ( -2y-2 -y-1 +y1 +2y2 ) 10Δt2

co daje proste wzory:

a0 = 17 y0 + 97 y-1 +y0 +y1 3 - 37 y-2 +y-1 +y0 +y1 +y2 5 a1 = 45 y2 -y-2 4Δt + 15 y1 -y-1 2Δt 2a2 = 167 y2 -2y0 +y-2 8Δt2 - 27 y1 -2y0 +y-1 2Δt2