LABOLATORIUM METOD NUMERYCZNYCH

0x08 graphic
Ćwiczenie Nr 9: Metody jednokrokowe rozwiązywania równań różniczkowych

Imię i nazwisko: Mateusz Mielniczuk

Mateusz Litwin Gr. 3.3

Wyprowadzenie równań dla obwodu szeregowego RLC:

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic
0x01 graphic

0x01 graphic

0x01 graphic

Rozróżniamy tu trzy przypadki:

1) 0x01 graphic
, czyli 0x01 graphic
- przypadek aperiodyczny:

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x08 graphic
0x01 graphic
,gdzie 0x01 graphic

0x01 graphic
0x01 graphic

2) 0x01 graphic
, czyli 0x01 graphic
- przypadek aperiodyczny krytyczny:

0x01 graphic

0x01 graphic

0x01 graphic

0x08 graphic
0x01 graphic
,gdzie 0x01 graphic

0x01 graphic
0x01 graphic

3) 0x01 graphic
, czyli 0x01 graphic
- przypadek oscylacyjny:

Wzory zastosowane do obliczenia w scilabie są takie same jak dla przypadku aperiodycznego

0x08 graphic

METODA KLASYCZNA

clear;

clc;

lines(0);

//parametry zadania

E=input("podaj wartosc napiecia: ");

C=input("podaj pojemnosc kondensatora: ");

L=input("podaj indukcyjnosc cewki: ");

Rk=(2*sqrt(L/C));

uc0=input("podaj poczatkoe napiecie na kondensatorze uc(0): ");

il0=input("podaj poczatkowy prad w obwodzie i(0): ");

//funkcje opisujące przebieg napiecia na kondensatorze i prad w obwodzie

//dla przypadku aperiodycznego i oscylacyjnego

function uc=udokladnie(t)

uc=E+A1*exp(s1*t)+A2*exp(s2*t)

endfunction

function il=idokladnie(t)

il=C*(A1*s1*exp(s1*t)+A2*s2*exp(s2*t))

endfunction

//wzory dla przypadku aperiodycznego

R=Rk*5;

a=R/(2*L);

wn=1/(sqrt(L*C));

s1=-a-sqrt(a*a-wn*wn);

s2=-a+sqrt(a*a-wn*wn);

A1=(il0-uc0*s2+E*s2)/(s1-s2);

A2=(il0-uc0*s1+E*s1)/(s2-s1);

t=linspace(0,-(5/s1)-5/s2,200);

xdel(winsid()); //zamkniecie starych wykresów

//wykres dla przypadku aperiodycznego

subplot(221)

plot2d(t, udokladnie(t),3);

plot2d(t, idokladnie(t),4);

xtitle('przebiegi dla przypadku aperiodycznego','t','uC i',boxed=1)

legends(['uC','i'],[3,4],opt=2)

//funkcje opisujące przebieg napiecia na kondensatorze i prad w obwodzie

//dla przypadku aperiodycznego krytycznego

function w=uakdokladnie(t)

w=E+(A1+(A2*t)).*(exp(-a*t))

endfunction

function z=iakdokladnie(t)

z=-C*(A2-a*A1+A2*t).*exp(-a*t)

endfunction

//wzory dla przypadku aperiodycznego krytycznego

R=Rk;

a=R/(2*L);

wn=1/(sqrt(L*C));

s=-a;

A1=uc0-E;

A2=il0+a*(uc0-E);

t=linspace(0,6/a,200);

//wykres dla przypadku aperiodycznego krytycznego

subplot(222)

plot2d(t, uakdokladnie(t),3);

plot2d(t, iakdokladnie(t),4);

xtitle('przebiegi dla przypadku aperiodycznego krytycznego','t','uC i',boxed=1)

legends(['uC','i'],[3,4],opt=2)

//wzory dla przypadku osylacyjnego

R=Rk/5;

a=R/(2*L);

wn=1/(sqrt(L*C));

s1=-a-sqrt(a*a-wn*wn);

s2=-a+sqrt(a*a-wn*wn);

A1=(il0-uc0*s2+E*s2)/(s1-s2);

