2015-11-04 6 views
0

Я хочу передать простой аргумент в моей функции 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).

+0

Не можете ли вы передать его также как анонимный параметр функции внутри анонимной функции? 'ode45 (@ (t, x) state1 (t, x, @ (u) 5 * sin (2 * f * u), vgth), ...)'? Или просто как 'ode45 (@ (t, x) state1 (t, x, vg (t), vgth), ...)' с предопределенной функцией 'vg'. – LutzL

+0

@LutzL ... Я использовал простой способ, который вы описали. Как я использовал следующий код в моем скрипте. '[t, x] = ode45 (@ (t, x) state1 (t, x, vgth, vg (t)), t, x0);' и моя основная функция как 'function dxdt = state (t, x, vgth, vg (t)) '.. Но это дает мне ту же ошибку –

+0

Нет, параметр' state' gets является просто числом, поэтому используйте 'function dxdt = state (t, x, vgth, vgval)' где ' vgval' (или любое другое имя) понимается как содержащее значение 'vg (t)' в вызове от 'ode45'. – LutzL

ответ

0

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

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); 

Это следует надеяться работать как задумано.

+0

Я отредактировал свой код в соответствии с вашими предложениями и включил этот отредактированный код в свой вопрос (отредактированный вопрос). Можете ли вы любезно просмотреть его сейчас, чтобы помочь мне разобраться. –

+0

'vg (t)' должен быть сгенерирован сразу после 't' в главном скрипте, а затем передан основной функции в аргументе. Спасибо за вашу любезную помощь –

+0

Вы не знаете, в каких точках 'ode45' будет оценивать (уменьшенную)' state' функцию или. анонимная функция ODE. Список 't' в аргументе определяет только точки выборки для вывода, а не внутренние шаги. Таким образом, нет смысла применять 'vg' к вектору/списку' t'. – LutzL