Do transformatora o
(6.1) |
Parametry
Niech warunek początkowy będzie postaci
narysowanie wykresu
zbadanie wpływu niewielkich zmian parametru
Aby rozwiązać (6.1), zastosujemy standardowy solver równań różniczkowych z Octave, lsode
. Po sprowadzeniu równania do układu dwóch równań pierwszego rzędu,
określamy funkcję wyznaczającą wektor prawej strony (przy umowie, że
E = 165; omega = 120*pi; N = 600; omega02 = 83; b = 0.14; oEN = (omega*E)/N; transf = @(y,t) [y(2); -y(1)*(omega02 + b*y(1)^2) + oEN*cos(omega*t)];
Numeryczne rozwiązanie i wykres
y0 = [0;0]; % warunek początkowy K = 100; % rozdzielczość wykresu t = linspace(0,5,K); y = lsode(transf, y0, t); plot(t, y(:,1)); % rysujemy tylko pierwszą współrzedną
Uzyskany przez nas na rysunku 6.1 wykres — regularny, ,,optycznie prawie periodyczny” — zdaje się sensowny. Jednak — pamiętając o tym, że niektóre zadania mogą być numerycznie trudne, a ich rozwiązania zwodniczo eleganckie — na wszelki wypadek zastosujemy inżynierski chwyt, polegający na weryfikacji rozwiązania poprzez drastyczne zaostrzenie kryteriów tolerancji błędu.
Aby to osiągnąć, musimy nieco pomanipulować przy parametrach pracy lsode
. Najpierw zapamiętamy bieżące wartości tolerancji błędu14Przypomnijmy na wszelki wypadek, że ustalenie wartości tych parametrów nie spowoduje bynajmniej, że uzyskane rozwiązanie będzie obarczone właśnie takim błędem; faktyczna rola parametrów tolerancji błędu jest opisana specjalistycznej literaturze, np. w [9]. względnego i bezwzględnego:
rtol = lsode_options('relative tolerance'); atol = lsode_options('absolute tolerance');
Następnie ustalimy nowe wartości na poziomie
lsode_options('relative tolerance', rtol*1e-4); lsode_options('absolute tolerance', atol*1e-4);
i na nowo uruchomimy tą samą symulację:
y = lsode(transf, y0, t); plot(t, y(:,1)); % na zakończenie przywracamy poprzednie wartości parametrów lsode lsode_options('relative tolerance', rtol); lsode_options('absolute tolerance', atol);
Choć na wyniki przyjdzie nam czekać znacznie dłużej niż poprzednio — wszak utrudniliśmy pracę solverowi! — efekt, który możemy sprawdzić na rysunku 6.2, dość przekonująco potwierdza, że solver nie oszukał nas poprzednim razem i wyznaczone rozwiązanie jest praktycznie identyczne.
Zatem na podstawie uzyskanego wykresu możemy skonkludować, że nasz transformator ma na tyle dużą bezwładność, że — choć w jego pracy pojawiają się oscylacje — przebiegają one łagodnie. W badanym okresie czasu natężenie tylko dwa razy (pięć, jeśli darować sobie drobne różnice) przyjęło maksymalną wartość.
Jednak otrzymany przez nas wykres jest — w potocznym rozumieniu — całkowicie błędny! Zapomnieliśmy bowiem o innym zjawisku: o aliasingu, czyli niebezpieczeństwie wyciągnięcia błędnych wniosków o przebiegu funkcji w przypadku zbyt małej liczby punktów próbkowania jej wartości. Rzeczywiście, powinni byliśmy na wszelki wypadek zbadać, czy zwiększenie rozdzielczości wykresu nie spowoduje jego wyraźnej zmiany….
Zatem zobaczmy. Wybierzemy — zamiast
K = 300; t = linspace(0,5,K); y = lsode(transf, y0, t); plot(t, y(:,1));
Hmmm… dostaliśmy wykres (zob. rysunek 6.3), w żaden sposób nie przypominający rysunku 6.1, który jeszcze przed chwilą wydawał nam się tak sensowny… A przecież jedynym zmienionym parametrem była liczba punktów próbkowania rozwiązania: zatem diagnoza jest jasna: faktycznie, mamy aliasing.
No dobrze, zatem który z wykresów jest prawidłowy? Możemy powtórzyć nasz chwyt i próbkować w
Już przekonaliśmy się, że (zapewne) nasz solver, lsode
, nie ma większych kłopotów z aproksymacją rozwiązania. Pozostaje więc przekonać się, kiedy niewielkie zwiększanie (lub, co — w świetle powyższego — na jedno wychodzi, zmniejszenie) rozdzielczości wykresu przestanie powodować istotną zmianę wykresu rozwiązania.
Gdybyśmy bowiem wcześniej choć chwilę zastanowili się nad charakterem naszego równania, zobaczylibyśmy, że jego prawa strona — zewnętrzne wymuszenie — jest postaci
Naturalnie, możemy dodatkowo oprzeć się na naszej wiedzy dla liniowych równań różniczkowych. W przypadku
Aby utwierdzić się w naszych przypuszczeniach, zrealizujemy w pętli wyświetlanie rozwiązania, oryginalnie wypróbkowanego w bardzo wielu punktach (
K = 5000; t = linspace(0,T,K); % highest possible resolution y = lsode(transf, y0, t); % reference solution plot(t,y(:,1)); title('Reference plot'); pause(3); P = 1; for k = [1:10] plot(t(P:k:end),y(P:k:end,1)); title(['Reference plot for K = ',num2str(K),', every ',num2str(k),'th point']); pause(3); end
Ta seria wykresów przekonuje nas jasno, że rozwiązanie zmienia się zbyt szybko, by było czytelnie wizualizowane na odcinku
P = floor(0.95*K); % ostatnie 5% wykresu for k = [1:10] plot(t(P:k:end),y(P:k:end,1)); title(['Reference plot for K = ',num2str(K),', every ',num2str(k),'th point']); pause(3); end
Strzał okazał się znakomity (rysunek 6.6) — wydaje się, że przy oryginalnej rozdzielczości
Możemy teraz potwierdzić swoje przypuszczenie, biorąc
Jak oglądać ostatnie 5% rozwiązania, ale bez
E = 165; omega = 120*pi; N = 600; omega02 = 83; b = 0.14; oEN = (omega*E)/N; transf = @(y,t) [y(2); -y(1)*(omega02 + b*y(1)^2) + oEN*cos(omega*t)]; y0 = [0;0]; T = 5; % high voltage transformer % E = 0.15*63.5e3; C = 777; R = 48.4e3; % omegaS = 377/(2*pi); omega02 = (53/(2*pi))^2; omega22 = (85/(2*pi))^2; % duff = @(y,t) [y(2); ... % omegaS*E*cos(omegaS*t)-y(1)*omega02-omega22*y(1)^3-y(2)/(R*C) ]; K = 100; t = linspace(0,T,K); rtol = lsode_options('relative tolerance'); atol = lsode_options('absolute tolerance'); y = lsode(transf,y0, t); plot(t,y(:,1)); pause(3); print('-depsc','duffing-aliasing.eps'); lsode_options('relative tolerance', rtol*1e-4); lsode_options('absolute tolerance', atol*1e-4); y = lsode(transf,y0, t); plot(t,y(:,1)); pause(3); print('-depsc','duffing-aliasing-hires.eps'); lsode_options('absolute tolerance', atol); lsode_options('relative tolerance', rtol); K = 300; t = linspace(0,T,K); y = lsode(transf,y0, t); plot(t,y(:,1)); pause(3); print('-depsc','duffing-aliasing-300.eps'); K = 600; t = linspace(0,T,K); y = lsode(transf,y0, t); plot(t,y(:,1)); pause(3); print('-depsc','duffing-aliasing-600.eps'); K = 5000; t = linspace(0,T,K); % highest possible resolution y = lsode(transf, y0, t); % reference solution plot(t,y(:,1)); title('Reference plot'); pause(3); print('-depsc','duffing-reference.eps'); P = 1; for k = [1:10] plot(t(P:k:end),y(P:k:end,1)); title(['Reference plot for K = ',num2str(K),', every ',num2str(k),'th point']); pause(1); end P = floor(0.95*K); % ostatnie 5% wykresu for k = [1:10] plot(t(P:k:end),y(P:k:end,1)); title(['Reference plot for K = ',num2str(K),', every ',num2str(k),'th point']); pause(1); end plot(t(P:end),y(P:end,1)); print('-depsc','duffing-reference-zoom20.eps'); fy = fft(y(:,1)); % fourier transform on phi fy(1) = []; % pierwsza wspolrzedna to suma wartosci y i jest nieistotna nyq = T/2; freq = (1:K/2)/(K/2)*nyq; semilogx(freq,abs(fy(1:K/2))); % verifyduffing;
Naszym drugim celem jest zbadanie wrażliwości rozwiązania na małe zmiany
Tu kończy się etap obliczeń naukowych — uprawiania ,,matematyki” eksperymentalnej: teraz powinniśmy przejść do dowodzenia twierdzeń. Czy jesteś w stanie udowodnić powyższe własności rozważanego równania?
Warto na zakończenie wspomnieć, że — choć sprawiły nam niejakie kłopoty — rozwiązania naszego równania przy danych wartościach parametrów zachowywały się bardzo przyzwoicie. Tymczasem dla innych zestawów parametrów może być znacznie gorzej. Równanie tej postaci jest znane pod nazwą równania Duffinga (z periodycznym wymuszeniem). Modeluje ono nie tylko pracę transformatora, ale także działanie pewnych układów mechanicznych. W ogólnym przypadku jest ono postaci
i jest znanym przykładem zadania różniczkowego, które dla pewnych wartości
W modelu sieci energetycznej z transformatorami wysokonapięciowymi pojawia się równanie opisujące wartość natężenia prądu
Równanie uzupełnione jest warunkiem początkowym
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.