ЧМ_6
.docxНикитиной Софии
Лабораторная работа №6
A=rand(3)
f=rand(3,1)
d=det(A)
if (det(A)==0)
disp("Матрица вырожденная: определитель равен 0.")
else
disp("Матрица не вырожденная: определитель не равен 0.")
end
disp("По формуле X=A^(-1)*f:")
X=inv(A)*f
disp("По Крамеру:")
A1 = A;
A2 = A;
A3 = A;
A1(:,1) = f;
A2(:,2) = f;
A3(:,3) = f;
x1 = det(A1) / det(A);
x2 = det(A2) / det(A);
x3 = det(A3) / det(A);
X=[x1;x2;x3]
A =
0.8322 0.8639 0.1080
0.6174 0.0977 0.5170
0.5201 0.9081 0.1432
f =
0.5594
0.0046
0.7667
d =
-0.1680
Матрица не вырожденная определитель не равен 0.
По формуле X=A^(-1)*f:
X =
-0.4727
1.0561
0.3737
По Крамеру:
X =
-0.4727
1.0561
0.3737
Берём ту же квадратную матрицу, т.к. оператор приводит её к треугольному виду.
n=4;
A=randn(n);
f=randn(n,1);
B=[A,f]
V=abs(A);
[m,i]=max(V(:,1))% i - строка с max=m элементом
E=B(i,:);
B(i,:)=B(1,:);
B(1,:)=E;
B
k=2;
for i=2:n
u=B(i,1)./B(1,1);
B(i,:)=B(i,:)-B(1,:).*u;
end
B
for i=3:n
u=B(i,2)./B(2,2);
B(i,:)=B(i,:)-B(2,:).*u;
end
B
for i=4:n
u=B(i,3)./B(3,3);
B(i,:)=B(i,:)-B(3,:).*u;
end
B
x=B(n,n+1)/B(n,n)
xx=(B(n-1,n+1)-B(n-1,n).*x)./B(n-1,n-1)
xxx=(B(n-2,n+1)-B(n-2,n).*x-B(n-2,n-1).*xx)./B(n-2,n-2)
xxxx=(B(n-3,n+1)-B(n-3,n).*x-B(n-3,n-1).*xx-B(n-3,n-2).*xxx)./B(n-3,n-3)
disp("По Гауссу:")
X=[xxxx;xxx;xx;x]
disp("Проверка:")
X=A\f
По Гауссу:
X =
-0.2218
-0.2620
0.0422
0.1170
Проверка:
X =
-0.2218
-0.2620
0.0422
0.1170
A=randn(4)
f=randn(4,1)
rref([A f])
X = A\f
ans =
1.0000 0 0 0 -0.3771
0 1.0000 0 0 -1.5774
0 0 1.0000 0 0.7957
0 0 0 1.0000 0.0764
X =
-0.3771
-1.5774
0.7957
0.0764
n=20;
A=randn(n);
X=randn(n,1);
disp("Число обусловленности")
disp("До:")
c=cond(A)
A(:,1)=1000;
disp("После:")
c_=cond(A)
f=A*X;
disp("Изначальное X:")
X
d=det(A);
disp("По формуле X=A^(-1)*f:")
X=inv(A)*f
disp("По Крамеру:")
for u=1:n
A_=A;
A_(:,u) = f;
X(u) = det(A_)./ det(A);
end
X
B = [A,f];
for j=1:n-1
[m,p]=max(B(j:n,j));
buf=B(p+j-1,:);
B(p+j-1,:)=B(j,:);
B(j,:) = buf;
for i=n:-1:j+1
B(i,:) = B(i,:)-B(i-1,:)*(B(i,j)/B(i-1,j));
end
end
for i = 1:n-1
for j = i+1:1:n
B(i,:) = B(i,:)-B(j,:)*B(i,j)/B(j,j);
end
end
for i = 1:n
B(i,:) = B(i,:)/B(i,i);
end
disp("По Гауссу с выбором главного элемента:")
x = B(:,21)
disp("По Гауссу без выбора главного элемента:")
X=A\f
Число обусловленности
До:
c = 36.3825
После:
c_ = 1.4390e+04
Изначальное X:
X =
1.4268
-0.2609
-0.6328
0.1524
-0.4703
1.2915
-0.5982
-0.0758
0.3290
0.2039
-0.6814
-0.0115
0.3792
-1.2556
-1.0184
-0.0791
0.8479
-0.2451
1.5698
2.1348
По формуле X=A^(-1)*f:
X =
1.4268
-0.2609
-0.6328
0.1524
-0.4703
1.2915
-0.5982
-0.0758
0.3290
0.2039
-0.6814
-0.0115
0.3792
-1.2556
-1.0184
-0.0791
0.8479
-0.2451
1.5698
2.1348
По Крамеру:
X =
1.4268
-0.2609
-0.6328
0.1524
-0.4703
1.2915
-0.5982
-0.0758
0.3290
0.2039
-0.6814
-0.0115
0.3792
-1.2556
-1.0184
-0.0791
0.8479
-0.2451
1.5698
2.1348
По Гауссу с выбором главного элемента:
x =
1.4268
-0.2609
-0.6328
0.1524
-0.4703
1.2915
-0.5982
-0.0758
0.3290
0.2039
-0.6814
-0.0115
0.3792
-1.2556
-1.0184
-0.0791
0.8479
-0.2451
1.5698
2.1348
По Гауссу без выбора главного элемента:
X =
1.4268
-0.2609
-0.6328
0.1524
-0.4703
1.2915
-0.5982
-0.0758
0.3290
0.2039
-0.6814
-0.0115
0.3792
-1.2556
-1.0184
-0.0791
0.8479
-0.2451
1.5698
2.1348
Все методы решения СЛАУ можно разбить на два класса: прямые и итерационные. Логично предположить, что прямые добиваются результата за конечное число действий, а итерационные лишь приближаются к нему, поэтому прямые методы имеют наиболее точное решение.