jumpwolf 发表于 2006-10-24 14:22

做分段非线性振动系统的仿真遇到一个奇怪的问题?

做一个分段非线性振动系统的仿真,用ode4求解,发现计算时间长度不一样,结果也不一样。
如附件中的两个图,参数都没有变化,计算8000个周期得到的还是混沌状态,计算9000个周期发现
在3000个周期左右就转入了周期运动。
不知道有没有人遇到过???

[ 本帖最后由 mjhzhjg 于 2007-4-8 23:04 编辑 ]

jumpwolf 发表于 2006-10-24 14:33

toes 发表于 2006-10-24 15:30

没碰到过。
不太可能吧?换个ode函数试试?

jumpwolf 发表于 2006-10-24 16:03

用ode5也发现了这个问题,而且和ode4得到的结果不一样。

jumpwolf 发表于 2006-10-24 16:11

不同的ode函数出来的结果有不用,这个还可以理解,为什么同一个函数计算时间长一点就不一样呢?

无水1324 发表于 2006-10-24 18:45

最好把程序发上来
我们可以看一下
我也是做分段的
但是还没有遇到这样的情况

jumpwolf 发表于 2006-10-26 09:44

%主程序:
clear all
global m1 m2 K1 K2 C1 C2 w Me F0 T M N Tn ms

m1=1640;
m2=3100;
ms=0.1*m2;
K1=2.08e6;
K2=5.6e7;
w1=(((m2*K1+(m1+ms)*K2+(m1+ms)*K1)-((m2*K1+(m1+ms)*K2+(m1+ms)*K1)^2-4*(m1+ms)*m2*K1*K2)^0.5)/(2*(m1+ms)*m2))^0.5;
f1=w1/(2*pi)
w2=(((m2*K1+(m1+ms)*K2+(m1+ms)*K1)+((m2*K1+(m1+ms)*K2+(m1+ms)*K1)^2-4*(m1+ms)*m2*K1*K2)^0.5)/(2*(m1+ms)*m2))^0.5;
f2=w2/(2*pi)
%静平衡位移
x2balance=(m1+m2)*9.8/K2;
x1balance=m1*9.8/K1+x2balance;

C1=1625;
C2=3.66e4;

w=2000*2*pi/60;
f=w/(2*pi);
T=1/f;
Me=2.1;
F0=Me*w^2;

N=2000;%积分时间上限
M=20;%T/M步长
Tn=1;%稳态的起始周期数
t0=;
y0=;

y=ode4('odex',,y0);

%=poincare(,y(Tn*M:N*M,:));
figure(1)
plot(,y(Tn*M:N*M,3),'k')
xlabel('t/s')
ylabel('振动轮位移/m')
set(gca,'box','off')


%odex函数
function ydot= odex(t,y)
global m1 m2 K1 K2 C1 C2 w Me F0 T M N Tn ms

Qc=-(m1+m2)*9.8;
Xc=Qc/K2;

ydot=zeros(4,1);

ydot(1)=y(2);
ydot(2)=(C1*y(4)+K1*y(3)-C1*y(2)-K1*y(1))/m1;
ydot(3)=y(4);

if y(3)<=Xc
    ydot(4)=(F0*sin(w*t)+K1*(y(1)-y(3))+C1*(y(2)-y(4))+m2*9.8)/m2;
else
    ydot(4)=(F0*sin(w*t)+K1*(y(1)-y(3))+C1*(y(2)-y(4))-(C2*y(4)+K2*y(3)))/(m2+ms);
end

toes 发表于 2006-10-26 10:44

我没有用过ODE4和5,但是好像以前matlab里面是没有这个函数的,现在有没有我不知道,但是mathworks网站上好像有。

我用matlab7.0   -   ode45运行了你的程序,没有发现你说的现象。
如图,是计算不同周期得到的时域数据:

toes 发表于 2006-10-26 10:48

估计是你调用的ode函数的原因,ode4 和 ode5 应该是定步长的,ode45是变步长算法,适应能力可能要强一些,仅仅是猜测。

jumpwolf 发表于 2006-10-27 11:28

谢谢兄弟这么费心,ode45我以前就用过,出来的结果我开始以为是一种阵发性的混沌,后来改成ode4和ode5就得到了不同的结果,ode4、ode5是在赏析版里下载的,现在我也弄不明白到底这是怎么回事情。
不过我考虑由于ode45是变步长的算法,混沌状态具有对初值的敏感性,一些微小的波动可能结果都会变化,还是用定步长算法保险一点,不知道对不对。

toes 发表于 2006-10-28 13:47

不过我考虑由于ode45是变步长的算法,混沌状态具有对初值的敏感性,一些微小的波动可能结果都会变化,还是用定步长算法保险一点,不知道对不对。

???

为什么保险一点?呵呵。
应该变步长会保险一点吧。

zcf1976 发表于 2006-11-17 21:17

原帖由 jumpwolf 于 2006-10-24 14:22 发表
做一个分段非线性振动系统的仿真,用ode4求解,发现计算时间长度不一样,结果也不一样。
如附件中的两个图,参数都没有变化,计算8000个周期得到的还是混沌状态,计算9000个周期发现
在3000个周期左右就转入了周 ...
请问楼主,该问题请问解决没有,我也遇到过这个问题,可以解释为该系统的振动周期过长,但同时说明一个真实的物理系统没有那么多参数会导致混沌.
对否,大家扔石头.

yanyongju 发表于 2006-11-18 18:45

ode45是用于显示计算的,计算结果的稳定性不好,尤其是大多数情况下不是A(a)稳定的,有时候是条件稳定的,所以最好换一个算法

xjtu211 发表于 2006-11-18 23:06

个人看法

原帖由 jumpwolf 于 2006-10-24 14:22 发表
做一个分段非线性振动系统的仿真,用ode4求解,发现计算时间长度不一样,结果也不一样。
如附件中的两个图,参数都没有变化,计算8000个周期得到的还是混沌状态,计算9000个周期发现
在3000个周期左右就转入了周 ...

因为你在计算的过程中,随着时间的增大,后一步迭代过程中用的是前一步的结果,取的周期不同,如n个周期结果是X(n),在你计算n+1个周期时要用到X(n)为初值,如此类推,n+2时用到的是X(n+1)为初值,如你所说前面是混沌的,自然X(n)和X(n+1)是有所不同的,对于非线性系统,由于对初值的敏感性,这种情况也是合理的

[ 本帖最后由 xjtu211 于 2006-11-18 23:08 编辑 ]

jumpwolf 发表于 2006-11-22 15:50

14楼你可能没有看清楚我的问题,随着计算的周期不一样,以前的结果也变化了,这好象没有办法解释.
页: [1] 2 3
查看完整版本: 做分段非线性振动系统的仿真遇到一个奇怪的问题?