文档库 最新最全的文档下载
当前位置:文档库 › Matlab实验报告:分形迭代

Matlab实验报告:分形迭代

Matlab实验报告:分形迭代
Matlab实验报告:分形迭代

数学实验报告:分形迭代

练习1

1.实验目的:绘制分形图案并分析其特点。

2.实验内容:绘制Koch曲线、Sierpinski三角形和树木花草图形,观察这些图形的局部和原来分形图形的关系。

3.实验思路:利用函数反复调用自己来模拟分形构造时的迭代过程,当迭代指标n为0时运行作图操作,否则继续迭代。

4.实验步骤:

(1)Koch曲线

function koch(p,q,n) % p、q分别为koch曲线的始末复坐标,n为迭代次数

if (n==0)

plot([real(p);real(q)],[imag(p);imag(q)]);

hold on;

axis equal

else

a=(2*p+q)/3; % 求出从p 到q 的1/3 处端点a

b=(p+2*q)/3; % 求出从p 到q 的2/3 处端点b

c=a+(b-a)*exp(pi*i/3);%

koch(p, a, n-1); % 对pa 线段做下一回合

koch(a, c, n-1); % 对ac 线段做下一回合

koch(c, b, n-1); % 对cb 线段做下一回合

koch(b, q, n-1); % 对bq 线段做下一回合

end

(2)Sierpinski三角形

function sierpinski(a,b,c,n) % a、b、c为三角形顶点,n为迭代次数

if (n==0)

fill([real(a) real(b) real(c)],[imag(a) imag(b) imag(c)],'b');% 填充三角形abc

hold on;

axis equal

else

a1=(b+c)/2;

b1=(a+c)/2;

c1=(a+b)/2;

sierpinski(a,b1,c1,n-1);

sierpinski(a1,b,c1,n-1);

sierpinski(a1,b1,c,n-1);

end

(3)树木花草

function grasstree(p,q,n) % p、q分别为树木花草始末复坐标,n为迭代次数

plot([real(p);real(q)],[imag(p);imag(q)]);

hold on;

axis equal

if(n>0)

a=(2*p+q)/3;

b=(p+2*q)/3;

c=a+(b-a)*exp(pi*i/6);%

d=b+(q-b)*exp(-pi*i/6);%

grasstree(a,c,n-1);

grasstree(b,d,n-1);

end

end

5.主要输出:

指令:koch(0,1,5); soerpinski(0,1,exp(pi*i/3),5); grasstree(0,i,5);

Koch曲线

Sierpinski三角形

树木花草

6.实验结论:以上图案的局部形状与原本图形用某种自相似性,这正是分形的特点。

7.问题分析:一般迭代次数大于7,程序运行时间就很长,因此迭代次数建议设定为5。

练习2

1.实验目的:研究Koah雪花的特征。

2.实验内容:对一个等边三角形,每条边按照Koch曲线的方式进行迭代,产生的分形图称为Koch雪花。编制程序绘制出它的图形,并计算Koch雪花的面积,以及它的分形维数。

3.方法思路:采用Koch曲线的迭代元来绘制。

4.实验步骤:

function xuehua(n)

koch(0,0.5+(1/2)*sqrt(3)*i,n);

koch(0.5+(1/2)*sqrt(3)*i,1,n);

koch(1,0,n);

end

xuehua(1);xuehua(3)

5.主要输出:

不同n对应不同的图像如下:

n=1 n=3

6.实验结论:每一次迭加,所产生的新三角形的边长变为上一次的1/3,数量为上一次的4

倍。而设原三角形边长为r ,Koch 雪花的面积∑=-???+=n i i

i r r S 1

21

