|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
根据论坛里相关的总结帖和分岔图程序(见octopussheng:【总结帖】分岔图绘制不同方法的总结、比较http://forum.vibunion.com/thread-60104-1-1.html),说对系统单参数分岔图的计算主要有这几种方法:最大值法(用getmax函数进行取点)、Poincare截面法(程序里都是用x=y来截取)和闪频发等,根据这几天的仿真和liliangbiao先生的说法,我也感觉这几种方法都不太精确,liliangbiao先生的说:因为选择Poincare截面有讲究,一般不选取最大值或者其他值,因为这些极大值可能导致图像的不连续性,因为Rung-kutta方法本身的缺陷,可能导致在某个区域内无解或者解的不精确性,因此一般选取的截面为一个平衡点处或者某一个特殊的截面,所以我认为你总结的程序不精确!
我觉得他写的程序大概都是根据关于Rossler的分叉改成的。现在给出Rossler的分叉程序:
%这是Rossler系统的分岔程序!
- function u =rosser(t,x)
- global c
- a=0.2; b=0.2;
- x0=[0.5,0.4,0.3]';
- u =[-x(2)-x(3), x(1)+a*x(2), b+x(3)*(x(1)-c)]';
复制代码- clear all
- global c
- zhang=[];
- M=[2.5:0.001:6.5];
- counter=1;
- for counter=1:length(M)
- c=M(counter);
- i=2;
- xmax=0;
- xmaxold=0;
- frmdata=[];
- error=0;
- tspan=[0 300];
- var=1;
- y0=[0.5;0.3;0.2];
- [t,x]=ode45(@rosser,tspan,y0);
- while i < size(x,1)
- if x(i-1,var) < x(i,var) & x(i+1,var) <= x(i,var)
- xmax=x(i,var);
- if xmaxold ~= 0
- frmdata=[frmdata ; xmax xmaxold];
- end
- xmaxold=xmax;
- end
- i=i+1;
- end
- r= length(frmdata)-20:length(frmdata);
- fradata1(1,r)=frmdata(r,1);
- zhang=[zhang;fradata1];
- end
- plot(M,zhang,'k.','markersize',1);
- xlabel(sprintf('c'));
- ylabel(sprintf('x'))
复制代码
仿真后,得出:
,效果很好。
现在问题是,我将这段程序用于Lorenz系统的话,matlab运行就出现问题,现在给出Lorenz的分叉程序:
- function u =lorenz(t,x)
- global SIGMA;
- global R;
- global BETA;
- SIGMA = 10;
- BETA = 8/3;
- x0=[0,1,0]';
- u =[SIGMA*(x(2)-x(1)), R*x(1)-x(2)-x(1)*x(3), x(1)*x(2)-BETA*x(3)]';
复制代码- clear all
- global SIGMA;
- global R;
- global BETA;
- SIGMA = 10;
- BETA = 8/3;
- zhang=[];
- M=[11:0.5:400];
- counter=1;
- for counter=1:length(M)
- R=M(counter);
- i=2;
- xmax=0;
- xmaxold=0;
- frmdata=[];
- error=0;
- tspan=[0:0.5:200];
- var=1;
- y0=[0;1;0];
- [t,x]=ode45(@lorenz,tspan,y0);
- while i < size(x,1)
- if x(i-1,var) < x(i,var) & x(i+1,var) <= x(i,var)
- xmax=x(i,var);
- if xmaxold ~= 0
- frmdata=[frmdata ; xmax xmaxold];
- end
- xmaxold=xmax;
- end
- i=i+1;
- end
- r= length(frmdata)-20:length(frmdata);
- fradata1(1,r)=frmdata(r,1);
- zhang=[zhang:fradata1];
- end
- plot(M,zhang,'k.','markersize',1);
- xlabel(sprintf('R'));
- ylabel(sprintf('x'))
复制代码
运行后,matlab出现错误,??? Subscript indices must either be real positive integers or logicals.
Error in ==> lorenz_ext_fct at 33
fradata1(1,r)=frmdata(r,1);
看上面程序标有红色的代码,r= length(frmdata)-20:length(frmdata);是将frmdata最后的21个数赋值给r,fradata1(1,r)=frmdata(r,1);这是数组之间赋值。不知道我这样理解可准确。由于出现错误,我修改了20,改为r= length(frmdata)-8:length(frmdata);
运行后出现错误。??? Error using ==> plot
Vectors must be the same lengths.
总之,这段程序耗费我一天时间还没有头绪,不知道谁matlab厉害,能否指点迷津,当然,如果liliangbiao先生在的话,希望能给予指导,谢谢!!欢迎大家讨论。
|
评分
-
2
查看全部评分
-
|