Лабораторная работа №5
Упражнение 1
Найти приближенное решение уравнения , удовлетворяющего начальному условию , на отрезке () методом ломаных Эйлера с заданной точностью .
Порядок выполнения упражнения:
1. Для отыскания приближенного решения создайте М-функцию.
В качестве входных аргументов функции используйте: заданную в символьном виде функцию ; ее символьные аргументы , ; координаты начальной точки ,; координаты и концов отрезка, на котором ищется решение; начальное число отрезков разбиения , точность .
В качестве выходных аргументов функции используйте: массивы координат вершин ломаной Эйлера и число отрезков разбиения , понадобившихся для построения приближенного решения с заданной точностью.
Код M-функции должен включать:
а) Последовательное вычисление координат вершин ломаной Эйлера для числа отрезков разбиения , , и т.д. до тех пор, пока не будет достигнута точность (правило, по которому оценивается точность, изложено перед упр. 1).
б) Построение в графическом окне figure 1 в одной системе координат трех ломаных Эйлера с числом звеньев, равным , и (полученных в результате первой, второй и последней итерации); ломаные должны быть изображены разными цветами.
2. Для тестирования М-функции из п.1 используйте решение уравнения с начальным условием на отрезке с точностью . Вначале найдите «вручную» точное решение. Тестирование оформите в виде scriptа.
Код scriptа должен включать:
а) Задание входных аргументов М-функции из п.1, вызов М-функции, отыскание приближенного решения с заданной точностью.
б) Оценку реальной точности приближения: вычисление максимального отклонения в узлах сетки найденного приближенного решения от полученного аналитически точного решения.
в) Построение в графическом окне figure 2 в одной системе координат двух графиков: приближенного и точного решения.
function [x2, y2, n0] = Eler(f, x, y, x0, y0, a, b, n0, eps)
n = n0 / 2;
maxdy = 2 * eps;
Y = 0;
step = 0;
hold on; grid on;
while (maxdy > eps)
n = n * 2;
lastY = Y;
step = step + 1;
dx = (b - a) / n;
X(1) = x0;
Y(1) = y0;
for i = (2 : n + 1)
X(i) = X(i - 1) + dx;
Y(i) = Y(i - 1) + subs(subs(f, x, X(i - 1)), y, Y(i - 1)) * dx;
end
if (step ~= 1)
dy = abs(Y(1) - lastY(1));
maxdy = dy;
for i = (2 : n / 2 + 1)
dy = abs(Y(i * 2 - 1) - lastY(i));
if (dy > maxdy)
maxdy = dy;
end
end
end
if (step == 1)
for i = (1 : n)
plot(X, Y, 'r');
end
end
if (step == 2)
for i = (1 : n)
plot(X, Y, 'b');
end
end
end
plot(X, Y, 'g');
end
>> syms x y;
>> [X, Y, n] = Eler (x * y, x, y, 0, 1, 0, 1, 3, 0.001);
>> y = exp(x^2 / 2);
>> n
n = 1536
>> abs(Y(n + 1) - subs(y, x, X(n + 1)))
ans = 0.000715222
>> figure;
>> hold on;
>> grid on;
>> plot(X, Y, 'g', 'LineWidth', 4);
>> ezplot(y, [0, 1]);
Упражнение 2.
Найти приближенное решение уравнения , удовлетворяющего начальному условию , методом последовательных приближений Пикара.
Порядок выполнения упражнения:
1. Для отыскания приближенного решения создайте М-функцию.
В качестве входных аргументов функции используйте: заданную в символьном виде функцию ; ее символьные аргументы , ; координаты начальной точки ,; число итераций .
В качестве выходных аргументов функции используйте: массив приближенных решений, соответствующих 1-ой, 2-ой, …, -ой итерации.
Код M-функции должен включать:
а) Последовательное отыскание приближенных решений с 1-ой по -ю итерацию.
б) Построение в одной системе координат графиков приближенных решений, соответствующих 1-ой, 2-ой, …, -ой итерации.
2. Для тестирования М-функции из п.1 используйте решение уравнения с начальным условием на отрезке . Вначале найдите «вручную» точное решение. Тестирование оформите в виде scriptа.
Код scriptа должен включать:
а) Задание входных аргументов М-функции из п.1; вызов М-функции, последовательное отыскание приближенный решений, соответствующих 1-ой, 2-ой, …, -ой итерации.
б) Оценку реальной точности приближения: вычисление на отрезке максимального отклонения приближенного решения, соответствующего итерации , и точного решения.
в) Построение в той же системе координат, где были построены приближенные решения, графика точного решения.
function [fx] = Picar(f,x0,y0,n)
clf; grid on; hold on;
syms t; syms x; syms fx;
fx(1)=y0;
h=subs(f,{'x','y'},[t, fx(1)]);
r = fx(1) + int(h,t,x0,x);
fx(2) = sym(r);
for i=2:n
h=subs(f,{'x','y'},[t, fx(i)]);
r = fx(i) + int(h,t,x0,x);
fx(i+1) = sym(r);
end;
line([-10 10], [0 0], 'lineWidth', 1, 'Color', 'black');
line([0 0], [-10 10], 'lineWidth', 1, 'Color', 'black');
axis([-10 10 -1 19]);
for i=1:1:n
x = -10:0.1:10;
y = subs(fx(i), 'x', x);
plot(x,y);
pause(0.25);
end;
plot(x,y,'r', 'lineWidth', 2);
end
-