22]3143[4343, 由此可以推出雪花曲线的边长是无限的,而面积是有限的。另外,从图像可以看出,随迭代

次数n 趋于无穷,图形每一点都没有切线。 7.问题分析:由于没有找到matlab 中相应的计算图形面积与周长的函数,所以这两项计算是由人工完成的。

练习3

1.实验目的:研究分形维数反映出来的分形的特性。

2.实验内容:利用分形维数公式d=log(n)/log(c)计算雪花曲线,Sierpinski 三角形,Minkowski 香肠的维数并与其图像显现出的性质进行比较。

3.方法思路:只需画出Minkowski 香肠的图像,其他分形利用之前图像与维数进行比较即可。

4.实验步骤:

Minkowski 香肠:

function Minkowski(p,q,n) if (n==0)

plot([real(p);real(q)],[imag(p);imag(q)]); hold on; axis equal else

m=(q-p)/4;m1=real(m);m2=imag(m);

a=p+m; b=a+(-m2+m1*i);c=b+m;d0=c+(m2-m1*i); d=c+2*(m2-m1*i);e=d+m;f=e+(-m2+m1*i); Minkowski(p, a, n-1); Minkowski(a, b, n-1); Minkowski(b, c, n-1); Minkowski(c, d0, n-1); Minkowski(d0, d, n-1); Minkowski(d, e, n-1); Minkowski(e, f, n-1);

Minkowski(f, q, n-1);

5.实验输出:由分形维数公式log(n)/log(c)可计算的个图形的维数。

雪花曲线:log4/log3=1.26

Minkowski 香肠:log n/logc=1.5 Sierpinski 三角形:log3/log2=1.58

Minkowski 香肠:

6.实验结论:可见雪花曲线,Sierpinski 三角形,Minkowski 香肠的维数都在1与2之间,它们的图像的面积都有极限,而图形边长无限长。维数越接近1,则图形有更多的曲线的性质,维数越接近2,则图形有更多的平面的性质,由此可推算Hilbert 曲线的维数很接近2。

7.问题分析:迭代次数越大,则图像的说明效果越好,但程序的运行时间也越长,建议迭代次数不要超过7。

练习4

1.实验目的:探索Weierstrass 函数图像的性质

2.实验内容:已知Weierstrass 函数如下:

()()()21

sin ,1,12,

s k k k W x x s λλλ∞

-==><<∑

对不同的s 值,画出函数图像,观察图像的不规则性与s 的关系,并猜测Weierstrass 函数图像的维数与s 的关系 3.方法思路:由于Weierstrass 函数表达式中为无穷项求和,Matlab 中使用无穷项求和花费太 多时间,所以考虑取足够大的项数进行运算,通过变换s 的值,画出不同的图像 进行比较,达到原来的实验目的。 4.实验步骤:

syms f x

f=0; y=10; s=1.4; %s=1.6; %s=1.8; for i=1:100

f=f+y^((s-2)*i)*sin(y^(i)*x); end

ezplot(f,[0,2])

5.实验输出:

S的取值对应Weierstrass函数的图像S=1.4

s=1.6

s=1.8

6.实验结论:Weierstrass函数图像随着s值的增加变得更加不规则

猜测随着s取不同的值,Weierstrass函数图像的维数随着s值得增加而变大

7.问题分析:考虑到不同项数的做和可能会影响图像的准确性,但在实验了100项、300

项和500项的做和后,发现图像改变并不是很大,而当项数改为1000后,

发现又要等很长的时间,且得到的结论相同,所以取100项的求和进行实

验。

练习6

1.实验目的:绘制Mandelbrot集和Julia集。

2.实验内容:绘制Mandelbrot集并局部放大,与其不同的部位(内点、外电、边界点及芽孢内点)对应的Julia集形状进行对比。

3.实验思路:按照Mandelbrot集和Julia集的构造方法,先编写好相应函数,观察Mandelbrot 集的局部细节,出几个典型的内点、外电、边界点及芽孢内点,然后画出对应的Julia集并比较。

4.实验步骤:

(1)Mandelbrot集

function mandelbrot(z,r,k,d)

if nargin < 4

k = 200; %迭代次数

d = 500; %分辨率

z=-0.75; %中心

r=1.25; %显示半径

end

x = linspace(real(z)-r,real(z)+r,d);

y = linspace(imag(z)-r,imag(z)+r,d);

A = ones(d,1)*x+i*(ones(d,1)*y)';

C=A;

B = zeros(d,d);

for s = 1:k

B = B+(abs(A)<=2);

A = A.*A+C;

end;

imagesc(flipud(B));

colormap(jet);

hold off;

axis equal;

axis off;

(2)Julia集

function Julia(c,k,v)

if nargin < 3

c = -0.5; k = 100; v = 500;

end

r = max(abs(c),2);

d = linspace(-r,r,v);

A = ones(v,1)*d+i*(ones(v,1)*d)';

B = zeros(v,v);

for s = 1:k

B = B+(abs(A)<=r);

A = A.*A+ones(v,v).*c;

end;

imagesc(B);

colormap(jet);

hold off;

axis equal;

axis off;

5.主要输出:以下为不同z值的Mandelbrot集的局部放大图形以及对应的Julia集图形

Mandelbrot

集全局图

Mandelbrot集局部对应Julia集

z= -1;

z为内点。

z= -1+0.5i

z为外点。

z= -1+0.3i

z为边界点。

z= -1.448

z为芽孢的内点

z= -1.76

z为一个更

小的芽孢的

内点

6..实验结论:当z为Mandelbrot集的内点时,则对应的Julia集有内点,且图形面积很大;

当z为Mandelbrot集的外点时,则对应的Julia集为空集;

当z为Mandelbrot集的边界点时,则对应的Julia集无内点但连通,且两图形状相似。

当z为Mandelbrot集的芽孢的内点时,则对应的Julia集有内点,且芽孢的面积越大,

对应Julia集的面积越大。

另外,Mandelbrot集的芽孢与整个Mandelbrot集有明显的相似性。

7.问题分析:由于分形的结构是无限精细的,要确定Mandelbrot集的边界点并不容易,事实上

实验过程中只选取了一个与边界点很接近的点;另外,根据本算法所画的Julia

集是不可能为空集的,但可以根据Julia集的收敛速度判断其实际的Julia集是否

为空集。

练习9

1.实验目的:绘制IFS迭代的吸引子图,并观察图形的特点。

2.实验内容:给定的仿射变换为:

w1(Z) = sZ+1,w2(Z) = sZ -1

相应概率p1=p2=0.5,其中s,Z为复数,现取s=0.5+0.5i,绘制相应IFS迭代

吸引子图,再通过变换s的值,观察图形变化。

3.方法思路:可以构造一个[0,1]上随机取值的n列矩阵来完成这个概率事件,当第i个元的

值小于0.5时,取w1的迭代方式,反之,取w2的迭代方式,再将最终的所有迭

代。序列汇总为一个n行矩阵,再在图上进行描点。

4.实验步骤:

n=1000000;

p=rand(n,1);

w=zeros(1,n);

s=0.5+0.5*i;

%s=1+0.5*i;

%s=0.5+0.4i;

%s=0.4+0.5i;

Z=1+i;

w(1)=Z;

for m=1:n-1

if p(m)<0.5

w(m+1)=s*w(m)+1;

else

w(m+1)=s*w(m)-1;

end

end

plot(w(1:n),'.','MarkerSize',1)

5.实验输出:

s的取值IFS迭代的吸引子的图形s=0.5+0.5i

s=1+0.5i

s=0.5+0.4i

s=0.4+0.5i

6.实验结论:s值的不同,直接影响了图形的构成,但除了第二个图外都具备自相似性。

7.问题分析:当s值为0.5+0.5i,0.5+0.4i和0.4+0.5i时,点列很明显能构成分形,

但当更改了s的值以后,图像的性质也跟着发生了变化,变为一些有规律

或者很分散的点列。

matlab实验十七__牛顿迭代法(可打印修改)

实验十七牛顿迭代法 【实验目的】 1.了解牛顿迭代法的基本概念。 2.了解牛顿迭代法的收敛性和收敛速度。 3.学习、掌握MATLAB软件的有关命令。 【实验内容】 用牛顿迭代法求方程的近似根,误差不超过。 3210 ++-=3 10- x x x 【实验准备】 1.牛顿迭代法原理 2.牛顿迭代法的几何解析 3.牛顿迭代法的收敛性 4.牛顿迭代法的收敛速度 5.迭代过程的加速 6.迭代的MATLAB命令 MATLAB中主要用for,while等控制流命令实现迭代。 【实验重点】 1.牛顿迭代法的算法实现 2.牛顿迭代法收敛性和收敛速度 【实验难点】 1.牛顿迭代法收敛性和收敛速度 【实验方法与步骤】 练习1用牛顿迭代法求方程在x=0.5附近的近似 3210 ++-= x x x

根,误差不超过。 310-牛顿迭代法的迭代函数为 322()1()()321 f x x x x g x x x f x x x ++-=-=-'++相应的MATLAB 代码为 >>clear; >>x=0.5; >>for i=1:3 >>x=x-(x^3+x^2+x-1)/(3*x^2+2*x+1) >>end 可算的迭代数列的前3项0.5455,0.5437,0.5437。经三次迭代,就大大超过了精度要求。 练习2 用牛顿迭代法求方程的近似正实根,由此建2(0)x a a =>立一种求平方根的计算方法。 由计算可知,迭代格式为,在实验12的练习4中1()()2a g x x x =+已经进行了讨论。 【练习与思考】 1.用牛顿迭代法求方程的近似根。 ln 1x x =2.为求出方程的根,在区间[1,2]内使用迭代函数进行310x x --=迭代,纪录迭代数据,问迭代是否收敛?对迭代进行加速,对比加速前的数据,比较加速效果。 3.使用在不动点的泰勒公式,证明牛顿迭代法收敛原理。*x

matlab实现牛顿迭代法求解非线性方程组教学文稿

matlab实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到0.00001 ———————————————————————————————— 首先建立函数fun 储存方程组编程如下将fun.m保存到工作路径中: function f=fun(x); %定义非线性方程组如下 %变量x1 x2 x3 %函数f1 f2 f3 syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2; f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3; f=[f1 f2 f3]; ———————————————————————————————— 建立函数dfun 用来求方程组的雅克比矩阵将dfun.m保存到工作路径中: function df=dfun(x); %用来求解方程组的雅克比矩阵储存在dfun中 f=fun(x); df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')]; df=conj(df'); ———————————————————————————————— 编程牛顿法求解非线性方程组将newton.m保存到工作路径中: function x=newton(x0,eps,N); con=0; %其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N; f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); x=x0-f/df; for j=1: length(x0); il(i,j)=x(j); end if norm(x-x0)

