1
我正在嘗試使用SciLab的ode函數來解決和傳熱問題。事情是:其中一個參數隨時間變化,h(t)。 ODE如何將隨時間變化的參數傳遞給SciLab ode?
我的問題是:如何將參數傳遞給隨時間變化的ode函數?
我正在嘗試使用SciLab的ode函數來解決和傳熱問題。事情是:其中一個參數隨時間變化,h(t)。 ODE如何將隨時間變化的參數傳遞給SciLab ode?
我的問題是:如何將參數傳遞給隨時間變化的ode函數?
ode
允許額外函數的參數列表:
它可能發生模擬器˚F需要額外的參數。在這個 的情況下,我們可以使用以下功能。 f參數也可以是一個 list lst = list(f,u1,u2,... un)其中f是一個帶有 語法的Scilab函數:ydot = f(t,y,u1,u2,..., un)和u1,u2,...,un是額外的 自動傳遞給模擬器simuf的參數。
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
由於ode
只計算解決方案y
在t
。當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)
我讀過在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
改進我的答案。寫在我的手機上,所以這只是一個猜測。請告訴我,如果這個工程! – PTRK
不幸的是,它沒有。我在函數y = f(t,h,T)中打印了t的值......這些值完全不同於向量t中傳遞的值,好奇地是它從不出現t的值,因此'h find(t == T))'從來沒有找到一個值。不過,我可以做出錯誤的事情。我發現使它工作的唯一方法是實現Rung-Kutta,所以我更好地控制了傳遞的參數。但我真的很感謝你的幫助。非常感謝,我的朋友! – Alexandre