高斯-赛德尔迭代法matlab程序
matlab高斯赛德尔迭代法
标题:深入探讨MATLAB中的高斯-赛德尔迭代法
一、概述
MATLAB是一种强大的数学计算软件,被广泛应用于科学、工程和金融等领域。在数值分析中,迭代法是解决非线性方程组和矩阵方程组的重要方法之一。高斯-赛德尔迭代法是其中的一种,其在求解线性方程组时具有较好的收敛性和效率。本文将深入探讨MATLAB中高斯-赛德尔迭代法的原理和实现方法。
二、高斯-赛德尔迭代法原理
高斯-赛德尔迭代法是一种求解线性方程组的迭代法。给定线性方程组Ax=b,其中A为系数矩阵,b为常数向量,迭代法的基本思想是通过不断逼近方程组的解x。高斯-赛德尔迭代法的迭代公式如下:
\[ x^{(k+1)} = D^{-1} (b - (L+U)x^{(k)}) \]
其中,D、L和U分别为系数矩阵A的对角线、严格下三角部分和严格上三角部分。迭代法的初始值可以任意选择,通常选取一个与解接近的初值,然后通过迭代逼近真实解。
三、MATLAB中高斯-赛德尔迭代法的实现
MATLAB提供了丰富的数值计算函数和工具箱,使得高斯-赛德尔迭代法的实现变得非常简单。下面我们将介绍如何在MATLAB中使用高斯-赛德尔迭代法求解线性方程组。
1. 设置参数
在使用高斯-赛德尔迭代法之前,我们首先需要设置一些参数,如系数矩阵A、常数向量b、迭代步数等。在MATLAB中可以通过定义变量来实现这些参数的设置。
2. 编写迭代函数
接下来,我们需要编写高斯-赛德尔迭代法的迭代函数。通过编写一个MATLAB函数来实现迭代公式的计算和迭代过程的控制。
3. 调用函数求解
完成迭代函数的编写后,我们就可以通过调用该函数来求解线性方程组。在MATLAB中,可以使用循环语句控制迭代步数,并在每一步更新迭代值,直到满足收敛条件为止。
高斯赛德尔迭代法matlab编程
高斯赛德尔迭代法matlab编程
高斯赛德尔迭代法 matlab 编程
function[x,k]=GaussSeidel(A,b,x0,eps,M) %高斯赛德尔迭代法求方程组的解(矩阵公式求解)
%A 为方程组的系数矩阵; b 为方程组的右端项
%x 为线性方程组的解了; x0 为迭代初值
%eps为误差限;M为迭代的最大次数
if nargin==3
eps= 1.0e-6;%默认精度
M = 10000;% 参数不足时默认后两个条件
elseif nargin ==4
M = 10000;% 参数的默认值
elseif nargin<3
error(' 参数不足 ');
return
end
[n,m]=size(A);
nb=length(b);
%当方程组行与列的维数不相等时,停止计算,并输出出错信息 if n~=m
error(' 矩阵 A 行数和列数必须相等 !');
return;
end
%当方程组与右端项的维数不匹配时,停止计算,并输出出错信息
if n~=nb
error('矩阵A的行数必须和b的长度相等!'); return;
end
L =zeros(n,n);
U =zeros(n,n);
D =zeros(n,n);
for i=2:n
for j=1:i-1
L(i,j)=-A(i,j);
end
end
for i=1:n-1
for j=i+1:n
U(i,j)=-A(i,j);
end
end
for i=1:n
D(i,i)=A(i,i);
end
B=inv(D-L)*U; %B 为迭代矩阵
g=inv(D-L)*b; %g 为右端项
Gauss_Seidel迭代法的Matlab程序
x=(D-L)\u*x+(D-L)\b; k=k+1; k disp(x') end if k==N WARNING('已达到最大迭代'); end
SOR算法: function[x,k]=SOR(A,b,w)%k为迭代次数,w为松弛因子 ep=1e-5; n=length(A); k=0; x=zeros(n,1); y=zeros(n,1); while 1 y=x; for i=1:n z=b(i); for j=1:n if j~=i z=z-A(i,j)*x(j); end end z=z/A(i,i); x(i)=(1-w)*x(i)+w*z; end
end A=[4 -1 0 -1 0 0;-1 4 -1 0 -1 0;0 -1 4 0 0 -1;-1 0 0 4 -1 0;0 -1 0 -1 4 -1;0 0 -1 0 -1 4];b=[0;5;0;6;-2;6]x=agui_jacobi(A,b)
Gauss_Seidel迭代法的Matlab程序 function x=agui_gs(A,b) n=length(b); N=100; e=1e-5; x0=zeros(n,1); x=x0; x0=x+2*e; k=0; D=diag(diag(a)); L=zeros(n,n); %定义L为n乘n的矩阵 U=zeros(n,n); %定义U为n乘n的矩阵 for i=2:n %求L,下三角矩阵 for j=1:i-1 L(i,j)=-A(i,j); end end for i=1:n-1 %求U,下三角矩阵 for j=i+1:n U(i,j)=-A(i,j); end end while max(abs(x0-x))>e&k<N x0=x;
gauss-seidel迭代法例题matlab代码
【题目】:Gauss-Seidel迭代法及Matlab代码实例
【内容】:
1. Gauss-Seidel迭代法介绍
Gauss-Seidel迭代法是一种用于解线性方程组的数值方法,基于逐次逼近的思想,通过不断迭代逼近线性方程组的解。该方法通常用于求解大型稀疏线性方程组,其收敛速度相对较快。
2. 迭代公式推导
假设有如下线性方程组:
$$
Ax=b
$$
其中A为系数矩阵,b为常数向量,x为未知向量。Gauss-Seidel迭代法的迭代公式为:
$$
x^{(k+1)}=(D+L)^{-1}(b- Ux^{(k)})
$$
其中,D为A的对角矩阵,L为A的严格下三角矩阵,U为A的严格上三角矩阵,k为迭代次数。
3. Matlab代码实现
下面给出Gauss-Seidel迭代法的Matlab代码实例:
```matlab
function [x, k] = gaussSeidel(A, b, x0, tol, maxIter)
A: 系数矩阵
b: 常数向量
x0: 初始解向量
tol: 容差
maxIter: 最大迭代次数
x: 解向量
k: 迭代次数
n = length(b);
x = x0;
k = 0;
while k < maxIter
x_old = x;
for i = 1:n
x(i) = (b(i) - A(i,1:i-1)*x(1:i-1) - A(i,i+1:n)*x_old(i+1:n)) / A(i,i); end
if norm(x - x_old, inf) < tol
return
end
k = k + 1;
end
matlab方程组数值解法
matlab方程组数值解法
Matlab方程组数值解法
随着科学技术的发展,数值计算在科学研究和工程实践中的应用越来越广泛。对于复杂的数学模型,通过解析方法求得准确的解析解往往是困难的甚至不可能的。因此,数值解法成为了求解这些问题的重要手段之一。Matlab作为一种强大的数值计算工具,提供了多种数值解法来解决方程组的数值求解问题。
在Matlab中,求解方程组的数值解法主要包括直接法和迭代法两种。直接法是指通过一系列直接计算来求解方程组的解,常见的方法有高斯消元法和LU分解法。迭代法则是通过迭代计算来逼近方程组的解,常见的方法有雅可比迭代法和高斯-赛德尔迭代法。
高斯消元法是一种经典的直接法,它通过消元和回代的方式将方程组化为简化的三角方程组,然后通过回代计算得到解。Matlab中提供了直接调用的函数,如"linsolve"函数,可以直接求解线性方程组。对于非线性方程组,可以通过牛顿法等迭代法来求解。
LU分解法是另一种常用的直接法,它将方程组的系数矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积,然后通过回代计算得到解。在Matlab中,可以使用"lu"函数进行LU分解,并通过"\"运算符求解线性方程组。
雅可比迭代法是一种简单而有效的迭代法,它通过迭代计算逐步逼
近方程组的解。在每一步迭代中,通过将方程组中的每个未知数的迭代解代入到方程组中的对应方程中,得到新的近似解。通过多次迭代,可以得到逼近方程组解的解向量。在Matlab中,可以使用"jacobi"函数进行雅可比迭代。
高斯-赛德尔迭代法是雅可比迭代法的改进版,它在每一步迭代中使用上一步迭代得到的未知数的新近似解。这样可以更快地逼近方程组的解。在Matlab中,可以使用"gauss_seidel"函数进行高斯-赛德尔迭代。
gauss-seidel迭代法收敛判断matlab
Gauss-Seidel迭代法是解线性方程组的一种常用方法,它通过不断迭代更新解向量,逐步逼近方程组的精确解。在实际应用中,我们往往需要判断迭代法是否收敛,以保证计算结果的准确性和可靠性。本文将以matlab为例,介绍如何利用数值计算软件对Gauss-Seidel迭代法的收敛性进行判断,并对其进行详细分析和讨论。
一、Gauss-Seidel迭代法简介
Gauss-Seidel迭代法是一种逐次迭代的线性代数方法,用于求解线性方程组Ax=b的解向量x。它的迭代更新公式为:
xn+1i=1/aii(bi-∑(j=1,j≠i)n aijxj)
其中,i=1,2,...,n;n为方程组的阶数;aii为系数矩阵A的第i行第i 列元素;bi是方程组右端的常数;xj为解向量x的第j个分量;
∑(j=1,j≠i)n aijxj为除去第i个分量的求和。通过不断迭代更新解向量的各个分量,最终可以逼近线性方程组的解。
二、Gauss-Seidel迭代法的收敛性判断
针对Gauss-Seidel迭代法的收敛性判断,我们可以利用数值计算软件matlab进行分析。在matlab中,可以使用以下命令进行Gauss-Seidel迭代法的计算:
function[x,k]=GaussSeidel(A,b,x0,tol,maxk)
n=length(b);
x=x0;
for k=1:maxk
x0=x;
for i=1:n
x(i)=1/A(i,i)*(b(i)-A(i,:)*x+x(i));
end
if norm(x-x0,inf)<tol
gauss-seidel迭代法matlab代码
Gauss-Seidel迭代法是一种用于解线性方程组的数值方法,特别适用于稀疏矩阵。以下是一个使用Matlab实现Gauss-Seidel迭代法的简单示例代码:
```matlab
function [x, iteration] = gaussSeidel(A, b, tol, maxIter)
% 输入参数:
% A:系数矩阵
% b:右侧常数向量
% tol:迭代收敛容差
% maxIter:最大迭代次数
n = length(b);
x = zeros(n, 1); % 初始化解向量
iteration = 0;
while iteration < maxIter
x_new = x; % 存储前一次迭代的解
for i = 1:n
% 计算新的解
x(i) = (b(i) - A(i,1:i-1)*x(1:i-1) - A(i,i+1:n)*x_new(i+1:n)) / A(i,i);
end
% 计算迭代误差
error = norm(x - x_new, inf);
if error < tol
return;
end
iteration = iteration + 1;
end
warning('Gauss-Seidel迭代未收敛到指定容差。');
end
```
使用这个函数时,您需要提供系数矩阵A、右侧常数向量b、迭代收敛容差tol和最大迭代次数maxIter作为输入参数。函数将返回解向量x和迭代次数iteration。
示例用法:
```matlab
A = [4, -1, 0; -1, 4, -1; 0, -1, 3];
matlab中的迭代算法
matlab中的迭代算法
迭代算法在matlab中的应用
迭代算法是一种通过多次重复计算来逼近解的方法,它在matlab中得到了广泛的应用。在本文中,我们将介绍一些常见的迭代算法,并探讨它们在matlab中的实现和应用。
1. 二分法
二分法是一种简单而直观的迭代算法,它通过将问题的解空间一分为二,并根据中间点的取值来确定解所在的子空间。在matlab中,可以使用while循环来实现二分法。首先,需要指定解空间的上下界,然后通过计算中间点的值来判断解所在的子空间,并更新解空间的上下界。重复这个过程,直到解的精度满足要求为止。
2. 牛顿迭代法
牛顿迭代法是一种用于求解方程的迭代算法,它利用函数的局部线性近似来逼近方程的解。在matlab中,可以使用while循环来实现牛顿迭代法。首先,需要给定一个初始点,然后根据函数的一阶和二阶导数来计算下一个点的值。重复这个过程,直到解的精度满足要求为止。
3. 高斯-赛德尔迭代法
高斯-赛德尔迭代法是一种用于求解线性方程组的迭代算法,它通过不断更新近似解来逼近方程的解。在matlab中,可以使用while循
环和矩阵运算来实现高斯-赛德尔迭代法。首先,需要给定一个初始解向量,然后根据方程组的系数矩阵和常数向量来计算下一个解向量的值。重复这个过程,直到解的精度满足要求为止。
4. 迭代法求特征值
迭代法也可以用于求解矩阵的特征值和特征向量。在matlab中,可以使用while循环和矩阵运算来实现迭代法求特征值。首先,需要给定一个初始特征向量,然后根据矩阵的幂来计算下一个特征向量的值。重复这个过程,直到特征向量的变化小于某个阈值为止。
matlab牛顿迭代法算重根
一、简介
Matlab是一种十分常用的科学计算软件,其功能强大,可以进行各种数值计算、数据分析和可视化操作。而牛顿迭代法是一种用于求解方程的数值算法,可以有效地计算出函数的根。本文将重点介绍如何使用Matlab进行牛顿迭代法来计算重根。
二、牛顿迭代法原理
1. 牛顿迭代法是一种迭代逼近的方法,通过不断迭代得到更接近函数零点的近似值。其公式如下:
X_{n+1} = X_n - \frac{f(X_n)}{f'(X_n)}
其中,X_{n+1}为下一次迭代的近似值,X_n为当前的近似值,f(X)为函数值,f'(X)为函数的导数值。
2. 牛顿迭代法的优点是收敛速度快,而缺点是对初始值的选择敏感,可能会产生不收敛的情况。
三、在Matlab中使用牛顿迭代法
1. 在Matlab中,可以使用内置的函数`fzero`来进行牛顿迭代法的计算。其语法如下:
x = fzero(fun,x0)
其中,fun为要求解的函数句柄,x0为起始点的初始值,x为函数的根。
2. 需要注意的是,在使用`fzero`函数时,需要提供函数的句柄,即在Matlab中定义要求解的函数,并使用`(x)`符号来表示函数的自变量。另外,还需要提供初始值x0,可以根据具体问题来选择较为合适的初始值。
3. 以下是一个简单的使用牛顿迭代法求解函数根的示例代码:
```matlab
f = (x) x^3 - 2*x - 5;
x0 = 2;
x = fzero(f, x0);
disp(x);
```
四、示例
接下来,我们将通过一个具体的示例来演示如何使用Matlab的牛顿迭代法来计算重根。
MATLAB实现高斯赛德尔迭代
%高斯赛德尔迭代
clear all;
close all;
clc;
tic
format longe
disp('请输入参数');
K=input('维数K=');
tic
A=100*rand(K);% A元素是0-100
for i=1:K
A(i,i)=sum(abs(A(i,:)))+25*rand(1); %对角占优的量为0~25
end
b=zeros(K,1);
for i=1:K;
x=0;
for r=1:K;
x=x+A(i,r);
end
b(i,1)=x;
end%产生b矩阵,b中的元素为A中对应行的和,目的是使方程解全为 1 jd=input('控制精度jd=');
I=eye(K); %单位阵
L=-tril(A,-1);%下三角
U=-triu(A,1);%上三角
D=diag(diag(A));%对角矩阵
B=I-(D-L)\A;%迭代矩阵 %或B=(D-L)\U;
f=(D-L)\b; %f
x0=zeros(K,1); %初始迭代矩阵
y=B*x0+f; %迭代公式
s=1; %迭代次数
while norm(y-x0)>=jd&&s<3000; %迭代条件
x0=y;
y=B*x0+f; %迭代公式
s=s+1; %迭代次数+1
end
y
s
toc
t=1:K;
yy=abs(y'-1)/1;
1 / 2
plot(t,yy);
title('绝对误差图')
-----精心整理,希望对您有所帮助!
matlab迭代函数程序
matlab迭代函数程序
Matlab是一种高级的数学软件,其内置了许多迭代函数,可以帮助用户更方便地进行数值计算和数据分析。本文将介绍一些常用的Matlab迭代函数及其应用,希望能够对读者有所帮助。
一、for循环
for循环是Matlab中最基本的迭代函数之一,其语法格式为: for 循环变量=初始值:步长:终止值
循环体
end
其中,循环变量是一个标量或向量,初始值、步长和终止值都是数值。循环体中的语句将会被重复执行,直到循环变量达到终止值为止。
下面是一个简单的例子,计算1到10的累加和:
sum = 0;
for i = 1:10
sum = sum + i;
end
disp(sum);
输出结果为55,即1+2+3+...+10的和。
二、while循环
while循环是另一种常用的迭代函数,其语法格式为:
while 条件
循环体
end
其中,条件可以是任何能够返回逻辑值的表达式,循环体中的语句将会被重复执行,直到条件为假为止。
下面是一个简单的例子,计算1到10的累加和:
sum = 0;
i = 1;
while i <= 10
sum = sum + i;
i = i + 1;
end
disp(sum);
输出结果为55,与for循环的结果相同。
三、递归函数
递归函数是一种特殊的函数,其定义中包含对自身的调用。在Matlab中,递归函数的语法与普通函数相同,但需要注意避免死循环。
下面是一个递归函数的例子,计算n的阶乘:
function f = factorial(n)
if n == 0
f = 1;
else
基于matlab的线性方程组迭代法(实验报告)
基于matlab 的线性方程组迭代法
实验题目:
实验要求:
(1)分别试用 Jacobi 和Gauss-Seidel 迭代法计算,要求达到的精度为:
(1)()510k k x x +-∞
->
(2)观测得到的迭代序列是否收敛?若收敛,记录迭代次数并分析计算结果。
实验流程
一、迭代法简介 1、 Jacobi 迭代法
对于方程组Ax b =有A 非奇异情况下且0ij a ≠时,A 分裂为A D L U =--,可得到:
0x B x f =+,其中1110(),B I D A D L U f D b ---=-=+=,得到雅克比迭代法:
(0)(1)()
0()
k k x x
B x f +⎧⎪⎨=+⎪⎩初始向量 2、 Gauss-Seidel 迭代法
(0)
(1)()
()
k k x x Gx f +⎧⎪⎨=+⎪⎩
初始向量 其中11
(),()G D L U f D L b --=-=-。其迭代法优点为只需一组存储单元。 3、 超松弛迭代法(SOR)
Gauss-Seidel 迭代法的一种加速方法,ω松弛因子。
(0)(1)
()(1)(1))()(1)k k k k k x x Gx f x x x ωω+++⎧⎪⎪=+⎨⎪=+-⎪⎩
(初始向量 其中1
1
(),()G D L U f D L b --=-=-。 二、迭代法的matlab 程序
1、 Jacobi 迭代法Jacobi.m
function [y,n]= Jacobi( A,b,x0,e )
%JACOBI ÇëÔÚ´Ë´¦ÊäÈ뺯Êý¸ÅÒª
if(nargin<4)e=1e-5;end
MATLAB 块雅克比迭代法求线性方程组Ax=b的解 块高斯-赛德尔迭代法求线性方程组Ax=b的解
function [x,N]= BJ(A,b,x0,d,eps,M) %块雅克比迭代法求线性方程组Ax=b的解
if nargin==4
eps= 1.0e-6;
M = 10000;
elseif nargin<4
error
return
elseif nargin ==5
M = 10000; %参数的默认值
end
NS = size(A);
n = NS(1,1);
if(sum(d) ~= n)
disp('分块错误!');
return;
end
bnum = length(d);
bs = ones(bnum,1);
for i=1:(bnum-1)
bs(i+1,1)=sum(d(1:i))+1;
%获得对角线上每个分块矩阵元素索引的起始值
end
DB = zeros(n,n);
for i=1:bnum
endb = bs(i,1)+d(i,1)-1;
DB(bs(i,1):endb,bs(i,1):endb)=A(bs(i,1):endb,bs(i,1):e ndb);
%求A的对角分块矩阵
end
for i=1:bnum
endb = bs(i,1)+d(i,1)-1;
invDB(bs(i,1):endb,bs(i,1):endb)=inv(DB(bs(i,1):endb,b s(i,1):endb));
%求A的对角分块矩阵的逆矩阵
end
N = 0;
tol = 1;
while tol>=eps
x = invDB*(DB-A)*x0+invDB*b; %由于LB+DB=DB-A
N =
N+1;
%迭代步数
MATLAB数值分析实验四(雅各比、高斯赛德尔迭代,以及二分法和牛顿迭代解非线性方程)
佛山科学技术学院
实 验 报 告
课程名称 数值分析
实验项目 迭代法
专业班级 机械工程 姓 名 余红杰 学 号 2111505010
指导教师 陈剑 成 绩 日 期 月 日
一. 实验目的
1、 在计算机上用Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组 。
2、 在计算机上用二分法和Newton 迭代法求非线性方程 的根。
二. 实验要求
1、按照题目要求完成实验内容;
2、写出相应的Matlab 程序;
3、给出实验结果(可以用表格展示实验结果);
4、分析和讨论实验结果并提出可能的优化实验。
5、写出实验报告。
三. 实验步骤
1、用Matlab 编写Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组Ax b =的程序。
2、用Matlab 编写二分法和Newton 法求非线性方程()0f x =的根程序。
3、设⎪⎪⎪⎭
⎫ ⎝⎛--=212120
203A ,T b )1,3,1(=,对于线性方程组b Ax =,考虑如下问题: (1)分别写出Jacobi 迭代矩阵和Gauss-Seidel 迭代矩阵
(2)用Jacobi 迭代法和Gauss-Seidel 迭代法解该方程时,是否收敛?谁收敛的更快?
(3)用实验步骤1编好的两种迭代法程序进行实验,通过数值结果验证(2)的结论。
4、用调试好的二分法和Newton 迭代法程序解决如下问题
求020sin 35=-+-x x e x 的根,其中控制精度810-=eps ,最大迭代次数50=M 。
四. 实验结果
1.%Jacob.m
function [x,B] = Jacob(A,b,n)
matlab高斯-赛德尔迭代程序
matlab中应用的高斯-赛德尔迭代程序
主程序如下:
function X=gsdddy(A,b,X0,P,wucha,max1)
D=diag(diag(A));U=-triu(A,1);
L=-tril(A, -1);dD=det(D);
if dD==0
disp('请注意:因为对角阵D奇异,所以此方程无解')
else
disp('请注意:因为对角阵距D非奇异,所以此方程有解')
iD=inv(D -L);B2=iD*U;f2=iD*b;jX=A\b;
X=X0;[n m]=size(A);
for k=1:max1
X1=B2*X+f2;djwcX=norm(X1 -X,P);
xdwcX=djwcX/(norm(X,P)+eps);
if(djwcX<wucha)|(xdwcX<wucha)
return
else
k;X1';k=k+1;X=X1;
end
end
if(djwcX<wucha)|(xdwcX<wucha)
disp('请注意:高斯-赛德尔迭代收敛,此A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下:')
else
diso('请注意:高斯-赛德尔迭代的结果没有达到给定的精度,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jx和迭代X如下:')
X=X';jX=kX';
end
end
X=X';D;U;L;jX=jX';
在主窗口框中输入以下例子
>> A=[10 3 1;2 -10 3;1 3 10];
>> b=[14;11;20];X0=[0 0 0]';
高斯-赛德尔迭代法matlab程序
高斯-赛德尔迭代法matlab程序
disp('划分为M*M个正方形')
M=5 %每行的方格数,改变M可以方便地改变剖分的点数
u=zeros(M+1);%得到一个(M+1)*(M+1)的矩阵
disp('对每个剖分点赋初值,因为迭代次数很高,所以如何赋初值并不重要,故采用对列线性赋值。')
disp('对边界内的点赋初值并使用边界条件对边界赋值:')
for j=1:M-1
for i=1:M-1
u(i+1,j+1)=100*sin(pi/M*j)/M*(M-i);%对矩阵(即每个刨分点)赋初值
end
end
for i=1:M+1
u(1,i)=100*sin(pi*(i-1)/M);%使用边界条件对边界赋值
u(1,M+1)=0;
end
u
tic %获取运行时间的起点
disp('迭代次数为N')
N=6 %迭代次数,改变N可以方便地改变迭代次数
disp('n为当前迭代次数,u为当前值,结果如下:')
for n=1:N
for p=2:M
i=M+2-p;
for j=2:M
u(i,j)=0.25*(u(i,j-1)+u(i+1,j)+u(i-1,j)+u(i,j+1));%赛德尔迭代法
end
end
n %输出n
u %输出u
end
disp('所用的时间:')
t=toc %获取算法运行需要的时间
[x,y]=meshgrid(0:1/M:1,0:1/M:1);
z=u(1,:);
for a=2:M+1
z=[z;u(a,:)];%获取最终迭代的结果,幅值给z,z的值代表该点的点位值
end
mesh(x,y,z)%绘制三维视图以便清楚地显示结果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
disp('划分为M*M个正方形')
M=5 %每行的方格数,改变M可以方便地改变剖分的点数
u=zeros(M+1);%得到一个(M+1)*(M+1)的矩阵
disp('对每个剖分点赋初值,因为迭代次数很高,所以如何赋初值并不重要,故采用对列线性赋值。')
disp('对边界内的点赋初值并使用边界条件对边界赋值:')
for j=1:M-1
for i=1:M-1
u(i+1,j+1)=100*sin(pi/M*j)/M*(M-i);%对矩阵(即每个刨分点)赋初值
end
end
for i=1:M+1
u(1,i)=100*sin(pi*(i-1)/M);%使用边界条件对边界赋值
u(1,M+1)=0;
end
u
tic %获取运行时间的起点
disp('迭代次数为N')
N=6 %迭代次数,改变N可以方便地改变迭代次数
disp('n为当前迭代次数,u为当前值,结果如下:')
for n=1:N
for p=2:M
i=M+2-p;
for j=2:M
u(i,j)=0.25*(u(i,j-1)+u(i+1,j)+u(i-1,j)+u(i,j+1));%赛德尔迭代法
end
end
n %输出n
u %输出u
end
disp('所用的时间:')
t=toc %获取算法运行需要的时间
[x,y]=meshgrid(0:1/M:1,0:1/M:1);
z=u(1,:);
for a=2:M+1
z=[z;u(a,:)];%获取最终迭代的结果,幅值给z,z的值代表该点的点位值
end
mesh(x,y,z)%绘制三维视图以便清楚地显示结果
mesh(x,y,z,'FaceColor','white','EdgeColor','black') %绘制三维视图以便清楚地显示结果