24小时热门版块排行榜    

查看: 3834  |  回复: 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的回帖

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的回帖

wuhanfeng

新虫 (小有名气)

不知道你的函数具体形式,总之ode45是数值计算方法,只要在区间内的值都能算出来,积分就能积的出来
5楼2015-05-16 18:56:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

文刀星

木虫 (小有名气)

引用回帖:
5楼: Originally posted by wuhanfeng at 2015-05-16 18:56:59
不知道你的函数具体形式,总之ode45是数值计算方法,只要在区间内的值都能算出来,积分就能积的出来

搞了一天,确实是在积分过程中出现了一个Inf,但是现在知道问题了。但是还是不明白为啥改变积分区间就会有不同的结果。谢谢你啦!
6楼2015-05-16 22:10:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

allengjn

新虫 (正式写手)

引用回帖:
6楼: Originally posted by 文刀星 at 2015-05-16 22:10:22
搞了一天,确实是在积分过程中出现了一个Inf,但是现在知道问题了。但是还是不明白为啥改变积分区间就会有不同的结果。谢谢你啦!...

我也遇到这个问题了,我的程序如果积分终点时间是0.000151就能得到151步的结果,如果积分时间是大于等于0.000152,就在128步的位置出现复数,但是129步的实部与128步还是连续的,请问楼主知道为什么了么?求解惑啊!
7楼2015-07-18 11:46:55
已阅   回复此楼   关注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的回帖

binnya

新虫 (初入文坛)

引用回帖:
8楼: Originally posted by 文刀星 at 2015-07-19 13:09:04
具体问题的原因我还是不太清楚。我后来把ode45的abtol和retol设到了e-10甚至更小,然后inf就消失了。因为我的被积方程中有一个函数不稳定,所以提高精度就好点。我猜测你的应该也是在128步时出现了对负数开方的情况 ...

楼主楼主我也是这样的情况,你能具体说下怎么改的abtol和retol吗?不是很明白,拜托了!!!
9楼2016-02-18 13:06:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

文刀星

木虫 (小有名气)

引用回帖:
9楼: Originally posted by binnya at 2016-02-18 13:06:43
楼主楼主我也是这样的情况,你能具体说下怎么改的abtol和retol吗?不是很明白,拜托了!!!...

用odeset函数。具体参见help文件,大概是这样的:options=odeset('Abtol',1e-10,'Retol',1e-8);[....]=ode45(@fun,tspan,X0,options,...);

提高有时候提高精度也不一定能积出来,实在不行,个人觉得,如果精度要求不高,可以自己编写4阶龙格库塔法求解。
10楼2016-02-19 08:38:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 文刀星 的主题更新
信息提示
请填处理意见