MATLAB代码 解线性方程组的迭代法

解线性方程组的迭代法 1.rs里查森迭代法求线性方程组Ax=b的解 function[x,n]=rs(A,b,x0,eps,M) if(nargin==3) eps=1.0e-6;%eps表示迭代精度 M=10000;%M表示迭代步数的限制值elseif(nargin==4) M=10000; end I=eye(size(A)); n=0; x=x0; tol=1; %迭代过程 while(tol>eps) x=(I-A)*x0+b; n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x; if(n>=M) disp('Warning:迭代次数太多,可能不收敛!'); return; end end 2.crs里查森参数迭代法求线性方程组Ax=b的解 function[x,n]=crs(A,b,x0,w,eps,M) if(nargin==4) eps=1.0e-6;%eps表示迭代精度 M=10000;%M表示迭代步数的限制值 elseif(nargin==5) M=10000; end I=eye(size(A)); n=0; x=x0; tol=1; %迭代过程 while(tol>eps) x=(I-w*A)*x0+w*b; n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x;

if(n>=M) disp('Warning:迭代次数太多,可能不收敛!'); return; end end 3.grs里查森迭代法求线性方程组Ax=b的解 function[x,n]=grs(A,b,x0,W,eps,M) if(nargin==4) eps=1.0e-6;%eps表示迭代精度 M=10000;%M表示迭代步数的限制值 elseif(nargin==5) M=10000; end I=eye(size(A)); n=0; x=x0; tol=1;%前后两次迭代结果误差 %迭代过程 while(tol>eps) x=(I-W*A)*x0+W*b;%迭代公式 n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x; if(n>=M) disp('Warning:迭代次数太多,可能不收敛!'); return; end end 4.jacobi雅可比迭代法求线性方程组Ax=b的解 function[x,n]=jacobi(A,b,x0,eps,varargin) if nargin==3 eps=1.0e-6; M=200; elseif nargin<3 error return elseif nargin==5 M=varargin{1}; end D=diag(diag(A));%求A的对角矩阵 L=-tril(A,-1);%求A的下三角阵

