首页 > 解决方案 > 如何在 Scilab 的 ode-solver 中包含时间相关变量?

问题描述

我目前正在解决一个非线性 ODE 系统。这是一组运动学运动方程,我需要计算给定角速度的位置角

我发现了如何使用列表添加依赖于时间的函数,但问题是,如何添加一个也依赖于时间但作为向量给出的参数。

简化是用以下代码编写的。c(t) 是时间函数。

function dx = f(t, x, c)

dx(1) = x(1)*sin(x(2))
dx(2) = c*x(2)*cos(x(1))
dx(3) = t*cos(x(3))
endfunction

c = 1:32; // values from measured signal, here simplyfied

y0 = [0.1;0.1;0.1];

t0 = 0;

t = 0:0.1:%pi;

y = ode(y0, t0, t, list (f, c));

标签: parametersodescilab

解决方案


关于如何将函数表转换为插值函数。


使用interpln线性插值

dx=f(t,x,tc_arr)本质上,在您评估的右侧函数中

function dx=f(t,x,tc_arr)
  c = interpln(tc_arr, t)
  dx(1) = x(1)*sin(x(2))
  dx(2) = c*x(2)*cos(x(1))
  dx(3) = t*cos(x(3))
endfunction

其中tcarr包含采样时间和采样值的数组。


用于测试的示例信号

作为示例信号,取

t_sam = -1:0.5:4;
c_sam = sin(2*t_sam+1);

tc_arr = [ t_sam; c_sam ];

请注意,您总是需要采样时间来了解输入时间t与值数组的关系。

t = 1.23;
c = interpln(tc_arr, t)

返回c = - 0.2719243


使用interp1一维插值(带样条)

您也可以使用其他功能,它在插值方法方面有更多选择。

function dx=f(t,x,t_sam,c_sam)
  c = interp1(t_sam, c_sam, t, "spline", "extrap")
  dx(1) = x(1)*sin(x(2))
  dx(2) = c*x(2)*cos(x(1))
  dx(3) = t*cos(x(3))
endfunction

推荐阅读