【问题标题】:Differential equation; function in Octave微分方程;八度函数
【发布时间】:2017-07-06 05:46:53
【问题描述】:

我尝试在 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

如果我将它复制到命令行中,它确实有效,但如果我将它作为程序 (f.m) 启动并解决它,那么我会收到此错误:

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

【问题讨论】:

    标签: octave differential-equations


    【解决方案1】:

    来自documentation of lsode

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

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

    xdot = f (x, t)
    

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

    首先,您的f 函数与lsode 预期的格式不符,因为它需要5 个参数而不是2 个。

    其次,你的f函数中,变量ywn被覆盖,不管它们是否被提供,而t和@987654333 @ 需要用户提供。

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

    因此,要解决此问题,请重写您的函数,使其签名为f(x, t),因为ywn 无论如何都在您的函数中定义,所以您可以轻松地做到这一点,所以它们不需要作为输入给出。

    【讨论】:

    • 非常感谢。我知道我在问一个愚蠢的问题,但我仍然很困惑。显然,以正确的形式 xdot = f (x, t) 没什么大不了的。也许我应该反过来问:
    • 我有一个函数 x(t)= a*(x´/x)+b*(x´/x)。我显然可以将其表述为 x(t)= 或 x´(t)=.,所以这里不存在问题。此外,我还有这些独立的函数 n、y 和 w。我如何将它放入 Octave?因为如果我在这里写 xdot = f (x, t) x 是一个向量,而我的变量只是一个标量!?是的,我知道:愚蠢的问题,但我不明白这一点......
    • 好吧,据我所知,lsode 专门用于求解 dx/dt = f(x,t) 类型的方程,因此您必须重新排列 w.r.t. dx/dt 如果你想使用它,首先。至于 n、y 和 w 是 函数,您可以将它们定义为匿名函数的句柄,例如n = @(z) z+5 返回一个句柄,您可以将其作为 n(x) 运行。如果您以前没有遇到过,请阅读 function handles and anonymous functions 的更多信息。
    • 好的,谢谢。但我已经以 dx/dt= 的形式拥有它。将函数更改为 xdot = f (x, t) 后仍然出现相同的错误。
    • 不,抱歉,这确实是另一个错误,但据我所知,它无法识别 xdot。我编辑了新的描述。
    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多