如何将随时间变化的参数传递给SciLab ode?

时间:2017-09-27 00:48:49

标签: ode scilab

我正在尝试使用SciLab的ode功能来解决和传热问题。问题是:其中一个参数随时间变化,h(t)。  ODE

我的问题是:如何将参数传递给随时间变化的ode函数?

1 个答案:

答案 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的参数。

额外参数是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仅在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)