五味瓶 发表于 2009-12-1 12:12

关于ode45解微分方程代入输入信号时遇到的问题

我在用ode45解微分方程时,方程的输入信号是实验得到的一组数据,我在文本文档中保存着,现在要把它带入到方程中,但是我不知道到底该怎么办?
我想这个信号也是随时间变化的,所以在调用ode45的时候,我用了一下语句:
=ode45(@vdp21,,y0,[],M,bv,Fq,w,T,kv,Fj);
这样,时间t 相当于有5000个时间点,我的文本文档存的输入信号也是5000个数,所以在vdp21中我将输入信号写为:signal(100*t);因为我想,这个t就是0.01:0.01:50的那么每次取100*t就刚好在每次分别代入输入信号(signal)的第1~5000个值,但是在运行时一直出现这样错误提示:
Attempted to access signal(1.00003); index must be a positive integer or logical.

Error in ==> vdp21 at 18
if signal(100*t)>0

Error in ==> ode45 at 324
    f(:,2) = feval(odeFcn,t+hA(1),y+f*hB(:,1),odeArgs{:});

Error in ==> vdp21_ceshi at 13
=ode45(@vdp21,,y0,[],M,bv,Fq,w,T,kv,Fj);
我明明把时间给了定步长的0.01:0.01:50,那么我100*t应该就是1:1:5000么,为什么会出现这样的错误?还望高手赐教!!

ChaChing 发表于 2009-12-1 13:11

signal是矩阵吗?
矩阵的index仅能是整数!

五味瓶 发表于 2009-12-1 13:41

回复 沙发 ChaChing 的帖子

是的,signal就是我微分方程的输入,那个是我做实验得到的数据,我存在文本文档里,总共5000个数,我把它读取出来了,就是5000*1的数组了,然后就是要加到微分方程里面的问题了,我就是按上面我说的做的,但就是提示有那样的问题,我想我在调用ode45的时候不是已经把时间设置成0.01:0.01:50了么,那么我在程序里面代signal的时候直接写signal(100*t),不是就是在每个时间点代进去一个值么,刚好是signal(1:5000),为什么会出现说我的index是1.00003呢?我理解的是t 不是就是0.01:0.01:50么?那么我的100*t 就应该是1:1:5000么,怎么会有1.00003这样的index?望解答,谢谢!!

ChaChing 发表于 2009-12-1 16:00

回复 板凳 五味瓶 的帖子

ode个人没用过, 不很确定
但猜测会不会是因变步长的关系!
没程序也没得试!

五味瓶 发表于 2009-12-1 16:34

回复 地板 ChaChing 的帖子

恩,我看了,应该是变步长的问题,虽然把积分的时间点限定了,但是ode45在解得时候还是自己按照精度采取变步长的方法解得,我试了很多方法就是不知道该怎么解决这个问题

ChaChing 发表于 2009-12-1 19:52

回复 5楼 五味瓶 的帖子

虽然个人没玩过, 但我想应该有定步长的方式吧!
建议搜一下, 如http://forum.vibunion.com/forum/thread-11380-1-1.html
试试ode4!

五味瓶 发表于 2009-12-1 20:36

回复 6楼 ChaChing 的帖子

恩,好的,非常感谢!!
页: [1]
查看完整版本: 关于ode45解微分方程代入输入信号时遇到的问题