2017-02-19 5 views
0

Предположим, мы имеем следующую функцию:Ошибка при передаче аргументов в функции ручки

function f=lorenz(t,x,a,b,c) 
    % solve differential equation like this 
    %dx/dt=a*(y-x) 
    %dy/dt=-x*z+b*x-y 
    %dz/dt=xy-c*z/3 
    f=zeros(3,1);% preallocate result 
    f(1)=a*(x(2)-x(1)); 
    f(2)=-x(1)*x(3)+b*x(1)-x(2); 
    f(3)=x(1)*x(2)-c*x(3)/3; 
    end 

Для выполнения этой программы, давайте использовать следующий тестовый файл:

% test program 
x0=[-2 -3.5 21];% initial point 
a=input(' enter first coefficient : '); 
b=input(' enter second coefficient: '); 
c=input(' enter third coefficient : '); 
[t,x]=ode45(@(x) lorenz(x,a,b,c),[0 10],x0); 
plot(t,x(:,1),'r'); 
title(' solution of x part'); 
grid on 

Я попытался передать аргументы функция ручки,

test_program 
enter first coefficient : 10 
enter second coefficient: 28 
enter third coefficient : -8 

, но это дает мне следующую ошибку:

Error using @(x)lorenz(x,a,b,c) 
Too many input arguments. 

Error in odearguments (line 87) 
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0. 

Error in ode45 (line 113) 
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ... 

Error in test_program (line 6) 
[t,x]=ode45(@(x) lorenz(x,a,b,c),[0 10],x0); 

одно решение предполагает использование глобальных переменных, например:

function f=lorenz(t,x) 
    % solve differential equation like this 
    %dx/dt=a*(y-x) 
    %dy/dt=-x*z+b*x-y 
    %dz/dt=xy-c*z/3 
    global a 
    global b 
    global c 
    f=zeros(3,1);% preallocate result 
    f(1)=a*(x(2)-x(1)); 
    f(2)=-x(1)*x(3)+b*x(1)-x(2); 
    f(3)=x(1)*x(2)-c*x(3)/3; 
    end 

но это занимает слишком много времени, чтобы работать.

Как еще я могу исправить эту проблему? Я хочу передать разные аргументы, если я напишу внутри кода примерно так:

a=input('enter the coefficient : ') 

то это будет повторяться несколько раз.

+0

, что это 'T' для в' Лоренц (Lorenz, х, а, б, в) '? если это необязательно, переместите его в конец списка входных аргументов ('lorenz (x, a, b, c, t)'). – EBH

+0

t выводится или время после вызова ode45 –

ответ

3

Не использовать глобальные переменные.

Исправление очень просто, добавьте t в качестве входных данных также:

[t,x] = ode45(@(t,x) lorenz(t,x,a,b,c),[0 10],x0); 
+0

wait i может пропустить эту часть –

+0

Спасибо за редактирование. –

+0

, но есть одна проблема, которая занимает слишком много времени. –