2011-03-28 60 views
3

我知道如何使用ode15s或其他MATLAB ODE求解,有什麼我不知道,這是代碼(從CellML)這似乎模糊對我說:將一個奇怪的函數句柄傳遞給MATLAB ode求解器 - 這段代碼是什麼意思?

[VOI, STATES] = ode15s(@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS), tspan, INIT_STATES, options); 

更多specifilcly,是什麼意思下面(?):

@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS) 

函數的頭, 「computeRates」,如下:

function [RATES, ALGEBRAIC] = computeRates(t, STATES, CONSTANTS) 

我知道 「@computeRates」 我安斯功能的手柄,但什麼是

@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS) 

爲什麼它放(VOI,STATES)之間@和「computeRates」的含義?

順便提一下,根據MATLAB的幫助,如果我們要集成以下功能:

function dy = rigid(t,y) 
dy = zeros(3,1); % a column vector 
dy(1) = y(2) * y(3); 
dy(2) = -y(1) * y(3); 
dy(3) = -0.51 * y(1) * y(2); 

,我們只需要編寫:

options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]); 
[T,Y] = ode45(@rigid,[0 12],[0 1 1],options) 

回答

2

由於R. M. correctly points out,你在一個代碼見狀使用什麼是anonymous function。創建一個以下列方式進行:

fhandle = @(arglist) expr 

哪裏arglist是在函數表達式expr計算中使用的輸入參數列表。

你可能會感到困惑什麼是爲什麼代碼要求匿名函數來創建的,而不是隻使用一個function handle爲現有功能。諸如ode15s and ode45之類的MATLAB求解器例程將僅向傳遞給它們的函數句柄傳遞兩個輸入:標量t和列向量y。如果您有一種情況需要將更多參數傳遞給函數以定義其行爲,則必須以parameterizing functions文檔中所述的其他方式爲函數提供這些參數。

匿名函數是這樣做的一種方法。在你的例子中,你可以看到函數computeRates接受了第三個參數CONSTANTS,該函數爲函數提供了額外的參數。當匿名函數被創建時,第三個輸入被凍結在當前包含的值上。因此,匿名函數充當包裝器,它使三輸入函數的行爲類似於雙輸入函數,以便解算器例程可以使用該函數,爲包裝函數提供所需的額外輸入,解算器例程不能傳遞給它。

+2

實際上,您可以將其他參數傳遞給大多數將在t和y之後愉快地傳遞給解決方案函數的ode例程。例如'ode15s(@computeRates,tspan,INIT_STATES,options,CONSTANTS);'可以正常工作,但這種行爲是未記錄的,可能會在將來發生變化。我還應該提到,在這種情況下,同樣的參數也會被附加到事件函數參數等等,而匿名函數形式則不會這樣。 – crobar 2012-01-18 12:25:35

2

這叫做匿名函數,並讓您在不需要創建單獨的m文件的情況下即時創建簡短而漂亮的功能。 @符號後的括號之間的兩個變量是該函數的輸入。接下來是函數的定義。例如,

[email protected](x,y)x+y;%# define an anonymous function to add the two inputs 

f(2,3) 
ans = 

    5