雅可比迭代法

2013-2014(1)专业课程实践论文 题目:雅可比迭代法

一、算法理论 设有方程组),...,2,1(1 n i b x a i j n j ij ==∑= 记作,b Ax = (1) A 为非奇异阵且),,...,2,1(0n i a ij =≠将A 分裂为U L D A --=,其中 D =????????????????nn a a a 22 11,L =-??? ????? ???? ????-00001,21323121n n n n a a a a a a U =-?? ? ?? ? ? ? ????????-0000,122311312n n n n a a a a a a 将式(1)第)....2,1(n i i =个方程用ii a 去除再移项,得到等价方程组 (),,...,2,111n i x a b a x n i j j j ij i ii i =??? ? ? ?? -=∑≠= (2) 简记作 ,0f x B x += 其中 ().,111 0b D f U L D A D I B ---=+=-= 对方程组(2)应用迭代法,得到解式(1)的雅可比迭代公式 () () ()()()()()????????? ?? ? ??- ==∑≠=+,1,...,11002010n i j i k j ij i ii k i t n x a b a x x x x x , 初始向量 (3)

其中()()()()()T k n k k k x x x x ,,...,21=为第k 次迭代向量。设()k x 已经算出,由式(3)可计算下一次迭代向量()(),,...,2,1,...;2,1,01n i k x k ==+ 显然迭代公式(3)的矩阵形式为 ()()()()???+=+,010f x B x x k k ,初始向量 其中0B 称为雅可比方法迭代矩阵。

牛顿迭代法解元方程组以及误差分析matlab实现

.0],;,[0 ),()(),()(),(0),()(),()(),(,.**,0],;,[),()()(),()()(,0),(),(),(])()[(),(),(),(),(),(])()[(),(),(2,),(])()[(21),(])()[(),(),()(2 )(''))((')()(: 1n 1n 110101010100000000000000000000000000200000000000 00 000fg g f y y g f g f g f fg x x g g f f y x g y y y x g x x y x g y x f y y y x f x x y x f y x y x y x g f g f fg g f y y g f g f g f fg x x g f g f fg g f y y g f g f g f fg x x g g f f y x g y x g y y y x g x x y x f y x f y y y x f x x y x g y x f y x g y y y x x x y x g y x g y x f y x g y x f y y y x x x y x f y x f y x y x f y y y x x x y x f y y y x x x y x f y x f x x f x x x f x f x f x x n n x y y x y y y x y x n n y n n n x n n n n n y n n n x n n n n n x y y x x x x y y x y y x y y x x x x y y x y y y x y x y x y x y y x x y y x x y x y y x x ,则其解可记为: 的行列式不为若系数矩阵: 附近的线性化方程组为在一元方程牛顿迭代法,类似 ,的新近似值于是就得到了根,则可得解: 的行列式不为若系数矩阵),(),( ),(),( 则两式构成方程组: 令可得: 构成二元方程组,同样与若另有一方程: 阶小项,得到线性方程忽略在方程根附近取值时,当二元函数的展开为: 开类似一元函数的泰勒展?????+-+=-+-+=?????=-+-+=-+-+??? ????-+-+=-+-+=????????-+-=--+-=-?????-=-+--=-+-==??-+??-+=??-+??-+=??-+??-+??-+??-+=-+ -+=++========η ξξ

MATLAB样例之雅克比迭代法

要求: 下面分别使用雅克比迭代法和高斯-赛德尔迭代法求一个方程组的近似解用的线性方程组是按实验要求给的: 7*x1+x2+2*x3=10 x1+8*x2+2*x3=8 2*x1+2*x2+9*x3=6 雅克比迭代法的matlab代码:(老师写的) A=[7,1,2;1,8,2;2,2,9]; b=[10;8;6]; if(any(diag(A))==0) error('error,pause') end eps=input('误差限eps='); N=input('迭代次数N='); D=diag(diag(A)); B=inv(D)*(D-A); f=inv(D)*b; K=0; x0=zeros(size(b)); while 1 x1=B*x0+f K=K+1; fprintf('第-次迭代的近似解为',K) disp(x1'); if norm(x1-x0,inf)N fprintf('迭代超限') end x0=x1; end 高斯-赛德尔迭代法matlab代码:(自己改的)

A=[7,1,2;1,8,2;2,2,9]; b=[10;8;6]; if(all(diag(A))==0) error('error,pause') end eps=input('误差限eps='); N=input('迭代次数N='); D=diag(diag(A)); B=inv(D)*(D-A); f=inv(D)*b; K=0; x0=zeros(size(b)); x00=x0; while 1 x11=B*x0+f; x00(1,1)=x11(1,1); x12=B*x00+f; x00(2,1)=x12(2,1); x13=B*x00+f; x00(3,1)=x13(3,1); x1=x00 K=K+1; fprintf('第-次迭代的近似解为',K) disp(x1'); if norm(x1-x0,inf)N fprintf('迭代超限') end x0=x1; end

MATLAB程序(牛顿法及线形方程组)

MATLAB 程序 1、图示牛顿迭代法(M 文件)文件名:newt_g function x = new_g(f_name,x0,xmin,xmax,n_points) clf,hold off % newton_method with graphic illustration del_x = 0.001; wid_x = xmax - xmin; dx = (xmax - xmin)/n_points; xp = xmin:dx:xmax; yp = feval(f_name,xp); plot(xp,yp);xlabel('x');ylabel('f(x)'); title('newton iteration'),hold on ymin = min(yp); ymax = max(yp); wid_y = ymax-ymin; yp = 0. * xp; plot(xp,yp) x = x0; xb = x+999; n=0; while abs(x-xb) > 0.000001 if n > 300 break; end y=feval(f_name,x); plot([x,x],[y,0]);plot(x,0,'o') fprintf(' n = % 3.0f, x = % 12.5e, y = % 12.5e \ n', n, x, y); xsc = (x-xmin)/wid_x; if n < 4, text(x,wid_y/20,[num2str(n)]), end y_driv = (feval(f_name,x + del_x) - y)/del_x; xb = x; x = xb - y/y_driv; n = n+1; plot([xb,x],[y,0]) end plot([x x],[0.05 * wid_y 0.2 * wid_y]) text( x, 0.2 * wid_y, 'final solution') plot([ x ( x - wid_x * 0.004)], [0.01 * wid_y 0.09 * wid_y]) plot([ x ( x + wid_x * 0.004)], [0.01 * wid_y 0.09 * wid_y]) 传热问题 假设一个火炉是用厚度为0.05m 的砖单层砌成的。炉内壁温度为T 0=625K, 外壁温度为T 1(未知)。由于对流和辐射造成了外壁的热量损失,温度T 1由下式决定: 44111()()()()0f k f T T T T T h T T x εσ∞=-+-+-=? 其中: k :炉壁的热传导系数,1.2W/mK ε: 发射率,0.8 T 0:内壁温度,625K T 1:外壁温度(未知),K T ∞:环境温度,298K T f :空气温度,298K H :热交换系数,20W/m 2K

高斯-赛德尔迭代法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)%绘制三维视图以便清楚地显示结果 mesh(x,y,z,'FaceColor','white','EdgeColor','black') %绘制三维视图以便清楚地显示结果

lu分解法、列主元高斯法、jacobi迭代法、gaussseidel法的原理及matlab程序

一、实验目的及题目 1.1 实验目的: (1)学会用高斯列主元消去法,LU 分解法,Jacobi 迭代法和Gauss-Seidel 迭代法解线性方程组。 (2)学会用Matlab 编写各种方法求解线性方程组的程序。 1.2 实验题目: 1. 用列主元消去法解方程组: 1241234 123412343421233234x x x x x x x x x x x x x x x ++=??+-+=??--+=-??-++-=? 2. 用LU 分解法解方程组,Ax b =其中 4824012242412120620266216A --?? ?- ?= ? ?-??,4422b ?? ? ?= ?- ?-?? 3. 分别用Jacobi 迭代法和Gauss-Seidel 迭代法求解方程组: 123234 1231234102118311210631125x x x x x x x x x x x x x -+=-??-+=-??-+=??-+-+ =? 二、实验原理、程序框图、程序代码等 2.1实验原理 2.1.1高斯列主元消去法的原理 Gauss 消去法的基本思想是一次用前面的方程消去后面的未知数,从而将方程组化为等价形式: 1111221122222n n n n nn n n b x b x b x g b x b x g b x g +++=??++=????= ? 这个过程就是消元,然后再回代就好了。具体过程如下: 对于1,2, ,1k n =-,若() 0,k kk a ≠依次计算

()() (1)()()(1)()()/,,1, ,k k ik ik kk k k k ij ij ik kj k k k i i ik k m a a a a m a b b m b i j k n ++==-=-=+ 然后将其回代得到: ()() ()()()1/()/,1,2,,1 n n n n nn n k k k k k kj j kk j k x b a x b a x a k n n =+?=??=-=--? ? ∑ 以上是高斯消去。 但是高斯消去法在消元的过程中有可能会出现() 0k kk a =的情况,这时消元就无法进行了,即使主元数() 0,k kk a ≠但是很小时,其做除数,也会导致其他元素数量级的严重增长和舍入误差的扩散。因此,为了减少误差,每次消元选取系数矩阵的某列中绝对值最大的元素作为主元素。然后换行使之变到主元位置上,再进行销元计算。即高斯列主元消去法。 2.1.2直接三角分解法(LU 分解)的原理 先将矩阵A 直接分解为A LU =则求解方程组的问题就等价于求解两个三角形方程组。 直接利用矩阵乘法,得到矩阵的三角分解计算公式为: 1111111 11 1,1,2,,/,2,,,,,1,,,2,3, ()/,1,2, ,i i i i k kj kj km mj m k ik ik im mk kk m u a i n l a u i n u a l u j k k n k n l a l u u i k k n k n -=-===?? ==?? =-=+??=??=-=++≠?? ∑∑且 由上面的式子得到矩阵A 的LU 分解后,求解Ux=y 的计算公式为 11 111,2,3,/()/,1,2, ,1 i i i ij j j n n nn n i i ij j ii j i y b y b l y i n x y u x y u x u i n n -==+=??? =-=?? =??? =-=--?? ∑∑ 以上为LU 分解法。

非线性方程组求解的牛顿迭代法用MATLAB实现

1. 二元函数的newton 迭代法理论分析 设),(y x f z =在点),(00y x 的某一邻域内连续且有直到2阶的连续偏导数,),(00h y h x ++为该邻域内任意一点,则有 ?? ? ????? +??+≈++==00) ,(),(),(),(0000y y x x y x f y k y x f x h y x f k y h x f 其中 0x x h -=,0y -=y k 于是方程0),(=y x f 可近似表示为 0) ,(),(),(k =?? ? ????? +??+==k k y y x x k y x f y k y x f x h y x f 即 0),()(),()(),(y k =-+-+k k k k k x k k y x f y y y x f x x y x f 同理,设y)g(x,z =在点),(00y x 的某一邻域内连续且有直到2阶的连续偏导数,),(00h y h x ++为该邻域内任意一点,亦有 ?? ?????? +??+≈++==00),(),(),(),(0000y y x x y x g y k y x g x h y x g k y h x g 其中0x x h -=,0y -=y k 于是方程0),(g =y x 可近似表示为 0) ,(),(),(k =?? ? ????? +??+==k k y y x x k y x g y k y x g x h y x g 即 0),(g )(),()(),(y k =-+-+k k k k k x k k y x y y y x g x x y x g 于是得到方程组 ? ??=-+-+=-+-+0),(g )(),()(),(0),()(),()(),(y k y k k k k k k x k k k k k k k x k k y x y y y x g x x y x g y x f y y y x f x x y x f

2-8牛顿迭代法matlab

实验七 牛顿迭代法 【实验目的】 1.了解牛顿迭代法的基本概念。 2.了解牛顿迭代法的收敛性和收敛速度。 3.学习掌握MATLAB 软件有关的命令。 【实验内容】 用牛顿迭代法求方程0123=-++x x x 的近似根,误差不超过310-。 【实验准备】 1.牛顿迭代法原理 设已知方程0)(=x f 的近似根0x ,则在0x 附近)(x f 可用一阶泰勒多项式))((')()(000x x x f x f x p -+=近似代替.因此, 方程0)(=x f 可近似地表示为0)(=x p .用1x 表示0)(=x p 的根,它与0)(=x f 的根差异不大. 设0)('0≠x f ,由于1x 满足,0))((')(0100=-+x x x f x f 解得 ) (')(0001x f x f x x -= 重复这一过程,得到迭代格式 ) (')(1n n n n x f x f x x -=+ 这就是著名的牛顿迭代公式,它相应的不动点方程为 ) (')()(x f x f x x g -=. 2. 牛顿迭代法的几何解析 在0x 处作曲线的切线,切线方程为))((')(000x x x f x f y -+=。令 0=y ,可得切线与x 轴的交点坐标) (')(0001x f x f x x -=,这就是牛顿法的迭代公式。因此,牛顿法又称“切线法”。

3.牛顿迭代法的收敛性 计算可得2)] ('[)(")()('x f x f x f x g -=,设*x 是0)(=x f 的单根,有0)(',0)(**≠=x f x f ,则 0)]('[)(")()('2**** =-=x f x f x f x g , 故在*x 附近,有1)('>clear; >>x=0.5; >>for i=1:3 >>x=x-(x^3+x^2+x-1)/(3*x^2+2*x+1) >>end 可算得迭代数列的前3项0.5455, 0.5437, 0.5437.近三次迭代,就大大超过了精度要求. 练习2用牛顿迭代法求方程)0(2>=a a x .的近似正实根,由此建立一种求平方根的计算方法. 由计算可知,迭代格式为)(21)(x a x x g += .,在实验12的练习4种已经进行了讨论. 练习3用牛顿迭代法求方程1=x xe 的正根. 牛顿迭代法的迭代函数为

二分法、简单迭代法的matlab代码实现

实验一非线性方程的数值解法(一) 信息与计算科学金融崔振威201002034031一、实验目的: 熟悉二分法和简单迭代法的算法实现。 二、实验内容: 教材P40 2.1.5 三、实验要求 1根据实验内容编写二分法和简单迭代法的算法实现 2简单比较分析两种算法的误差 3试构造不同的迭代格式,分析比较其收敛性 (一)、二分法程序: function ef=bisect(fx,xa,xb ,n, delta) % fx是由方程转化的关于x的函数,有fx=0。 % xa解区间上限 % xb解区间下限 % n最多循环步数,防止死循环。 %delta为允许误差 x=xa;fa=eval(fx); x=xb;fb=eval(fx); disp(' [ n xa xb xc fc ]'); for i=1: n xc=(xa+xb)/2;x=xc;fc=eval(fx); X=[i,xa,xb,xc,fc]; disp(X), if fc*fa<0 xb=xc; else xa=xc; end if (xb-xa)

k=0; while abs(x-xO)>eps & k> fplot('[x A5-3*x A3-2*x A2+2]',[-3,3]);grid 得下图: 由上图可得知:方程在[-3,3]区间有根。 (2 )、二分法输出结果 >> f='xA5-3*xA3-2*xA2+2' f = X A5-3*X A3-2*X A2+2 >> bisect(f,-3,3,20,10A(-12)) 2.0000 - 3.0000 0 -1.5000 0.0313

matlab 迭代法[精品]

matlab 迭代法[精品] 1. 矩阵 122,211,,,,,,,,,A,111A,222, 11,,,,,,,,221,,112,,,, 证明:求解以为系数矩阵线性方程组的Jacobi迭代式收敛的,而A1 Gauss-Seidel方法是发散的;求解以为系数矩阵线性方程组的A2实验名称Gauss-Seidel是收敛的,而Jacobi方法是发散的. 2. 矩阵 1aa,,,,Aaa,1 ,,,,aa1,, (a) 参数取什么值时,矩阵是正定的. a (b) 取什么值时,求以为系数矩阵线性方程组的Jacobi迭代式收aa 敛的. 1、根据迭代收敛性的充分必要条件来判断Jacobi迭代式与Gauss-Seide 迭代式的收敛性,迭代收敛性仅与方程组系数矩阵有关,与右端无关;而且不依赖于初值的选取。实验目的 2、根据矩阵的判断定理求得矩阵元素a的取值,同时根据矩阵线性方程组的Jacobi迭代式收敛的充分条件(严格对角占优)来求a得取值。 1、(1)检验线性方程组的Jacobi迭代式的收敛性: function jacobi(A) D=zeros(3); for i=1:3 D(i,i)=A(i,i); 实验内容end (算法、程B=D^(-1)*(D-A); 序、步骤和k=max(abs(eig(B))) 方法) if k<1

'该线性方程组的Jacobi迭代式是收敛的' else k>=1 '该线性方程组的Jacobi迭代式是发散的' end (2)检验线性方程组的Gauss-Seide迭代式的收敛性: function Gauss(A) D=zeros(3); L=zeros(3); U=zeros(3); for i=1:3 D(i,i)=A(i,i); end L(2:3,1)=A(2:3,1); L(3,2)=A(3,2); U(1,2:3)=A(1,2:3); U(2,3)=A(2,3); B=-(D+L)^(-1)*U; k=max(abs(eig(B))) if k<1 '该线性方程组的Gauss-Seidel迭代式是收敛的' else k>=1 '该线性方程组的Gauss-Seidel迭代式是发散的' end 2、(1)参数取什么值时,矩阵是正定的.(矩阵的特征值全为正) a >> syms a >> A=[1 a a;a 1 a;a a 1]; >> eig(A) ans = 2*a+1 1-a

雅可比迭代法与矩阵的特征值

实验五 矩阵的lu分解法,雅可比迭代法 班级: 学号: 姓名:

实验五 矩阵的LU 分解法,雅可比迭代 一、目的与要求: 熟悉求解线性方程组的有关理论和方法; 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序; 通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。 二、实验内容: 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解 各种方法的优缺点。 三、程序与实例 列主元高斯消去法 算法:将方程用增广矩阵[A ∣b ]=(ij a )1n (n )+?表示 1) 消元过程 对k=1,2,…,n-1 ①选主元,找{}n ,,1k ,k i k +∈使得 k ,i k a = ik a n i k max ≤≤ ②如果0a k ,i k =,则矩阵A 奇异,程序结束;否则执行③。 ③如果k i k ≠,则交换第k 行与第k i 行对应元素位置, j i kj k a a ? j=k,┅,n+1 ④消元,对i=k+1, ┅,n 计算 kk ik ik a a l /= 对j=l+1, ┅,n+1计算 kj ik ij ij a l a a -= 2) 回代过程 ①若0=nn a ,则矩阵A 奇异,程序结束;否则执行②。 ②nn n n n a a x /1,+=;对i=n-1, ┅,2,1,计算 ii n i j j ij n i i a x a a x /11,??? ? ? ?- =∑+=+ 程序与实例 程序设计如下:

#include #include using namespace std; void disp(double** p,int row,int col){ for(int i=0;i>p[i][j]; } } int findMax(double** p,int start,int end){ int max=start; for(int i=start;iabs(p[max][start])) max=i; } return max; } void swapRow(double** p,int one,int other,int col){ double temp=0; for(int i=0;i

基于Matlab的牛顿迭代法解非线性方程组

基于Matlab 实现牛顿迭代法解非线性方程组 已知非线性方程组如下 2211221212 10801080x x x x x x x ?-++=??+-+=?? 给定初值0(0,0)T x =,要求求解精度达到0.00001 首先建立函数F(x),方程组编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1) f(2)]; 建立函数DF(x),用于求方程组的Jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; 编程牛顿迭代法解非线性方程组,将newton.m 保存到工作路径中: clear; clc x=[0,0]'; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break ; else end end

