SCILAB ода: как решить ODE 2-го порядка - PullRequest
0 голосов
/ 07 мая 2019

Я прихожу из ode45 в MATLAB, пытаясь выучить оду в scilab. Я столкнулся с исключением, я не уверен, как обратиться.

function der = f(t,x)
    wn3 = 2800 * %pi/30; //rad/s
    m = 868.1/32.174; //slugs
    k = m*wn3^2; //lbf/ft
    w = 4100 * %pi/30; //rad/s
    re_me = 4.09/32.174/12; //slug-ft
    F0 = w^2*re_me; //lbf

    der(1) = x(2);
    der(2) = -k*x(1) + F0*sin(w*t);
endfunction

x0 = [0; 0];
t = 0:0.1:5;
t0 = t(1);
x = ode(x0,t0,t,f);
plot(t,x(1,:));

Я получаю сообщение об ошибке, которое не понимаю:

lsoda--  at t (=r1), mxstep (=i1) steps   
needed before reaching tout
      where i1 is :        500                                                  
      where r1 is :   0.1027287737654D+01                                       
Excessive work done on this call (perhaps wrong jacobian type).
at line    35 of executed file C:\Users\ndomenico\Documents\Scilab\high_frequency_vibrator_amplitude_3d.sce

ode: lsoda exit with state -1.

Спасибо!

1 Ответ

1 голос
/ 07 мая 2019

Ваша ода особенно жесткая (k = 2319733).Для меня нет смысла давать такой большой финал.Временной шаг, который вы сделали (0,1), также очень велик по отношению к частоте возбуждения.Если вы замените строку

t = 0:0.1:5

на

t = linspace(0,0.1,1001)

, то есть запросите аппроксимации вашего решения для t в [0,0.1] и 1000 временных шагов, у вас будет следующий вывод: enter image description here

...