``` % dy/dx = x +y % dy/dx = x.^2 -y % Zawsze musimy miec rownanie w postaci normalnej (dy/dx=... / y'=...) syms y(x) fA = dsolve(diff(y) == (x-y)/2, y(0) == 1) fn1 = @(x, y) (x + y)./2 d = @(x) 3* exp(-x./2) - 2 clf; a = 0 b = 3 f = fn1 tspan = [a b] eps = 10^7 n = (b - a)/0.125 [x1, y1] = abm3(f, tspan, 1, n, eps) % [x2, y2] = ab3(f, tspan, 1, eps) [x3, y3] = ode45(f, tspan, 1) title("Krok 0.125") subplot(2,1,1); hold on plot(x1, y1) % plot(x2, y2) plot(x3, y3) fplot(fA) legend('abm3', 'ode45', 'dokl') subplot(2,1,2); hold on plot(x1, abs(y1 - f(x1))) plot(x3, abs(y1 - f(x3))) hold off ``` ``` function [x, y] = abm3(f, tspan, y0, n, eps) a = tspan(1); b = tspan(2); h = (b - a)/n; x = (a : h : b); % Euler y(1) = y0; for i = 1 : 2 k1 = h * feval(f, x(i), y(i)); k2 = h * feval(f, x(i) + h/2, y(i) + k1/2); y(i+1) = y(i) + k2; end z0 = feval(f, a, y0); z(1) = feval(f, x(1), y(1)); z(2) = feval(f, x(2), y(2)); % Predyktor y(3) = y(2) + h / 12 * (23 * z(2) - 16 * z(1) + 5 * z0); for i = 3 : n z(i) = feval(f, x(i), y(i)); yy = [y(i) + h / 12 * (23 * z(i) - 16 * z(i-1) + 5 * z(i-2))]; s = 1; for awaryjna = 1:100 a = feval(f, x(i), yy(s)); b = feval(f, x(i - 1), y(i - 1)); c = feval(f, x(i - 2), y(i - 2)); % Korektor yy_c = y(i-1) + 1/12 * h * (5 * a + 8 * b - c); yy = [yy yy_c]; if abs(yy(length(yy)) - yy(length(yy - 1))) < eps break; end s = s + 1 end y(i+1) = yy(length(yy)); end ```