运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117 3 0.9999752 0.9999685 4 1.0000000 1.0000000

matlab迭代法代码

matlab 迭代法代码 1、%用不动点迭代法求方程x-e A x+4=0的正根与负根,误差限是 10A-6% disp(' 不动点迭代法 '); n0=100; p0=-5; for i=1:n0 p=exp(p0)-4; if abs(p-p0)<=10(6) if p<0 disp('|p-p0|=') disp(abs(p-p0)) disp(' 不动点迭代法求得方程的负根为 :') disp(p); break; else disp(' 不动点迭代法无法求出方程的负根 .') end else p0=p; end end

if i==n0 disp(n0) disp(' 次不动点迭代后无法求出方程的负根') end p1=1.7; for i=1:n0 pp=exp(p1)-4; if abs(pp-p1)<=10(6) if pp>0 disp('|p-p1|=') disp(abs(pp-p1)) disp(' 用不动点迭代法求得方程的正根为 ') disp(pp); else disp(' 用不动点迭代法无法求出方程的正根 '); end break; else p1=pp; end end if i==n0

disp(n0) disp(' 次不动点迭代后无法求出方程的正根 ') end 2、%用牛顿法求方程x-e A x+4=0的正根与负根,误差限是disp(' 牛顿法') n0=80; p0=1; for i=1:n0 p=p0-(p0-exp(p0)+4)/(1-exp(p0)); if abs(p-p0)<=10(6) disp('|p-p0|=') disp(abs(p-p0)) disp(' 用牛顿法求得方程的正根为 ') disp(p); break; else p0=p; end end if i==n0 disp(n0) disp(' 次牛顿迭代后无法求出方程的解 p1=-3; for i=1:n0 p=p1-(p1-exp(p1)+4)/(1-exp(p1)); 10A-6 ') end

