我正在尝试使用SciLab的ode功能来解决和传热问题。问题是:其中一个参数随时间变化,h(t)。 ODE
我的问题是:如何将参数传递给随时间变化的ode函数?
答案 0 :(得分:1)
ode
允许额外功能的参数列表:
模拟器f可能需要额外的参数。在这 例如,我们可以使用以下功能。 f参数也可以是a 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
。我的想法是在Ti < t < Tj
执行计算时查找ode
并获取Hi < h < Hj
。
这是相当丑陋但完全有效:
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)