1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
% assignment3.m

function [x] = assignment3(A,b)
% inputs:
% A:系数矩阵,维度为n*n
% b:载荷矩阵,维度为n*1
% outputs:
% x:未知量矩阵,维度n*1

[A_row,A_col] = size(A);
x=zeros(A_row,1);
x1_change=[]; % x1_change,x2_change记录x的位置变换
x2_change=[];

for i1=1:A_col-1 % 找出第i1行系数并对后面行进行消元
max_val=0;
for i2=i1:A_row % 找出右下方矩阵中最大的系数
for i3=i1:A_col
if max_val < abs(A(i2,i3))
max_val = abs(A(i2,i3));
max_i = i2;
max_j = i3;
end
end
end

if max_i ~= i1 % 行交换矩阵
for i2 = i1:A_col
temp = A(max_i,i2);
A(max_i,i2) = A(i1,i2);
A(i1,i2) = temp;
end
temp = b(i1);
b(i1) = b(max_i);
b(max_i) = temp;
end

if max_j ~= i1 % 列交换矩阵
for i2 = 1:A_col
temp = A(i2,max_j);
A(i2,max_j) = A(i2,i1);
A(i2,i1) = temp;
end
x1_change = [x1_change max_j]; % 记录x的交换
x2_change = [x2_change i1];
end

if A(i1,i1) ~= 0 % 消元
for i2 = i1+1:A_row
L_i1i2=A(i2,i1)/A(i1,i1);
A(i2,:)=-A(i1,:).*L_i1i2+A(i2,:);
b(i2)=-b(i1)*L_i1i2+b(i2);
end
end
end

for i1 = A_row:-1:1 %回代求解
x(i1)=b(i1);
for i2 = A_col:-1:i1+1
x(i1)=x(i1)-A(i1,i2)*x(i2);
end
x(i1)=x(i1)/A(i1,i1);
end

for i1=length(x1_change):-1:1 %调转x为原有顺序
temp=x(x1_change(i1));
x(x1_change(i1))=x(x2_change(i1));
x(x2_change(i1))=temp;
end
end

% 命令行输入
% assignment3([2 3 4; 5 6 7; 8 9 11], [2 3 4])