Metoda sítí

Lineární ODR 2. řádu (samoadjungovaný tvar)

Předpokládáme úlohu ve tvaru -(p(x) y'(x))' + q(x) y(x) = f(x) na intervalu (a,b), y(a) = y0, y(b) = yn .

Příklad:   -(x2 y'(x))' + x3/(2+x) y(x) = x2/(3-x) ,    y(-5) = -2 ,   y(-3) = 0 .

Řešení tohoto příkladu v Matlabu metodou sítí s krokem h = 0.4:

 % sestaveni matice soustavy A
 h = 0.4;                           % volba kroku
 a = -5; b = -3;                    % volba intervalu reseni
 n = round((b-a)/h)-1;              % pocet neznamych
 xh = linspace(a+h, b-h, n);        % vnitrni uzly
 xp = (a + 0.5*h) : h : b;          % deleni intervalu "mezi uzly"
 hq = h^2 * xh .^ 3 ./ (2 + xh);    % hodnoty q v uzlech, vynasobene h^2
 p = xp .^ 2;                       % hodnoty p mezi uzly
 D = hq + p(1:n) + p(2:n+1);        % prvky na hlavni diagonale
 V = - p(2:n);                      % prvky na vedlejsich diagonalach
 A = diag(V,-1) + diag(D) + diag(V,1);  % matice soustavy

 % sestaveni prave strany
 y0 = -2; yn = 0;                % Dirichletovy okrajove podminky
 F = h^2 * xh .^ 2 ./ (3 - xh);  % vypocet funkce f v uzlech, vynasobene h^2
 F(1)=F(1) + p(1)*y0;            % zahrnuti leve okrajove podminky
 F(n)=F(n) + p(n+1)*yn;          % zahrnuti prave okrajove podminky

 % vypocet reseni a nakresleni grafu
 U = A\F';                   % reseni soustavy
 y = [y0; U ; yn];           % pridani okrajovych podminek
 x = [a,xh,b];               % pridani krajnich bodu intervalu
 plot(x,y,x,y,'ro')          % graf numerickeho reseni

Příklad - tlumený oscilátor:   y''(x) + 2 y'(x) + y(x) = e-x,    y(0) = 2 ,   y(2) = 0 .

Nejprve převedeme úlohu na samoadjungovaný tvar:
-(e2x y'(x))' - e2x y(x) = -ex

Řešení v Matlabu metodou sítí s krokem h = 0.2:

 % sestaveni matice soustavy A
 h = 0.2;                           % volba kroku
 a = 0; b = 2;                      % volba intervalu reseni
 n = round((b-a)/h)-1;              % pocet neznamych
 xh = linspace(a+h, b-h, n);        % vnitrni uzly
 xp = (a + 0.5*h) : h : b;          % deleni intervalu "mezi uzly"
 hq = -h^2 *exp(2*xh);              % hodnoty q v uzlech, vynasobene h^2
 p = exp(2*xp);                     % hodnoty p mezi uzly
 D = hq + p(1:n) + p(2:n+1);        % prvky na hlavni diagonale
 V = - p(2:n);                      % prvky na vedlejsich diagonalach
 A = diag(V,-1) + diag(D) + diag(V,1);  % matice soustavy

 % sestaveni prave strany
 y0 = -2; yn = 0;                % Dirichletovy okrajove podminky
 F = h^2 * xh .^ 2 ./ (3 - xh);  % vypocet funkce f v uzlech, vynasobene h^2
 F(1)=F(1) + p(1)*y0;            % zahrnuti leve okrajove podminky
 F(n)=F(n) + p(n+1)*yn;          % zahrnuti prave okrajove podminky

 % vypocet reseni a nakresleni grafu
 U = A\F';                   % reseni soustavy
 y = [y0; U ; yn];           % pridani okrajovych podminek
 x = [a,xh,b];               % pridani krajnich bodu intervalu
 plot(x,y,'ro')          % graf numerickeho reseni

porovnání výsledků s přesným řešením y = (2 - 2x + 0.5 x2) e-x

graficky - černá křivka

 xx = linspace(a,b,30);
 yy = (2 - 2*xx + 0.5*xx.^2).*exp(-xx);
 hold on
 plot(xx,yy,'k')

numericky - výpočet maximální chyby

 yy = (2 - 2*x + 0.5*x.^2).*exp(-x);
 max_err = max(abs(y-yy'))