我使用matlabFunction
定义了一个函数。这是代码:
matlabFunction([a16;-((1+x16^2)/(2*x16))*a16],'vars',{x16,[a16]},'file','DE_19')
似乎有效。但是,当我尝试使用ode45
来解决由matlabFunction
定义的微分方程时,我得到一个错误。这是代码:
[x,y] = ode45(@(x16,Y) DE_19(x16,Y),[1,11],[2,7,5]);
我得到的错误是
Error using odearguments (line 93)
@(X16,Y)DE_19(X16,Y) returns a vector
of length 6, but the length of
initial conditions vector is 3. The
vector returned by
@(X16,Y)DE_19(X16,Y) and the initial
conditions vector must have the same
number of elements.
Error in ode45 (line 114)
[neq, tspan, ntspan, next, t0,
tfinal, tdir, y0, f0, odeArgs,
odeFcn, ...
所以,我尝试将初始条件从[2,7,5]
更改为[2,7,5,8,9,4]
。当我这样做时,我收到了相同的消息,但是没有说返回的向量是长度为6,而且我的初始条件向量的长度是3,它表示返回的向量长度为12,并且长度为我的初始条件向量是6。
为什么这样做?这似乎很奇怪,返回的向量长度会随着我改变初始条件向量的长度而变化。
答案 0 :(得分:2)
你看过DE_19.m
的内容了吗?您应该在致电matlabFunction
之前提供您使用的代码,但这里的可运行版本可能与您使用的类似:
syms a16 x16;
DE_19 = matlabFunction([a16;-((1+x16^2)/(2*x16))*a16],'vars',{x16,[a16]})
返回:
DE_19 =
@(x16,a16)[a16;(a16.*(x16.^2+1.0).*(-1.0./2.0))./x16]
如您所见,如果传入标量状态(第二个参数a16
,是状态而第一个,x16
是自变量 - 对于所有ODE求解器都是如此:t
然后y
),输出将始终包含两个元素。实际上输出总是输入状态的两倍。也许应该切换a16
和x16
?查看matlabFunction
的帮助和文档,因为它们提供了一个完整的示例。
顺便说一下,没有必要创建一个文件。您可以使用matlabFunction
返回的匿名函数(您需要确定哪个变量是哪个以及哪个变量仍然可以使其工作):
DE_19 = matlabFunction([...],'vars',{...})
[x,y] = ode45(DE_19,[1,11],[2,7,5]);