A2=(il0-uc0*s1+E*s1)/(s2-s1);

t=linspace(0,5/a,200);

// i wykres

subplot(223)

plot2d(t, udokladnie(t),3);

plot2d(t, idokladnie(t),4);

xtitle('przebiegi dla przypadku oscylacyjnego','t','uC i',boxed=1)

legends(['uC','i'],[3,4],opt=6)

METODA EULERA I RUNGEGO-KUTTY RZ. 4

0x01 graphic

0x01 graphic

0x01 graphic

Skrypt wpisany w scilabie:

clear; xdel; clc;

lines(0) // wyłączenie przewijania pionowego

//parametry zadania

E=input("podaj wartosc napiecia: ");

C=input("podaj pojemnosc kondensatora: ");

L=input("podaj indukcyjnosc cewki: ");

Rk=(2*sqrt(L/C));

y10=input("podaj poczatkoe napiecie na kondensatorze uc(0): ");

y20=input("podaj poczatkowy prad w obwodzie i(0): ");

//rownanie II rzedu zapisane jako uklad rownan rownan I rzedu

function w=f1(t,y1,y2)

w=y2;

endfunction

function w=f2(t,y1,y2)

w=-y1/(L*C)-(R*y2)/L+E/(L*C);

endfunction

// ROZWIAZANIE METODA EULERA

//funkcja dla metody Eulera

function [t,y1,y2]=Euler(t0,tk,h,y10,y20)

N=(tk-t0)/h; // obliczanie liczby kroków

t(1)=t0; // inicjacja wektora czasu

y1(1)=y10; // inicjacja wektora rozwiązań

y2(1)=y20; // inicjacja wektora rozwiązań

for n=1:N

t(n+1)=t(n)+h;

y1(n+1)=y1(n)+h*f1(t(n),y1(n),y2(n)); // obliczanie y1,

y2(n+1)=y2(n)+h*f2(t(n),y1(n),y2(n)); // obliczanie y2,

end // koniec pętli for,

endfunction // koniec definicji funkcji.

//rozwiązanie dla przypadku aperiodycznego krytycznego

R=Rk;

tau=(2*L)/R;

[eu_t, eu_y1, eu_y2]=Euler(0, 6*tau, tau/2, y10, y20);

uC=eu_y1; // obliczanie napięcia na kondensatorze

i=eu_y2*C; // obliczanie prądu płynącego w obwodzie

//wykres dla przypadku aperiodycznego krytycznego

subplot(232); // Definicja położenia wykresu

plot2d(eu_t, [uC,i],[3,4] );

xtitle('Metoda Eulera przypadek aperiodyczny krytyczny','t','uC i',boxed=1) // podpis wykresu

legends(['uC','i'],[3,4],opt=2)

//rozwiązanie dla przypadku aperiodycznego

R=Rk*5;

tau=(2*L)/R;

[rk4_t, rk4_y1, rk4_y2]=RK4(0, 6*tau, tau/2, y10, y20);

uC=eu_y1; // obliczanie napięcia na kondensatorze

i=eu_y2*C; // obliczanie prądu płynącego w obwodzie

//wykres dla przypadku aperiodycznego

subplot(231); // Definicja położenia wykresu

plot2d(eu_t, [uC,i],[3,4] );

xtitle('Metoda Eulera przypadek aperiodyczny','t','uC i',boxed=1) // podpis wykresu

legends(['uC','i'],[3,4],opt=2)

//rozwiązanie dla przypadku oscylacyjnego

R=Rk/5;

tau=(2*L)/R;

[rk4_t, rk4_y1, rk4_y2]=RK4(0, 6*tau, tau/2, y10, y20);

uC=eu_y1; // obliczanie napięcia na kondensatorze

i=eu_y2*C; // obliczanie prądu płynącego w obwodzie

//wykres dla przypadku oscylacyjnego

subplot(233); // Definicja położenia wykresu

plot2d(eu_t, [uC,i],[3,4] );

xtitle('Metoda Eulera przypadek oscylacyjny','t','uC i',boxed=1) // podpis wykresu

