2015-04-04 2 views
0

У меня есть случай использования следующим образом:Как передать ode45 odefun, который принимает два аргумента?

Внутри F.m У меня есть функция, которая принимает F в качестве аргумента 2 x 1 матрицы x. F требуется матрица умножить матрицу kmat на x. kmat - это переменная, которая генерируется скриптом.

Итак, что я делал, было установлено kmat быть глобальным в сценарии:

global kmat; 
kmat = rand(2); 

В F.m:

function result = F(x) 
    global kmat; 
    result = kmat*x; 
end 

Тогда, наконец, в сценарии у меня есть (x_0 уже определен как подходящая матрица 2 x 1, и tstart и tend - целые положительные числа):

xs = ode45(F, [tstart, tend], x_0);

Однако это вызывает ошибку:

Error using F (line 3) 
Not enough input arguments. 

Error in script (line 12) 
xs = ode45(F, [tstart, tend], x_0); 

Что здесь происходит, и что я могу сделать, чтобы исправить это? В качестве альтернативы, как правильно пройти kmat до F?

ответ

1

Во-первых, правильный способ справиться с kmat, чтобы сделать его входной аргумент F.m

function result = F(x,kmat) 
    result = kmat*x; 
end 

Во-вторых, функция входа в ode45 должна быть функцией с входами t и x (возможно, векторов, t является зависимая переменная и x является зависимой). Так как ваша F функция не имеет t в качестве входного аргумента, и у вас есть дополнительный параметр kmat, вы должны сделать небольшую анонимную функцию при вызове ode45

ode45(@(t,x) F(x,kmat),[tstart tend],x_0) 

Если производная функция была function result=derivative(t,x), то вы просто сделайте ode45(@derivative,[tstart tend],x_0), как сказал Эрик.

0

Я считаю, что F в ode45(F,...) должен быть функциональным дескриптором, то есть @F. Кроме того, вы можете взглянуть на this page of the MATLAB documentation для разных методов передачи дополнительных параметров для функций.

Смежные вопросы