2014-10-07 52 views
0

我的問題這一次是基座上的老問題,我也問過一些個月前(見HERE)如果你不想通過我的第一個問題我可以簡要概述一下這個問題。解決其中函數給出了離散(MATLAB)常微分方程的系統

以我第一個問題我有兩個向量,第一個fx含有函數值

fx = [0.5644 0.6473 0.7258 0.7999 0.8697 0.9353 0.9967 1.0540 1.1072 1.1564 ... 
     1.2016 1.2429 1.2803 1.3138 1.3435 1.3695 1.3917 1.4102 1.4250 1.4362 ... 
     1.4438 1.4477 1.4482 1.4450 1.4384 1.4283 1.4147 1.3977 1.3773 1.3535 ... 
     1.3263 1.2957 1.2618 1.2246 1.1841 1.1403 1.0932 1.0429 0.9893 0.9325 0.8725]; 

第二個x含有其中函數評價點:

x = 0:0.25:10 

此離散函數fx和我需要通過從MATLAB ODE45來解決它。但ODE45不採取離散的功能,因此該解決方案是要內插這兩個向量。然後,我可以有一個功能手柄,我可以送ODE45,像這樣:

f = @(xq)interp1(x,fx,xq); 
tspan = [0 1]; 
x0 = 2; 
xout = ode45(@(t,x)f(x),tspan,x0); 

我的問題現在

這一次,我沒有代表只有一個等式一個,我的的系統,但是,像功能被給定的離散之前。這意味着我必須:

fx1 = [....function values...] 
x1 = [...the points where the function fx1 was evaluated...] 

fx2 = [....function values...] 
x2 = [...the points where the function fx2 was evaluated...] 

fx3 = [....function values...] 
x3 = [...the points where the function fx3 was evaluated...] 

,我需要能夠解決這個頌歌的系統ODE45。但是,我不能簡單地插在每個時間公式,並將其發送到ODE45,這將是錯誤的。我需要將洞系統發送到ode45。

我曾嘗試不同的東西,但我的編程技巧只是不舒展這麼久,我可以解決這個問題,這是因爲我尋求幫助的原因!

我猜的解決方案

我相信,如果我用一個for-loop僅做一個包含系統的3點插式的功能手柄,我可以把這個函數處理對ODE45。這聽起來像是一個很好的選擇嗎?

PS:如果需要,我可以很高興地張貼載體fx1,fx2,fx3,x1,x2,x3

+0

是那些X1,X2,X3一樣嗎?或者至少包含很多類似的元素?爲什麼你不能單獨做他們?至少看起來好像你有一個插入3種不同函數的1d系統 – 2014-10-07 08:36:44

+0

Hi @ TheMinion'x1,x2,x3'可以自由選擇,這就會像你看到的那樣影響函數值的輸出'FX1,FX2,fx3'。我無法單獨解決它們的原因是因爲'fx1,fx2,fx3'表示一個(3x3)'odes'系統,其中**變量**相互依賴。 'dx1dt = X1^a * X2^b * X3^c; dx2dt = X1^g * X2^f * X3^h; dx3dt = X1^p * X2^q * X3^r;'。函數fx1,fx2,fx3是(3x3)系統方程的右邊。 – 2014-10-07 08:57:15

+0

'x1','x2','x3'的尺寸是多少?如果每個函數'f1','f2','f3'將三維向量映射到一個點,那麼每個'fi'應該是'1xN',每個'xi'應該是'3xN'。那是對的嗎? – 2014-10-07 09:04:22

回答

2

定義此函數並將其保存在function_helper.m

function result = function_helper(f1, x1, f2, x2, f3, x3, xq) 
    result = [ 
     interp1(x1, f1, xq(1)) 
     interp1(x2, f2, xq(2)) 
     interp1(x3, f3, xq(3)) 
    ]; 
end 

,然後整合這樣

(!)
f = @(t,xq) function_helper(f1, x1, f2, x2, f3, x3, xq); 
tspan = [0 1]; 
x0 = 1; 
xout = ode45(f, tspan, x0); 
+0

@CrisTaylor我不知道你是否完全誤解了我的問題,因爲我需要像你發佈的東西!我只需要在一個函數中收集我的插入函數,以便能夠將其發送到ode45。無論如何,我不能在我的編輯器中創建一個函數,當我試圖做到這一點時,我得到的錯誤:在這種情況下,函數定義是不允許的。 – 2014-10-07 09:32:48

+2

@SergioHaram您需要創建一個新文件('edit function_helper.m')並將函數定義保存在那裏。然後,您可以在命令窗口中使用'function_helper(args)'調用它。 – 2014-10-07 09:52:17

相關問題