legends(['uC','i'],[3,4],opt=4)

//ROZWIAZANIE METODA RK4

function [t,y1,y2]=RK4(t0, tk, h, y10, y20)

N=(tk-t0)/h; // obliczanie liczby kroków

t(1)=t0; // inicjacja wektora czasu

y1(1)=y10; // inicjacja wektora rozwiązań

y2(1)=y20; // inicjacja wektora rozwiązań

for n=1:N // rozpoczęcie pętli for,

t(n+1)=t(n)+h; // obliczanie liczby kroków,

k11=f1(t(n), y1(n), y2(n));

k21=f2(t(n), y1(n), y2(n));

k12=f1(t(n)+ h/2, y1(n)+h/2*k11, y2(n)+h/2*k21);

k22=f2(t(n)+ h/2, y1(n)+h/2*k11, y2(n)+h/2*k21);

k13=f1(t(n)+ h/2, y1(n)+h/2*k12, y2(n)+h/2*k22);

k23=f2(t(n)+ h/2, y1(n)+h/2*k12, y2(n)+h/2*k22);

k14=f1(t(n)+ h, y1(n)+h*k13, y2(n)+h*k23);

k24=f2(t(n)+ h, y1(n)+h*k13, y2(n)+h*k23);

y1(n+1)=y1(n)+h/6*(k11+2*k12+2*k13+k14);

y2(n+1)=y2(n)+h/6*(k21+2*k22+2*k23+k24);

end

endfunction

//rozwiązanie dla przypadku aperiodycznego krytycznego

R=Rk;

tau=(2*L)/R;

[rk4_t, rk4_y1, rk4_y2]=RK4(0, 6*tau, tau/2, y10, y20);

uC=rk4_y1; // obliczanie napięcia na kondensatorze,

i=rk4_y2*C; // obliczanie prądu w obwodzie,

subplot(235); // Definicja położenia wykresy,

plot2d(rk4_t, [uC,i],[3,4] ); // rysowanie wykresu,

xtitle('Metoda RK4 przypadek aperiodyczny krytyczny','t','uC i',boxed=1) // podpis wykresu.

legends(['uC','i'],[3,4],opt=2)

//rozwiązanie dla przypadku aperiodycznego

R=Rk*5;

tau=(2*L)/R;

[rk4_t, rk4_y1, rk4_y2]=RK4(0, 6*tau, tau/2, y10, y20);

uC=rk4_y1; // obliczanie napięcia na kondensatorze,

i=rk4_y2*C; // obliczanie prądu w obwodzie,

subplot(234); // Definicja położenia wykresy,

plot2d(rk4_t, [uC,i],[3,4] ); // rysowanie wykresu,

xtitle('Metoda RK4 przypadek aperiodyczny ','t','uC i',boxed=1) // podpis wykresu.

legends(['uC','i'],[3,4],opt=2)

//rozwiązanie dla przypadku oscylacyjnego

R=Rk/5;

tau=(2*L)/R;

[rk4_t, rk4_y1, rk4_y2]=RK4(0, 6*tau, tau/2, y10, y20);

uC=rk4_y1; // obliczanie napięcia na kondensatorze,

i=rk4_y2*C; // obliczanie prądu w obwodzie,

subplot(236); // Definicja położenia wykresy,

plot2d(rk4_t, [uC,i],[3,4] ); // rysowanie wykresu,

xtitle('Metoda RK4 przypadek oscylacyjny','t','uC i',boxed=1) // podpis wykresu.

legends(['uC','i'],[3,4],opt=4)

Wykresy dla danych:

E=5V L=0.6 H C=0.05F uC(0)=0 iL(0)=0

Wykresy metody klasycznej

0x01 graphic

Wykresy dla metod: Eulera oraz RK4

0x01 graphic

0x01 graphic

0x01 graphic

WNIOSKI:

Metoda Eulera jest mniej dokładna od metody Rungego-Kutty rzędu 4, przy niskiej liczbie kroków. Gdy liczba kroków zostanie zwiększona, na wykresach nie widać dużych rozbieżności miedzy obiema metodami.