chunshui2003 发表于 2010-12-9 16:49

ode中是否应该选择每一次计算的最后一行值作为下一次计算初值


上面两幅图分别为采用每一次计算的最后一行值作为下一次计算初值,以及使用最开始初值得到的分岔计算结果,有很大差异。
应该采用哪一种方式是更加合理的选择呢?

gghhjj 发表于 2010-12-10 10:26

这个个人认为应该有两种可能
(1)系统本身就是对初值极为敏感的系统,不同的初值就可能导致系统解相差很大,这个你可以在多取几个初值算一下看看是否属于这种情况;
(2)可能庞加莱截面选取不一致产生的结果,你可以把计算稳定后的相图做出来比较一下看看是否属于这种情况;
(3)计算程序上存在问题;
目前个人只能想到这三种可能性

chunshui2003 发表于 2010-12-12 13:22

回复 2 # gghhjj 的帖子

学长你好,按照你的建议我又重新算了一下:
1 采用默认精度reltol=1e-3,abstol=1e-6。初值分别采用0.001、0.005、0.01和0.05。对于y0保持不变,记作“直接结果”;对于y0在每一次循环后变化,记作“间接结果”。当采用直接结果时,系统在y0=0.001、0.01和0.05时规律基本相同,只是幅值上有差异,而y0=0.005与其他三者均不同,规律类似于间接结果;当采用间接结果时,y0的取值对分岔结果没有实质影响,规律几乎相同甚至幅值也相似。
2 这次我把控制参数的变化范围扩大到原来的3倍多(虽然实际上不可能出现),然后分别绘制其直接和间接结果的分岔图以及cz=0.0040时的轨迹图和poincare映射图。

chunshui2003 发表于 2010-12-12 13:28

程序如下,和在本版块http://forum.vibunion.com/thread-98188-1-1.html中的类似,区别在于这里采用内嵌函数,麻烦学长给看一下:

function = qiujie
tic
period = 2*pi;               %%%因为对时间t采用了无量纲化,cos(oemga*t)变成了cos(T),所以周期变为2*pi/1,暂时这样
tspan = (0:period/100:1000*period);
y0 = ;

e0 = 0.6*10^-3; Lb = 100*10^-3;         %Situ_H_imp
      
cz = 0.0002:0.0001:0.0200;

options = odeset('Reltol',1e-3,'Abstol',1e-6);

row = length(cz);
column = length(80100:100:100001);

U = zeros(row,column);

for i = 1:length(cz)
    disp(cz(i))
= ode15s(@equ_elastic_without_UMP,tspan,y0,options,e0,cz(i),Lb);
y0 = y(end,:);

U(i,:) = y(80100:100:end,1)';

plot(y(80100:end,1),y(80100:end,3));
saveas(gcf,sprintf('Lb=1.00,e0=0.0006,without_UMP,cz=%6.5f_traj_Situ_H_imp.bmp',cz(i)),'bmp');             % Situ_H



plot(y(80100:100:end,1),y(80100:100:end,3),'r.','markersize',5);
saveas(gcf,sprintf('Lb=1.00,e0=0.0006,without_UMP,cz=%6.5f_poincare_Situ_H_imp.bmp',cz(i)),'bmp');             % Situ_H


end

plot(cz,U,'r.','markersize',5);
saveas(gcf,'分岔图.bmp','bmp');
toc




%%%%%%%%         运动微分方程          %%%%%%%%%

functionuu = equ_elastic_without_UMP(T,u,e0,cz,Lb)

m1 = 60;               %转子质量 kg
m2 = 25;               %轴颈质量 kg
c1 = 4000;             %转子阻尼 N.s/m
c2 = 1200;             %轴承阻尼 N.s/m
Ke = 6.2*10^6;          %转轴刚度 N/m
%   e0 = 0.6*10^-3;      %转子质量偏心 m
%   Rr = 60*10^-3;         %转子半径 m
%   Lr = 150*10^-3;      %转子长 m
delta_0 = 4.5*10^-3;   %均匀气隙大小 m
%   cz = 0.2*10^-3;      %轴颈间隙 m
Rb = 50*10^-3;         %轴承半径 m
%   Lb = 20*10^-3;      %轴承长 m
mu = 18*10^-3;         %绝对润滑油粘度 无单位


omega = 13;            %大轴旋转角速度

%   global cz


