我是靠谱客的博主 高挑小懒猪,最近开发中收集的这篇文章主要介绍matlab简单迭代法_MATLAB学数值分析(二) 迭代法解线性方程组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、高斯法和Doolitle法

高斯法和Doolitle法都比较简单,其实Doolitle可以直接用maltab里面的lu命令来求,下面提一下迭代法

二、Jacobi迭代

1.算法实现

2.收敛条件

1d0a085efbb10dc9a1fed284f28d3ae8.png

3.matlab实现

根据以上的算法可以写出一个简单的jacobi迭代如下:

function x = jacobi(a,b,k)
n=length(b);
d=diag(a);
r=a-diag(d);
x=zeros(n,1);
for j = 1:k
x = (b-r*x)./d;
end

以上代码是最简单的写法,但是做题的时候一般要求把迭代过程给显示,这样写的话就不够完善,所以有以下拓展版。

function r = jacobi(A,B,varargin)
sizeA=size(A);
sizev=size(varargin);
if sizev(2) == 0
rol = 0.000001;
n = 1000;
x = zeros(sizeA(1),1);
elseif sizev(2) == 1
rol = varargin{1};
n = 1000;
x = zeros(sizeA(1),1);
elseif sizev(2) == 2
rol = varargin{1};
n = varargin{2};
x = zeros(sizeA(1),1000);
elseif sizev(2) == 3
rol = varargin{1};
n = varargin{2};
x = varargin{3};
else
error("输入参数过多");
end
for i = 2:n
for j = 1:sizeA(2)
sum1=0;
for k = 1:sizeA(1)
if j == k
continue;
end
sum1 = sum1 - x(k,i-1)*A(j,k)/A(j,j);
end
x(j,i)=B(j)/A(j,j)+sum1;
end
if any(abs(x(:,i)-x(:,i-1))>rol) == 0
break;
end
end
r = x;
end

三、Gauss-Seidel迭代法

1.算法实现

2.收敛条件

3.matlab实现

function r = Gauss_Seidel(A,B,varargin)
sizeA=size(A);
sizev=size(varargin);
if sizev(2) == 0
rol = 0.000001;
n = 1000;
x = zeros(sizeA(1),1);
elseif sizev(2) == 1
rol = varargin{1};
n = 1000;
x = zeros(sizeA(1),1);
elseif sizev(2) == 2
rol = varargin{1};
n = varargin{2};
x = zeros(sizeA(1),1000);
elseif sizev(2) == 3
rol = varargin{1};
n = varargin{2};
x = varargin{3};
else
error("输入参数过多");
end
for i = 2:n
for j = 1:sizeA(2)
sum1=0;
for k = 1:j
if j == k
continue;
end
sum1 = sum1 - x(k,i)*A(j,k)/A(j,j);
end
for k = j+1:sizeA(1)
sum1 = sum1 - x(k,i-1)*A(j,k)/A(j,j);
end
x(j,i)=B(j)/A(j,j)+sum1;
end
if any(abs(x(:,i)-x(:,i-1))>rol) == 0
break;
end
end
r = x;
end

四、逐次超松弛(SOR)迭代法

1.算法实现

2.收敛条件

3.matlab实现

function r = SOR(A,B,w,varargin)
sizeA=size(A);
sizev=size(varargin);
if sizev(2) == 0
rol = 0.000001;
n = 1000;
x = zeros(sizeA(1),1);
elseif sizev(2) == 1
rol = varargin{1};
n = 1000;
x = zeros(sizeA(1),1);
elseif sizev(2) == 2
rol = varargin{1};
n = varargin{2};
x = zeros(sizeA(1),1000);
elseif sizev(2) == 3
rol = varargin{1};
n = varargin{2};
x = varargin{3};
else
error("输入参数过多");
end
for i = 2:n
for j = 1:sizeA(2)
sum1=0;
for k = 1:j
if j == k
sum1 = sum1 - w*(1-1/w)*x(k,i-1);
continue;
end
sum1 = sum1 - w*x(k,i)*A(j,k)/A(j,j);
end
for k = j+1:sizeA(1)
sum1 = sum1 - w*x(k,i-1)*A(j,k)/A(j,j);
end
x(j,i)=w*B(j)/A(j,j)+sum1;
end
if any(abs(x(:,i)-x(:,i-1))>rol) == 0
break;
end
end
r = x;
end

最后

以上就是高挑小懒猪为你收集整理的matlab简单迭代法_MATLAB学数值分析(二) 迭代法解线性方程组的全部内容,希望文章能够帮你解决matlab简单迭代法_MATLAB学数值分析(二) 迭代法解线性方程组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部