微分方程;功能在Octave

时间:2017-07-04 19:41:23

标签: octave differential-equations

我尝试在Octave中求解微分方程。在第一次尝试中,我的所有自变量都设置为常量(n,y,w)。这是我的代码:

function xdot= f(x,t);

  % xdot=zeros(1,1);

  X=1.44221E+12;
  IO=5.318E+11;
  GO=6.81E+11;
  beta=0;
  gamma=0;
  y=58.5021088;
  w= 31.29;
  n=1363.5;
  tw=0.4;
  tp=0.3;
  sw=0.07;
  sp=0.25;
  mw=0.593941689;
  mp=0.593941689;

  % aw=(1-tw)(sw+mw)
  % ap=(1-tp)(sp+mp) 

  xdot=-(X+IO*(1+gamma*(diff(n)/n+diff(y)/y))+GO*beta(tw(diff(n)/n+diff(w)/w)+tp(diff(y)/y-diff(w)/w)-(x*n)/((y-w)((1-tp)(sp+mp)+tp)+((1-tw)(sw+mw)+tw)*w))*x)/(IO*gamma+GO*beta*tw);


 endfunction

当我添加

 t = [0:(1/360):10]

 x = lsode ("f", 39290000, t);

在命令行中解决方程,我得到这个错误:

error: index (0.843942): subscripts must be either integers 1 to (2^31)-1 or logicals
error: lsode: evaluation of user-supplied function failed
error: called from
f at line 23 column 7

在我看来,在某种程度上我误解了如何制作这个功能。 有什么帮助吗?

编辑:

这是我的新代码:

function xdot= f(x,t);

 X=1.44221E+12;
 IO=5.318E+11;
 GO=6.81E+11;
 beta=0;
 gamma=0;
 y=58.5021088;
 w= 31.29;
 n=1363.5;
 tw=0.4;
 tp=0.3;
 sw=0.07;
 sp=0.25;
 mw=0.593941689;
 mp=0.593941689;

 xdot=-X+IO-(x*n)/((y-w)*((1-tp)*(sp+mp)+tp)+w*(tw+(1-tp)*(sp+mp)))

endfunction

如果我将它复制到命令行,但是如果我将它作为programm(f.m)启动并解决它,那么我会收到此错误:

error: 'x' undefined near line 25 column 15
error: called from
f at line 25 column 7

1 个答案:

答案 0 :(得分:0)

来自documentation of lsode

  

语法:[x, istate, msg] = lsode (fcn, x_0, t)
   ...

     

第一个参数fcn是一个字符串,内联或函数句柄,它命名函数f来调用以计算方程组的右侧矢量。该函数必须具有

形式
xdot = f (x, t)
     

其中xdot和x是向量而t是标量。

首先,f函数与lsode所期望的函数形式错误,因为它需要5个参数而不是2个。

其次,内部<{1}}函数中,变量fyw会被覆盖,无论它们是否被提供,而nt需要由用户提供。

x调用句柄lsode时,它会根据其规范使用两个参数调用它,这意味着它实例化ft,并调用函数其余的输入参数未定义。在剩下的参数中,yw在函数内部给出了值,如上所述,但n仍未定义。因此,当您运行依赖于x的最终计算时,您会收到一条错误消息,说明在调用此函数期间尚未定义它。

因此,要解决此问题,请重写您的函数,使其签名为x,您可以轻松完成此操作,因为f(x, t)yw是无论如何都要在你的功能中定义,所以他们并不需要作为输入。