Изменение значения переменной на каждом временном шаге - функция Matlab ODE - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующая система дифференциальных уравнений для моделирования в файле .m:

function dx = odefun(t,x)
    % display(x(1));
    % y = 5; 
    dx = [x(2); - y - 3*x(2) - 2*x(1)];
end

Я моделирую систему, использующую другой файл .m с кодом ниже:

[t,x] = ode45(@odefun, [0 10], [0;0]);
% display(x(:,1));
plot(t,x(:,1));

Моя проблема в том, что я хочу, чтобы значение параметра y, которое является выходным сигналом моей системы, менялось на каждом временном шаге во время выполнения функции ode(...). Я попытался отправить другой аргумент, как это:

[t,x] = ode45(@odefun, [0 10], [0;0], [some_elements]);
function dx = odefun(t,x,y)

но я получаю ошибку: Not enough input arguments. Правда в том, что я хочу, чтобы параметр y принимал одно значение за каждый шаг по времени от вектора с сотней элементов. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Для тех, кто заинтересован, я пишу здесь так, как мне наконец удалось получить то, что я хочу.У меня есть вектор 1x100, представляющий вход для системы, и я хочу забрать вектор 1x100, состоящий из значений выходных данных моей системы.Я хотел одно значение в качестве вывода для каждого значения моего ввода.

global f    
t = 0.1:0.1:10.0;
f = @create_signal;

[t,x] = ode45(@odefun, t, [0;0]);

и функция odefun выглядит следующим образом:

function dx = odefun(t,x)
    global f
    m = 15;
    b = 0.2;
    k = 2;
    u = f(t);

    dx = [x(2); u/m - (b/m)*x(2) - (k/m)*x(1)];

end

и, наконец, функция, которая создает значения ввода:

function u = create_signal(t)

    u = 5*sin(t) + 10.5;

end

Iприменил функцию дескриптора создания функции MATLAB.Вот ссылка справки по математике: https://www.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html

0 голосов
/ 11 ноября 2018

Не тестируется на Matlab, но только для того, чтобы помочь, и в основном упаковано из https://fr.mathworks.com/help/matlab/ref/ode45.html#bu00_4l_sep_shared-options ODE с условиями, зависящими от времени

function dx = odefun(t,x,y,yt)
    f = interp1(yt,y,t);
    dx = [x(2); - f - 3*x(2) - 2*x(1)];
end

%define your array (or even function) y(yt)
yt = 0.0:0.1:10.0;
y = array; % array being your array of input values. (should contain the corresponding value for 0.0:0.1:10.0

[t,x] = ode45(@(t,x) odefun(t,x,y,yt), [0.0 10.0], [0;0]);

или попробуйте следующее, если хотите, чтобы в ваш результат были включены конкретные временные шаги:

[t,x] = ode45(@(t,x) odefun(t,x,y,yt), yt, [0;0]);

Вы также можете сделать, чтобы убедиться, что ваше решение соответствует 0,0: 0,1: 10,0,

x100 = interp1(t,x,yt);
...