我尝试在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
答案 0 :(得分:0)
语法:
[x, istate, msg] = lsode (fcn, x_0, t)
... 的第一个参数
形式fcn
是一个字符串,内联或函数句柄,它命名函数f来调用以计算方程组的右侧矢量。该函数必须具有xdot = f (x, t)
其中xdot和x是向量而t是标量。
首先,f
函数与lsode
所期望的函数形式错误,因为它需要5个参数而不是2个。
其次,在内部<{1}}函数中,变量f
,y
和w
会被覆盖,无论它们是否被提供,而n
和t
需要由用户提供。
当x
调用句柄lsode
时,它会根据其规范使用两个参数调用它,这意味着它实例化f
和t
,并调用函数其余的输入参数未定义。在剩下的参数中,y
和w
在函数内部给出了值,如上所述,但n
仍未定义。因此,当您运行依赖于x
的最终计算时,您会收到一条错误消息,说明在调用此函数期间尚未定义它。
因此,要解决此问题,请重写您的函数,使其签名为x
,您可以轻松完成此操作,因为f(x, t)
,y
和w
是无论如何都要在你的功能中定义,所以他们并不需要作为输入。