24小时热门版块排行榜    

查看: 3871  |  回复: 10
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

文刀星

木虫 (小有名气)

[求助] ode45积分出现NaN 已有1人参与

对一个函数积分,给定初始值,积分到某一时刻,出现了NaN的情况,最后一项是一个常数,不用管;然后以出现NaN之前的一个数据重新积分,却可以积分到最后,什么情况?

options=odeset('events',@eventRe);
x0=[0.9922,-0.1396,0,1.0157,0,0,0.1667];
[t,x,te,xe,ie]=ode45(@myGAzrfun,[0,2],x0,options)
%上面的积分积分到t=0.0324(t(17))的下一个节点0.0357时,出现NaN情况,见下面部分数据;

x1=x(17,;
[t,x,te,xe,ie]=ode45(@myGAzrfun,[t(17),2],x1,options)
%然后将t=0.0324的时刻所对应的的初值及时间重新积分,却又能够继续积分下去;

   0.9939   -0.1396         0    1.0139    0.0125         0    0.1667
    0.9948   -0.1396         0    1.0130    0.0188         0    0.1667
    0.9957   -0.1396         0    1.0121    0.0252         0    0.1667
    0.9965   -0.1395         0    1.0112    0.0315         0    0.1667
       NaN       NaN       NaN       NaN       NaN       NaN    0.1667
       NaN       NaN       NaN       NaN       NaN       NaN    0.1667
       NaN       NaN       NaN       NaN       NaN       NaN    0.1667
       NaN       NaN       NaN       NaN       NaN       NaN    0.1667
       NaN       NaN       NaN       NaN       NaN       NaN    0.1667
%上面是积分遇到问题时的部分数据;
%下面是积分到最后的部分数据,而且也是我想要的数据,说明应当是正确的,可是为啥会出现上面的情况?
   0.4418   -0.1594         0    1.0001    0.1092         0    0.1667
    0.4221   -0.1612         0    1.0001    0.1096         0    0.1667
    0.4030   -0.1631         0    1.0000    0.1100         0    0.1667
te =
    0.1213
xe =
    0.4030   -0.1631         0    1.0000    0.1100         0    0.1667
ie =
     1

ode45积分出现NaN
360截图20150516124651022.jpg
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

文刀星

木虫 (小有名气)

引用回帖:
7楼: Originally posted by allengjn at 2015-07-18 11:46:55
我也遇到这个问题了,我的程序如果积分终点时间是0.000151就能得到151步的结果,如果积分时间是大于等于0.000152,就在128步的位置出现复数,但是129步的实部与128步还是连续的,请问楼主知道为什么了么?求解惑啊 ...

具体问题的原因我还是不太清楚。我后来把ode45的abtol和retol设到了e-10甚至更小,然后inf就消失了。因为我的被积方程中有一个函数不稳定,所以提高精度就好点。我猜测你的应该也是在128步时出现了对负数开方的情况,可以试一下将精度提高。ode45是变步长积分,它会根据积分区间取步长。但问啥会出现我们遇到的问题,我还是不太明白。如果你找到了,希望你也能告诉我一声,谢谢!
8楼2015-07-19 13:09:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 11 个回答

wuhanfeng

新虫 (小有名气)

可能在函数在这个点产生奇性,或者值比较大,matlab算不出来

[ 发自小木虫客户端 ]
2楼2015-05-16 14:37:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

文刀星

木虫 (小有名气)

引用回帖:
2楼: Originally posted by wuhanfeng at 2015-05-16 14:37:27
可能在函数在这个点产生奇性,或者值比较大,matlab算不出来

先谢谢你的回复!
那为什么以上一个点代入继续积分却可以呢?而且感觉我的函数中没有产生奇异点的可能,因为只有x(4)做分母,但第四列没有出现零啊。
3楼2015-05-16 14:45:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

文刀星

木虫 (小有名气)

现在发现把该语句[t,x,te,xe,ie]=ode45(@myGAzrfun,[0,2],x0,options)
改为[t,x,te,xe,ie]=ode45(@myGAzrfun,[0,1],x0,options)就可以正常积分出来了;也就是把[0,2]改为[0,1]就可以了;后来试了几组数据,发现1.2还行,1.3就不行了。这是怎么回事啊???请各位大神指点指点!给点意见!
4楼2015-05-16 17:03:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见