2014-03-03 34 views
1

我已經使用matlabFunction定義了一個函數。這裏是代碼:ode45沒有足夠的初始條件

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.

爲什麼這樣做?這似乎很奇怪,隨着我改變初始條件向量的長度,返回的向量的長度會變化。

回答

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),輸出將始終是兩個元素。事實上,輸出將總是輸入狀態的兩倍。也許a16x16應該切換?查看matlabFunction的幫助和文檔,因爲它們提供了一個完全相同的示例。

順便說一句,沒有真正需要創建一個文件。你可以像這樣使用matlabFunction返回的匿名函數(你需要弄清哪個變量是哪個變量以及哪些變量是缺失的,以使其起作用):

DE_19 = matlabFunction([...],'vars',{...}) 
[x,y] = ode45(DE_19,[1,11],[2,7,5]);