Передача аргументов в ode45

Я хочу передать простой аргумент в свою функцию ode45. Моя функция заключается в следующем:

function dxdt = state( t,x,vgth,vgval)
p=1;
k=10^0.7;
window1=1-((2*x)-1).^(2*p);
dxdt=k*(vgval-vgth+1.2)*window1;  
end

Основной скрипт такой:

clear all
step=0.01;
t = 0:step:10;
f=2*0.157;
vg = 5*sin(2*f*t);
x0=0.01;
vgth=1.9;
[t,x] = ode45(@(t,x) state1 (t,x,vgth,vg(t)), t, x0);
plot(t,x)

Здесь, когда я исключаю параметр vg(t) при передаче аргумента, все работает просто отлично. Но это не работает с vg(t) в аргументе.


person AK K Khan    schedule 04.11.2015    source источник
comment
Разве вы не можете передать его также как параметр анонимной функции внутри анонимной функции? ode45(@(t,x) state1(t,x,@(u) 5*sin(2*f*u), vgth) , ... )? Или просто как ode45(@(t,x) state1(t,x,vg(t), vgth) , ... ) с предопределенной функцией vg.   -  person Lutz Lehmann    schedule 04.11.2015
comment
@LutzL ... Я использовал простой способ, который вы описали. Например, я использовал следующий код в своем сценарии. [t,x] = ode45(@(t,x) state1 (t,x,vgth,vg(t)), t, x0); и моя основная функция как function dxdt = state( t,x,vgth,vg(t))..Но это дает мне ту же ошибку   -  person AK K Khan    schedule 04.11.2015
comment
Нет, параметр, который получает state, является просто числом, поэтому используйте function dxdt = state( t,x,vgth,vgval), где vgval (или любое другое имя) понимается как содержащий значение vg(t) в вызове из ode45.   -  person Lutz Lehmann    schedule 04.11.2015
comment
@LutzL ... Я сделал это сейчас function dxdt = state( t,x,vgth,vgval), и мой сценарий теперь [t,x] = ode45(@(t,x) state1 (t,x,vgth,vg(t)), t, x0); .. Вы это имеете в виду?   -  person AK K Khan    schedule 04.11.2015
comment
да. Это должно работать именно так.   -  person Lutz Lehmann    schedule 04.11.2015
comment
@LutzL.. Я отредактировал свой код в соответствии с вашими предложениями и включил этот отредактированный код в свой вопрос (вопрос отредактирован). Не могли бы вы просмотреть его сейчас, чтобы помочь мне понять.   -  person AK K Khan    schedule 04.11.2015
comment
Это не работает, потому что vg не является функцией. Измените на vg = @(t) 5*sin(2*f*t);, чтобы сделать из него функцию.   -  person Lutz Lehmann    schedule 04.11.2015
comment
@LutzL ... Большое спасибо .. это сработало.   -  person AK K Khan    schedule 04.11.2015


Ответы (1)


Сборка комментариев к ответу:

function dxdt = state( t,x,vgth,vgval)
    p=1;
    k=10^0.7;
    window1=1-((2*x)-1).^(2*p);
    dxdt=k*(vgval-vgth+1.2)*window1;  
end

function vgval = vg(t)
    f=2*0.157;
    vgval = 5*sin(2*f*t);  
end 

step=0.01;
t = 0:step:10;
x0=0.01;
vgth=1.9;
[t,x] = ode45(@(t,x) state(t,x,vgth,vg(t)), t, x0);

Надеюсь, это должно работать так, как задумано.

person Lutz Lehmann    schedule 04.11.2015
comment
Я отредактировал свой код в соответствии с вашими предложениями и включил этот отредактированный код в свой вопрос (вопрос отредактирован). Не могли бы вы просмотреть его сейчас, чтобы помочь мне понять. - person AK K Khan; 04.11.2015
comment
vg(t) должен генерироваться сразу после вектора t в основном скрипте, а затем передаваться в основную функцию в качестве аргумента. Спасибо за помощь - person AK K Khan; 04.11.2015
comment
Вы не знаете, в каких точках ode45 будет оценивать (сокращенную) функцию state соответственно. анонимная функция ОДУ. Список t в аргументе определяет только точки выборки для вывода, а не внутренние шаги. Таким образом, нет смысла применять vg к вектору/списку t. - person Lutz Lehmann; 04.11.2015