一旦清除了所有变量,用户制作的Matlab函数就会失败

时间:2018-06-19 04:38:55

标签: matlab function differential-equations

我昨天最初问this question并自己找到答案;但是,我在Matlab中使用了clear all命令,现在该函数抛出错误Undefined function or variable 'y'。 我使用了我的答案中的代码 function [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);

在使用我的函数之前,函数才能正常工作。这只是因为Aanscondxy在使用函数之前已经由3行代码定义了吗?如果是这样,有没有办法可以使用该功能而无需先使用该3行代码?

1 个答案:

答案 0 :(得分:1)

当你执行L_Analytic3(diff(y) == ...);时,你没有定义变量y,所以MATLAB抱怨 - 它无法知道y是一个将在你调用的函数中定义的符号。您不需要所有3行代码。 syms y(x)应足以定义y,并允许您使用所需的函数调用。

现在,有两种简单的方法可以解决这个问题:

  1. 一个包含syms y(x)的脚本(或其他函数),然后按照您的方式调用L_Analytic3(现在不需要syms y(x),已经定义了的话)。
  2. 将匿名等式作为输入,改为@(x) diff(x)==x,并将L_Analytic3的行略微更改为A = dsolve(eqn(y), cond);
  3. 这两种方式都可以正常工作,不知道第二个方法是否在更复杂的情况下中断。如果你做的是象征性的东西我可能会选择第一个版本,如果你想对数字和符号函数都有相同的函数调用,我可能会选择第二个版本。