2017-09-27 94 views

回答

1

ode允許額外函數的參數列表:

它可能發生模擬器˚F需要額外的參數。在這個 的情況下,我們可以使用以下功能。 f參數也可以是一個 list lst = list(f,u1,u2,... un)其中f是一個帶有 語法的Scilab函數:ydot = f(t,y,u1,u2,..., un)和u1,u2,...,un是額外的 自動傳遞給模擬器simuf的參數。

額外的參數是t的函數

function y = f(t,y,h) 
// define y here depending on t and h(t),eg y = t + h(t) 
endfunction 

function y = h(t) 
// define here h(t), eg y = t 
endfunction 

// define y0,t0 and t 
y = ode(y0, t0, t, list(f,h)) // this will pass the h function as a parameter 

Extra是我們要提取的對應項的向量。

由於ode只計算解決方案yt。當ode執行計算並獲得Hi < h < Hj時,想法是尋找Ti < t < Tj

這是相當難看,但完全的工作原理:

function y = h(t,T,H) 
    res = abs(t - T)   // looking for nearest value of t in T 
    minres = min(res)   // getting the smallest distance 
    lower = find(res==minres) // getting the index : T(lower) 
    res(res==minres)=%inf  // looking for 2nd nearest value of t in T: nearest is set to inf 
    minres = min(res)   // getting the smallest distance 
    upper = find(minres==res) // getting the index: T(upper) 
    // Now t is between T(lower) (nearest) and T(upper) (farest) (! T(lower) may be > T(upper)) 
    y = ((T(upper)-t)*H(lower)+(t-T(lower))*H(upper))/(T(upper)-T(lower)) // computing h such as the barycenter with same distance to H(lower) and H(upper) 
endfunction 

function ydot=f(t, y,h,T,H) 
    hi = h(t,T,H)  // if Ti< t < Tj; Hi<h(t,T,H)<Hj 
    disp([t,hi])  // with H = T, hi = t 
    ydot=y^2-y*sin(t)+cos(t) - hi // example of were to use hi 
endfunction 

// use base example of `ode` 
y0=0; 
t0=0; 
t=0:0.1:%pi; 
H = t // simple example 
y = ode(y0,t0,t,list(f,h,t,H)); 
plot(t,y) 
+0

我讀過在SciLab的幫助並不能設法使其工作,但你的例子很容易!這解決了我的問題的50%,因爲現在我可以使用它解決直接問題,但我仍然需要解決相反的問題,爲此我可能需要另一個功能,我不知道SciLab是否有這個功能。有沒有辦法在每次SciLab自動選擇一個接一個之後傳遞一個參數作爲向量?例如: 't = [1 2 3]; h = [7 8 9]; sol = ode(yo,to,t,list(f,h))'因此,在這種情況下,t = 1時使用h = 7,t = 2時使用h = 8等等。 – Alexandre

+0

改進我的答案。寫在我的手機上,所以這只是一個猜測。請告訴我,如果這個工程! – PTRK

+0

不幸的是,它沒有。我在函數y = f(t,h,T)中打印了t的值......這些值完全不同於向量t中傳遞的值,好奇地是它從不出現t的值,因此'h find(t == T))'從來沒有找到一個值。不過,我可以做出錯誤的事情。我發現使它工作的唯一方法是實現Rung-Kutta,所以我更好地控制了傳遞的參數。但我真的很感謝你的幫助。非常感謝,我的朋友! – Alexandre