两种消去法在matlab中的实现
两种消去法的实现主要是,通过函数的实现,传入参数来实现的。如有其他需要,请另行修改代码
高斯消去法函数实现
算法设计
- 传入参数为矩阵A,向量b,以及维度n
- 传出参数是运行的时间
- 通过两个循环实现,一个是消元,一个是回代
- 第一个循环,从第一行到第n-1行,对之后的每一行做消元处理。当出现了第k行的第k个元素为0时,说明该矩阵有无数个解,弹出错误并结束函数运行
- 第二个循环是从最后一行开始,通过回代,从最后一行得出x的值
- 时间的计算问题,通过tic跟toc,得到了两个循环所需要的时间并返回
代码如下:
function time = Gauss(n, A, b) %B = [A b]; tic; for k = 1:n-1 if A(k,k) == 0 disp('the matrix has too many answers, please change the matrix'); return end for i = k+1:n m = A(i, k) / A(k , k); A(i, k) = 0; A(i, k+1:n) = A(i, k+1:n) - m*A(k, k+1:n); b(i) = b(i) - m*b(k); end end %回代取得结果 x = zeros(n,1); if A(n, n) == 0 disp('the matrix has too many answers, please change the matrix'); return end x(n) = b(n) / A(n,n); for i = n-1:1 x(i) = (b(i) - sum(A(i,i+1:n) * x(i+1:n)))/A(i,i); end toc; time = toc; end
列主元消去法
算法设计
- 主要的操作与高斯消去法想类似
- 区别在于:每次在第k行消元的时候,将第k行的元素与拥有第k列最大元素的行进行交换,再进行消元
代码如下:
function time = ColumnPivot(n, A, b) %B = [A b]; tic; for k = 1:n-1 max = -1; m = k; for j = k+1:n if A(j, k) > max max = A(j, k); m = j; end end A([k m], :) = A([m k], :); temp = b(m); b(m) = b(k); b(k) = temp; %判断是否是0 if A(k,k) == 0 disp('the matrix has too many answers, please change the matrix'); return end for i = k+1:n m = A(i, k) / A(k , k); A(i, k) = 0; A(i, k+1:n) = A(i, k+1:n) - m*A(k, k+1:n); b(i) = b(i) - m*b(k); end end %回代取得结果 x = zeros(n,1); if A(n, n) == 0 disp('the matrix has too many answers, please change the matrix'); return end x(n) = b(n) / A(n,n); for i = n-1:1 x(i) = (b(i) - sum(A(i,i+1:n) * x(i+1:n)))/A(i,i); end toc; time = toc; end
特殊说明
- 具体算法的内容,其实在教科书或者在其他博客上已经有很详细的说明了,在这里就不再重复了。
- 尽管实现的函数都是返回时间,但是只需要将返回的参数改成x,即可返回最后的解。当然在计算机中,如果是随机生成的矩阵的话,可能会出现误差,此时得到的不是精确解,而是近似解
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233103.html原文链接:https://javaforall.net