MATLAB程序编写
高斯消去法与高斯列主元消去法求解线性方程组
% 高斯消去法
A = [4 2 -3 -1 2 1 0 0 0 0; 8 6 -5 -3 6 5 1 0 0 0; 4 2 -2 -1 3 2 0 -1 3 1; 0 -2 1 5 -1 3 -1 1 9 4; -4 2 6 -1 6 7 -3 3 2 3; 8 6 -8 5 7 17 2 6 -3 5; 0 2 -1 3 2 5 3 0 1 0; 16 10 -11 -9 17 34 2 -1 2 2; 4 6 2 -7 13 9 2 0 12 4; 0 0 -1 8 -3 -24 -8 6 3 -1];
b = [5; 12; 3; 2; 3; 46; 13; 38; 19; -21];
x_gaussian = GaussianElimination(A, b);
% 高斯列主元消去法
x_pivot = GaussianEliminationPivot(A, b);
% 误差分析
error_gaussian = norm(A*x_gaussian - b);
error_pivot = norm(A*x_pivot - b);
disp(['高斯消去法求解得到的解:']);
disp(x_gaussian);
disp(['高斯列主元消去法求解得到的解:']);
disp(x_pivot);
disp(['高斯消去法的误差:', num2str(error_gaussian)]);
disp(['高斯列主元消去法的误差:', num2str(error_pivot)]);
function x = GaussianElimination(A, b)
n = length(b);
Ab = [A, b];
for k = 1:n-1
for i = k+1:n
factor = Ab(i,k) / Ab(k,k);
Ab(i,k:end) = Ab(i,k:end) - factor * Ab(k,k:end);
end
end
x = zeros(n, 1);
x(n) = Ab(n,n+1) / Ab(n,n);
for i = n-1:-1:1
x(i) = (Ab(i,n+1) - Ab(i,i+1:n) * x(i+1:n)) / Ab(i,i);
end
end
function x = GaussianEliminationPivot(A, b)
n = length(b);
Ab = [A, b];
for k = 1:n-1
[~, max_idx] = max(abs(Ab(k:n,k)));
max_idx = max_idx + k - 1;
Ab([k,max_idx], = Ab([max_idx,k],;
for i = k+1:n
factor = Ab(i,k) / Ab(k,k);
Ab(i,k:end) = Ab(i,k:end) - factor * Ab(k,k:end);
end
end
x = zeros(n, 1);
x(n) = Ab(n,n+1) / Ab(n,n);
for i = n-1:-1:1
x(i) = (Ab(i,n+1) - Ab(i,i+1:n) * x(i+1:n)) / Ab(i,i);
end
end
追赶法求解三角行线性方程组
% 追赶法
A = [4 -1 0 0 0 0 0 0 0 0; -1 4 -1 0 0 0 0 0 0 0; 0 -1 4 -1 0 0 0 0 0 0; 0 0 -1 4 -1 0 0 0 0 0; 0 0 0 -1 4 -1 0 0 0 0; 0 0 0 0 -1 4 -1 0 0 0; 0 0 0 0 0 -1 4 -1 0 0; 0 0 0 0 0 0 -1 4 -1 0; 0 0 0 0 0 0 0 -1 4 -1; 0 0 0 0 0 0 0 0 -1 4];
b = [7; 5; -13; 2; 6; -12; 14; -4; 5; -5];
x = TridiagonalMatrixAlgorithm(A, b);
disp(['追赶法求解得到的解:']);
disp(x);
function x = TridiagonalMatrixAlgorithm(A, b)
n = length(b);
alpha = zeros(n, 1);
beta = zeros(n, 1);
alpha(1) = A(1,1);
beta(1) = b(1) / alpha(1);
for i = 2:n
alpha(i) = A(i,i) - A(i,i-1) * A(i-1,i) / alpha(i-1);
beta(i) = (b(i) - A(i,i-1) * beta(i-1)) / alpha(i);
end
x = zeros(n, 1);
x(n) = beta(n);
for i = n-1:-1:1
x(i) = beta(i) - A(i,i+1) * x(i+1) / alpha(i);
end
end
误差分析
针对高斯消去法、高斯列主元消去法和追赶法,可以计算其求解得到的解与真实解之间的误差范数,用于评估算法的准确性和稳定性。
|