matlab实现牛顿迭代法求解非线性方程组

已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+^2+sin(x3)+=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到————————————————————————————————首先建立函数fun 储存方程组编程如下将保存到工作路径中: function f=fun(x); %定义非线性方程组如下 %变量x1 x2 x3 %函数f1 f2 f3 syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2; f2=x1^2-81*(x2+^2+sin(x3)+; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3; f=[f1 f2 f3]; ————————————————————————————————建立函数dfun 用来求方程组的雅克比矩阵将保存到工作路径中: function df=dfun(x); %用来求解方程组的雅克比矩阵储存在dfun中 f=fun(x); df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')]; df=conj(df');————————————————————————————————编程牛顿法求解非线性方程组将保存到工作路径中:

function x=newton(x0,eps,N); con=0; %其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N; f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); x=x0-f/df; for j=1: length(x0); il(i,j)=x(j); end if norm(x-x0)

【良心出品】不动点迭代法matlab程序

实验四 姓名:木拉丁。尼则木丁班级:信计08-2 学号:20080803405 实验地点:新大机房 实验目的:通过本实验学习利用MATLAB不动点迭代法,抛物线法,斯特芬森迭代法解非线性方程组,及其编程实现,培养编程与上机调试能力。 实验要求:①上机前充分准备,复习有关内容,写出计算步骤,查对程序; ②完成实验后写出完整的实验报告,内容应该包括:所用的算法语言, 算法步骤陈述,变量说明,程序清单,输出计算结果,结果分析等等; ③用编好的程序在Matlab环境中执行。 迭代法 MATLAB程序: function pwxff(f,x0,x1,x2,d,n) f=inline(f); x(1)=x0; x(2)=x1; x(3)=x2; w1=(f(x(2))-f(x(3)))/(x(2)-x(3)); t1=(f(x(1))-f(x(3)))/(x(1)-x(3)); t2=(f(x(1))-f(x(2)))/(x(1)-x(2)); w2=1/(x(1)-x(2))*(t1-t2); w=w1+w2*(x(3)-x(2));

for k=3:n x(k+1)=x(k)-2*f(x(k))/(w+sqrt(w^2-4*f(x(k))*w2)); if abs(x(k+1)-x(k))

相关文档
相关文档 最新文档