Пользовательская функция Matlab не работает после очистки всех переменных

Первоначально я задал этот вопрос вчера и сам нашел ответ; однако я использовал команду clear all в Matlab, и теперь функция выдает ошибку Undefined function or variable 'y'. Я использовал код из моей функции ответа [s1] = L_Analytic3(eqn,t0,h,numstep,y0)

%Differential Equation solver for specific inputs
%   eqn is the differential equation
%   t0 is start of evaluation interval
%   h is stepize
%   numstep is the number of steps
%   y0 is the initial condition

syms y(x)
cond = y(0) == y0;
A = dsolve(eqn, cond);
s1 = A;
S1 = s1;
for x = t0 : h : h*(numstep)
    subs(x);
    if x == t0    
        S1 = subs(s1,x);
    else 
      S1 = [subs(S1), subs(s1,vpa(x))];
    end
end
end

а также введите L_Analytic3(diff(y) == y,0,0.1,5,1) в командное окно после ввода clear all. Мне нужно запустить отдельный код

syms y(x)
cond = y(0) == 1;
A = dsolve(diff(y) == y, cond);

перед использованием моей функции, чтобы функция работала. Это только потому, что A,ans,cond,x и y уже определены 3-строчным кодом перед использованием функции? Если да, то есть ли способ использовать эту функцию без необходимости сначала использовать этот трехстрочный код?


person ApBrown    schedule 19.06.2018    source источник


Ответы (1)


Когда вы делаете L_Analytic3(diff(y) == ...);, у вас не определена переменная y, поэтому MATLAB жалуется - он не может знать, что y - это символ, который будет определен в вызываемой вами функции. Вам не нужны все 3 строки кода. syms y(x) должно быть достаточно, чтобы определить y и позволить вам использовать вызов функции, который вы хотели.

Теперь есть 2 простых способа исправить это, которые я вижу:

  1. Сценарий (или другая функция), который имеет syms y(x), за которым следует вызов L_Analytic3 так, как вы это делаете (который теперь не нуждается в syms y(x), он уже определен).
  2. Вместо этого дайте анонимное уравнение в качестве входных данных, скажем, @(x) diff(x)==x, и немного измените строку L_Analytic3 на A = dsolve(eqn(y), cond);.

Оба способа отлично подходят для этого, не знаю, сломается ли второй в более сложных случаях. Я бы, скорее всего, выбрал 1-ю версию, если вы делаете символические вещи, и 2-ю, если вы хотите, чтобы один и тот же вызов функции выполнялся как для числовых, так и для символических функций.

person Zizy Archer    schedule 19.06.2018
comment
Я поместил это в скрипт и определил входные переменные, и это сработало отлично. Спасибо @Zizy Archer - person ApBrown; 20.06.2018