sigma = mu * omega * Rb * Lb * (Rb/cz)^2 * (Lb/2/Rb)^2;      %Sommerfeld修正系数

A1 = u(7) + 2*u(6);
A2 = u(5) - 2*u(8);

alpha = atan(A1./A2) - pi/2* sign(A1./A2) - pi/2* sign(A1);

E = sqrt(u(5).^2 +u(7).^2);                     %轴颈轴心轨迹
E_minus = sqrt(1 -E.^2);

B1 = u(7)*cos(alpha) - u(5)*sin(alpha);
B2 = u(5)*cos(alpha) + u(7)*sin(alpha);

G = 2./E_minus * ( pi/2 + atan(B1./ E_minus) );
V = (2 + B1 * G) ./E_minus.^2;
S = B2 ./ ( 1 - B2.^2 );

F_oil_same = -sqrt( A2.^2 + A1.^2 ) ./ E_minus.^2;

f_x = F_oil_same * ( 3* u(5) *V - sin(alpha) * G - 2 *cos(alpha)*S );
f_y = F_oil_same * ( 3* u(7) *V + cos(alpha) * G - 2 *sin(alpha)*S );   %油膜力的无量纲表达式

fx = sigma * f_x;
fy = sigma * f_y;            %非线性油膜力

uu = zeros(8,1);
uu(1) = u(2);
uu(2) = -c1/(m1*omega) * u(2) - Ke/(m1*omega^2) * u(1) + Ke * cz/(m1*omega^2*delta_0)*u(5) + e0 * cos(T)/delta_0 ;
uu(3) = u(4);
uu(4) = -c1/(m1*omega) * u(4) - Ke/(m1*omega^2) * u(3) + Ke * cz/(m1*omega^2*delta_0)*u(7) + e0 * sin(T)/delta_0 ;
uu(5) = u(6);
uu(6) = -c2/(m2*omega) * u(6) + Ke * delta_0/(2*m2*omega^2*cz) * u(1) - Ke/(2*m2*omega^2) * u(5) + fx/(m2*omega^2 *cz);
uu(7) = u(8);
uu(8) = -c2/(m2*omega) * u(8) + Ke * delta_0/(2*m2*omega^2*cz) * u(3) - Ke/(2*m2*omega^2) * u(7) + fy/(m2*omega^2 *cz);

octopussheng 发表于 2010-12-13 09:22

可看看龙格库塔法的计算过程,肯定要用到前一步的计算值的。

chunshui2003 发表于 2010-12-13 09:49

回复 5 # octopussheng 的帖子

谢谢学长的回答,我想了想确实应该是这样。毕竟最后的结果是稳态的。
另外,再请教一下,根据上面的最后的轨迹图和poincare图能否判断此时系统处于混沌状态。因为看着映射图像,但轨迹图又好像是拟周期运动。

octopussheng 发表于 2010-12-13 11:34

不像是混沌运动的庞加莱映射。
也不像拟周期,因为庞加莱映射不封闭

chunshui2003 发表于 2010-12-13 15:40

回复 7 # octopussheng 的帖子

学长你好,这个东西我已经弄了好久了。但正如你所说,映射图和轨迹图总也对不上,我作图的部分应该是没有问题吧
tspan = (0:period/100:1000*period);
plot(y(80100:end,1),y(80100:3))          % 轴心轨迹图
plot(y(80100:100:end,1),y(80100:100:end,3))      % poincare映射图
一个周期划分100个点,1000个周期,选取稳态后的积分点进行绘制。我现在有点糊涂了,难道是选取点出了问题吗?
请学长帮忙分析一下原因。

octopussheng 发表于 2010-12-14 16:39

plot(y(80100:end,1),y(80100:3)) 似有问题

是否应该是plot(y(80100:end,1),y(80100:end,3))

chunshui2003 发表于 2010-12-14 20:22

回复 9 # octopussheng 的帖子

这里是笔误。忘记end了,y(1)是x1,y(3)是y1。另外,学长,希望你看一下我发的另一个帖子,帮忙判断一下哪种分岔程序更为合理。
http://forum.vibunion.com/thread-98401-1-1.html

octopussheng 发表于 2010-12-15 12:55

绘图部分应是没有问题的。
页: [1]
查看完整版本: ode中是否应该选择每一次计算的最后一行值作为下一次计算初值