Лабораторная работа №4
Упражнение 1
Создать M-функции, которые вычисляют расстояние между точками в различных метриках. Проверить их работу для расстояний между точкой и точками и Вычислить расстояния между точками и в различных метриках.
function u_1(x, y)
n = length(x);
p0 = abs(x(1) - y(1));
for i = (2 : n)
tmp = abs(x(i) - y(i));
if (tmp > p0)
p0 = tmp;
end
end
p1 = 0;
for i = (1 : n)
p1 = p1 + abs(x(i) - y(i));
end
p2 = 0;
for i = (1 : n)
p2 = p2 + (x(i) - y(i))^2;
end
p0
p1
p2 = sqrt(p2)
end
>> O = [0, 0];
>> A1 = [3, 4];
>> B1 = [4, 3];
>> A2 = [1, 2, 3, 4];
>> B2 = [7, 3, 4, 200];
>> u_1(O, A1)
p0 = 4
p1 = 7
p2 = 5
>> u_1(O, B1)
p0 = 4
p1 = 7
p2 = 5
>> u_1(A2, B2)
p0 = 196
p1 = 204
p2 = 196.0969
Упражнение 2
Создать M-функцию, строящую изображение замкнутого шара в для различных метрик. Построить шары в метриках
function u_2(x0, r, acc)
subplot(1, 3, 1);
hold on;
subplot(1, 3, 2);
hold on;
subplot(1, 3, 3);
hold on;
for y = (x0(2) - r : acc : x0(2) + r)
for x = (x0(1) - r : acc : x0(1) + r)
p0 = abs(x - x0(1));
if (abs(y - x0(2)) > p0)
p0 = abs(y - x0(2));
end
if (p0 <= r)
subplot(1, 3, 1);
plot(x, y, '.r');
end
p1 = abs(x - x0(1)) + abs(y - x0(2));
if (p1 <= r)
subplot(1, 3, 2);
plot(x, y, '.r');
end
p2 = sqrt((x - x0(1))^2 + (y - x0(2))^2);
if (p2 <= r)
subplot(1, 3, 3);
plot(x, y, '.r');
end
end
end
end
>> u_2([0, 0], 1, 0.03)
Упражнение 3
Положив вывести 10 первых членов последовательности заданной рекуррентной формулой Сделать вывод.
function u_3(x1, n)
for i = (1 : n)
x1 = tan(x1) ;
disp(x1);
end
end
>> u_3(3, 10)
-0.1425
-0.1435
-0.1445
-0.1455
-0.1466
-0.1476
-0.1487
-0.1498
-0.1509
-0.1521
Разница между соседними увеличивается. Следовательно, ряд расходится
Упражнение 4
Создать M-функцию для решения уравнения с заданной точностью с выводом последовательности приближений. Входными параметрами являются функция параметр сжатия начальное приближение точность решения Проверить работу для уравнения из примера 2. С точностью 0.0001 решить уравнение Сравнить с ответом, полученными при непосредственном решении в МatLab.
function x = u_4(f, a, x1, eps)
x(1) = x1;
x(2) = f(x1);
p0 = abs(x(1) - x(2));
i = 3;
while ((a^i * p0) / (1 - a) >= eps)
x(i) = f(x(i - 1));
i = i + 1;
end
x(i) = f(x(i - 1));
end
>> u_4(@(x)(atan(x) + pi), 0.2884, 3, 0.001)
ans =
3.0000 4.3906 4.4885 4.4932 4.4934 4.4934 4.4934
>> u_4 (@(x)((2 * x + 1)^(1 / 5)), 0.5774, 1, 0.0001)
ans =
Columns 1 through 7
1.0000 1.2457 1.2841 1.2897 1.2905 1.2906 1.2906
Columns 8 through 14
1.2906 1.2906 1.2906 1.2906 1.2906 1.2906 1.2906
Columns 15 through 16
1.2906 1.2906
>> fzero(@(x)(x^5 - 2 * x - 1), 1.2)
ans = 1.2906
Упражнение 5
Записать систему уравнений в виде . Проверить выполнение условия сжатости матрицы . Создать M-функцию для решения методом итераций системы уравнений с точностью взяв в качестве начального приближения решения Выходные параметры: приближённое решение и количество итераций. Решить систему уравнений с точностью 0,001.
Проверить решение подстановкой.
function X = u_5(A, B, eps)
N = length(A);
E=eye(N);
% Переход к итерационному виду. (Заменено на С=-A+E)
% for i = (1 : N)
% D(i) = B(i)/A(i,i);
% for j = (1 : N)
% if (i == j)
% C(i,j) = 0;
% else
% C(i,j) = -A(i,j)/A(i,i);
% end;
% end;
% end;
C=-A+E;
% Запишем уравнение в виде X=CX+B
disp('Уравнение в виде X=CX+B:');
for i = 1:N
str = strcat('x', num2str(i),'=');
for j = 1:N
if (C(i,j) ~= 0)
if (C(i,j) > 0) str = strcat(str, '+'); end;
str = strcat(str, num2str(C(i,j)),'*x',num2str(j));
end;
end;
if (B(i) > 0) str = strcat(str, '+'); end;
str = strcat(str, num2str(B(i)));
disp(str);
end;
% Проверяем первое условие
for k = 1:N
S_1(k) = 0;
for j = 1:N
S_1(k) = S_1(k) + abs(C(k,j));
end;
end;
% Проверяем второе условие
for k = 1:N
S_2(k) = 0;
for i = 1:N
S_2(k) = S_2(k) + abs(C(i,k));
end;
end;
% Проверяем третье условие
S_3 = 0;
for i = 1:N
for j = 1:N
S_3 = S_3 + (C(i,j))^2;
end;
end;
if (max(S_1) < 1 || max(S_2) < 1 || sqrt(S_3) < 1)
disp('Условие сжатости матрицы С=-А+Е выполняется');
end;
k = 0;
% в качестве начального приближения решения берём X0=B
X0 = B;
disp('X0 = ');
for i = 1:N
disp([' ',num2str(X0(i))]);
end;
X1 = C*X0 + B;
while (max(X1 - X0) > eps)
X0 = X1;
X1 = C*X0 + B;
k = k + 1;
end;
X=X1;
disp(['X',num2str(k),' = ']);
for i = 1:N
disp([' ',num2str(X(i))]);
end;
disp(sprintf('Количество итераций: %d', k));
end;
>> A = [1, 0.06, -0.02; 0.03, 1, -0.05; 0.01, -0.02, 1];
>> B = [2; 3; 5];
>> X = u_5(A, B, 0.001)
Уравнение в виде X=CX+B:
x1=-0.06*x2+0.02*x3+2
x2=-0.03*x1+0.05*x3+3
x3=-0.01*x1+0.02*x2+5
Условие сжатости матрицы С=-А+Е выполняется
X0 =
2
3
5
X2 =
1.9092
3.1949
5.0448
Количество итераций: 2
>> 1 * X(1) + 0.06 * X(2) - 0.02 * X(3)
ans = 2.0002
>> 0.03 * X(1) + 1 * X(2) - 0.05 * X(3)
ans = 2.9995
>> 0.01 * X(1) - 0.02 * X(2) + 1 * X(3)
ans = 4.9998
Упражнение С1
Создать M-функцию, которая для произвольной матрицы проверяет условия сжатости.
function u_C1(C)
N = length(C);
% Проверяем первое условие
for k = 1:N
S_1(k) = 0;
for j = 1:N
S_1(k) = S_1(k) + abs(C(k,j));
end;
end;
% Проверяем второе условие
for k = 1:N
S_2(k) = 0;
for i = 1:N
S_2(k) = S_2(k) + abs(C(i,k));
end;
end;
% Проверяем третье условие
S_3 = 0;
for i = 1:N
for j = 1:N
S_3 = S_3 + (C(i,j))^2;
end;
end;
if (max(S_1) < 1 || max(S_2) < 1 || sqrt(S_3) < 1)
disp('Условие сжатости матрицы выполняется');
else
disp('Условие сжатости матрицы не выполняется');
end;
end
Упражнение С2
Используя M-функции из упр. 5 и С1, решить систему уравнений с точностью 0.001.
Проверить решение подстановкой.
>> A = [1.11, 0.21, -0.37; 0.13, 0.29, 0.21; 0.63, -0.33, -2.41];
>> B = [1.53; 1.56; 1.42];
>> u_5(A,B,0.001)
Уравнение в виде X=CX+B:
x1=-0.11*x1-0.21*x2+0.37*x3+1.53
x2=-0.13*x1+0.71*x2-0.21*x3+1.56
x3=-0.63*x1+0.33*x2+3.41*x3+1.42
Условие сжатости матрицы C не выполняется
-