Function 未能解决一个简单的八度颂歌
我对Octave还不熟悉,所以在进入更复杂的项目之前,我会尝试一些简单的例子 我试图解决ODEFunction 未能解决一个简单的八度颂歌,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
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
具有相同的维度,则两者都必须是向量,即使它们的维度为1x
是一个标量。出于某些传统原因,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)