Function 未能解决一个简单的八度颂歌

Function 未能解决一个简单的八度颂歌,function,octave,ode,Function,Octave,Ode,我对Octave还不熟悉,所以在进入更复杂的项目之前,我会尝试一些简单的例子 我试图解决ODEdy/dx=a*x+b,但没有成功。代码如下: %Funzione retta y=a*x+b。安格尔西:维托雷瓦洛里t;系数a,b 清除所有; %阿戈梅蒂酒店 b=1; a=1; x=一(1,20); 函数y=retta(a,x,b)%Definisce funzione y=一(1,20); y=a.*x.+b; 端功能 %里塔卡尔科拉酒店 x=[-10:10]; a=2; b=2; r=retta

我对Octave还不熟悉,所以在进入更复杂的项目之前,我会尝试一些简单的例子

我试图解决ODE
dy/dx=a*x+b
,但没有成功。代码如下:

%Funzione retta y=a*x+b。安格尔西:维托雷瓦洛里t;系数a,b
清除所有;
%阿戈梅蒂酒店
b=1;
a=1;
x=一(1,20);
函数y=retta(a,x,b)%Definisce funzione
y=一(1,20);
y=a.*x.+b;
端功能
%里塔卡尔科拉酒店
x=[-10:10];
a=2;
b=2;
r=retta(a,x,b)
c=b;
p1=(a/2)*x.^2+b.*x+c%Sol。安乃近/安乃近=retta%
图(x,r,x,p1);
%Risolve方程微分dy/dx=retta%
y0=b;x0=0;
p2=lsode(@retta,y0,x)
输出为:

retta3code
r=
-18  -16  -14  -12  -10   -8   -6   -4   -2    0    2    4    6    8   10 12   14   16   18   20   22
p1=
第1列至第18列:
82    65    50    37    26    17    10     5     2     1     2     5    10    17    26    37    50    65
第19列至第21列:
82   101   122
错误:第9行第16列附近未定义“b”
错误:从以下位置调用:
错误:第9行第4列的retta
错误:lsode:评估用户提供的函数失败
错误:lsode:状态向量和派生向量的大小不一致
错误:/home/fabio/octave_file/retta3code.m,第21行第4列
因此,函数
retta
第一次正常工作,但在
lsode
中使用时失败。
为什么会这样?需要更改哪些内容才能使代码正常工作?

下面修改的代码正常工作,但我希望能够在函数外定义参数
a
b
,然后将它们作为参数传递给
rdot

x = [-10,10];
a = 1;
b = 0;
c = b;
p1 = (a/2).*(x.^2)+b.*x+c  %Sol. analitica di dy/dx = retta %
function ydot = rdot(ydot, x)
a = 1;
b = 0;
ydot = ones(1,21);
ydot = a.*x .+ b;
endfunction
y0 = p1(1); x0 = 0;
p2 = lsode("rdot", y0, x, x0)'
plot(x, p1, "-k", x, p2, ".r");

不知何故,你仍然错过了故事的一些重要部分。要求解ODE
y'=f(y,x)
需要定义一个函数

function ydot = f(y,x)
如果
ydot
y
具有相同的维度,则两者都必须是向量,即使它们的维度为1
x
是一个标量。出于某些传统原因,
lsode
(在多个解算器包中使用的FORTRAN代码)更喜欢使用较少的顺序
(y,x)
,在大多数教科书和其他解算器中,您可以找到顺序
(x,y)

然后通过调用

ylist = lsode("f", y0, xlist)
其中
xlist(1)
是初始时间

f
的内部结构独立于样本列表及其大小。这是一个单独的问题,您可以使用多重求值来计算精确解,例如

yexact = solexact(xlist)

使用,如


lsode手册中:“第一个参数FCN是一个字符串、内联或函数句柄,它命名函数f以计算方程组右侧的向量。函数的形式必须是
XDOT=f(X,T)
,其中XDOT和X是向量,T是标量。”对于“retta”是否正确函数?在我的例子中,它应该是ydot=f(y,x,a,b)。我必须测试它。在问问题之前,我确保向量的长度相同。我不熟悉八度音阶,但不是那种绿色。发生的情况是,如果参数“a”和“b”在函数之外分配了一个值,则无法计算“rdot”。计算
rdot
时不应有向量。既不在
x
,也不在
y
ydot
中。这是唯一的接口,它迫使你将标量包装在维度1的向量中。无论如何,谢谢你,关于将参数传递到
lsode
的部分正是我想要的。
function ydot = f(y,x,a,b)
    ydot = [ a*x+b ]
end

a_val = ...
b_val = ...
lsode(@(y,x) f(y,x,a_val, b_val), y0, xlist)