利⽤matlab 实现复数域空间⽜顿迭代法的分形图案展⽰(newton 法)利⽤matlab 实现复数域空间⽜顿迭代法的分形图案展⽰(newton 法)
本⽂⾸发于 matlab爱好者 ,欢迎关注。
惯例声明:本⼈没有相关的⼯程应⽤经验,只是纯粹对相关算法感兴趣才写此博客。所以如果有错误,欢迎在评论区指正,不胜感激。本⽂主要关注于算法的实现,对于实际应⽤等问题本⼈没有任何经验,所以也不再涉及。
本⽂为学习⾮线性动⼒学时,搜索资料时发现的⼀个⼩例⼦,感觉很有趣,试着⾃⼰尝试⼀下。相关实现案例⾮常多,所以这篇⽂章就简单⽔⼀下了。
1 ⼀维函数的⽜顿迭代法
⽜顿迭代法是⼀种经典的求解函数根的⽅法,它是⼀种迭代⽅法。其思想为沿着当地的切线⽅向不断移动计算点,使其不断逼近真实根值。这种⽅法在导数⽐较简单,或者初始点距离根⾜够近的时候,计算结果还是⽐较稳定的。
假设初始值为xk,函数为f(x)
其下⼀步预测的根就是。然后逐次迭代,x值会越来越接近真实的根值。
下⾯以y=x^2-2为例。可以看到每次迭代,各个点逐渐向根处靠近的过程。由于该函数的特点,所有点第⼀次迭代后都跑到了根的外侧,然
后再逐渐向根靠近。
x =k +1x −k f (x )
′k f (x )
k x k +1
2 复平⾯的⽜顿迭代法
复平⾯的⽜顿迭代⽅法和普通的⼀维迭代⽅法相同,公式都⼀样,就是把原本实数x替换为复数x。其余不变。
2.1 简单⽅程结果clear clc close all x=-2.5:0.01:2.5;y=Fx(x);%绘制函数⽤xp=[-2.5:0.1:2.5];%绘制点⽤figure(1);clf hold on plot(x,y,'color','k','linewidth',1);plot(x,0*x,'color','k','linewidth',0.5);yp2=Fx(xp);scatter(xp,yp2,30,1:length(xp),'filled');%绘制点hold off xlim([min(x),max(x)])F=getframe(gcf);I=frame2im(F);[I,map]=rgb2ind(I,256);%保存动图imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.8);for k=2:6    fxp=Fx(xp);    dfxp=dFx(xp);%导数    xp2=xp-fxp./dfxp;%经过⽜顿迭代⼀次    figure(1);    clf    hold on    plot(x,y,'color','k','linewidth',1);    plot(x,0*x,'color','k','linewidth',0.5);    yp2=Fx(xp2);    scatter(xp2,yp2,30,1:length(xp),'filled');%绘制点    hold off    pause(0.1)    xp=xp2;%更新点的位置    xlim([min(x),max(x)])    %保存动图    F=getframe(gcf);    I=frame2im(F);    [I,map]=rgb2ind(I,256);    imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.8);end function y=Fx(x)y=x.^2-2;end function y=dFx(x)%导数y=2*x;end
1
2
如何用matlab将已知点连线3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52x =k +1x −k f (x )
′k f (x )
k
我们以复平⾯中简单的⼆次⽅程为例:
它的⽜顿迭代求根的迭代⽅程为:
当然,上⾯的数都是复数。
我们绘制出其在实部和虚部都在[-2,2]区间内,每⼀个点⽜顿迭代过程的轨迹,如下图:
可以看到,⽅程的根只有 x=1+0i 和 x=-1+0i 这两个。⽽且在⽐较短的迭代次数⾥,整个平⾯的点都可以快速收敛到这两个根。如果仔细观察,还可以看到左半边(实部⼩于0)的点都收敛到了x=-1这个根上,⽽右半边的点都收敛到了x=1这个根上。
对于,还没有⾮线性的特性。现在保持形式不变,当n>3时,再进⾏⽜顿迭代,就会产⽣⾮线性的收敛结果。
f (x )=x −21
x =k +1x −k 2x k x −1
k 2
f =x −21f =x −n 1
下⾯以为例,
它的⽜顿迭代求根的迭代⽅程为:
该⽅程有3个根,分别为x=1,x=-0.5+0.866i,x=-0.5-0.866i其在实部和虚部都在[-2,2]区间内,每⼀个点⽜顿迭代过程的轨迹,如下图:可以看到相⽐较k=2的结果,这些点收敛速度⽐较慢,⽽且并不是直接向这3个根靠拢。·有些点被三个根来回吸引,很久之后才能收敛。
f =x −31x =k +1x −k 3x k x −1
k 3
还是这个n=3函数的⽜顿迭代。%绘制⽜顿迭代法的详解clear;clc close all res=100;x=linspace(-2,2,res);y=linspace(-2,2,res);[xx,yy]=meshgrid(x,y);zz=xx+yy*1i;p=3;%3次多项式N=50;R=zeros(res,res,N);zk=zz;for k=1:N    R(:,:,k)=zk;    dz=(zk.^p-1)./(p*zk.^(p-1));%f(x)/f'(x)的形式    zk = zk-dz;end %指定每个点的颜⾊Color_R=interp2([-2,2;-2,2],[-2,-2;2,2],[0,0;1,1],xx,yy);Color_G=interp2([-2,2;-2,2],[-2,-2;2,2],[1,0.2;0.3,0],xx,yy);Color_B=interp2([-2,2;-2,2],[-2,-2;2,2],[0,1;0,1],xx,yy);%动画中,每个帧之间插值补充m 个帧figure(1)m=9;count=0;for k=1:9    R_k_real_1=real(R(:,:,k));    R_k_imag_1=imag(R(:,:,k));    R_k_real_2=real(R(:,:,k+1));    R_k_imag_2=imag(R(:,:,k+1));    dt=1/(m+1);    for j=0:1:m        t=dt*j;        R_k_real=R_k_real_1*(1-t)+R_k_real_2*t;        R_k_imag=R_k_imag_1*(1-t)+R_k_imag_2*t;        clf        scatter( R_k_real(:) , R_k_imag(:) ,6,[Color_R(:),Color_G(:),Color_B(:)],'filled')        xlim([-2,2])        ylim([-2,2])        box on        pause(0.1)        count=count+1;        F=getframe(gca);        I=frame2im(F);        [I,map]=rgb2ind(I,192);        if count == 1            imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.9);        else            imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.1);        end    end end
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。