MATLAB 如何使用 inputdlg 函数来处理符号函数输入?
How can MATLAB use the inputdlg function to process a symbolic function input?
我正在使用 MATLAB R2016b - 学生版 开发一个 m 文件,该文件将符号微分方程 f(t,y) 作为输入,并输出斜率基于初始条件的场和解曲线。密码是
prompt={'dy/dt =','tspan','y0 ='};
title='Slope Field Calculator';
answer=inputdlg(prompt,title);
tspan = str2num(answer{2}); %#ok<*ST2NM>
y0 = str2double(answer{3});
syms t y
f = symfun(sym(answer{1}),[t,y]);
[t,y] = ode45(f, tspan, y0);
hold on
dirfield(f,-5:.3:5,-5,.3:5)
plot(t,y,'b','LineWidth',2)
dirfield(f,-5:.3:5,-5:.3:5)
函数输入f
作为@函数,或内联函数,或带引号的m文件名。然后,dirfield
函数使用从 t1 到 t2 的 t 值(间距为 dt)和使用从 y1 到 y2 的 y 值,为形式为 y' = f(t,y) 的一阶 ODE 绘制方向场间距为 dy。
根据MATLAB帮助,ode45
函数求解微分方程。
[TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0)
with TSPAN = [T0 TFINAL]
然后对初始条件 Y0
从时间 T0
到 TFINAL
的微分方程 y' = f(t,y) 求积分。输入 ODEFUN
是函数句柄。对于标量 T 和向量 Y,ODEFUN(T,Y)
必须 return 对应于 f(t,y) 的列向量。
当我 运行 代码时,对话框 运行 很好地接受了我的输入。但是当我点击 "OK" 时,代码会抛出这个错误:
Warning: Support of character vectors that are not valid variable names or
define a number will be removed in a
future release. To create symbolic expressions, first create symbolic
variables and then use operations on them.
> In sym>convertExpression (line 1559)
In sym>convertChar (line 1464)
In sym>tomupad (line 1216)
In sym (line 179)
In SlopeFieldsSolutionCurves (line 9)
Undefined function 'exist' for input arguments of type 'symfun'.
Error in odearguments (line 59)
if (exist(ode)==2)
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options,
varargin);
Error in SlopeFieldsSolutionCurves (line 10)
[t,y] = ode45(f, tspan, y0);
我哪里错了?
ode45
采用函数句柄,而不是符号函数。使用 matlabFunction 代替:
[t,y] = ode45(matlabFunction(f), tspan, y0);
要消除第一个警告,您需要稍微不同地定义 f
:
f = evalin( symengine, answer{1} );
f = symfun( f, [t,y] );
我正在使用 MATLAB R2016b - 学生版 开发一个 m 文件,该文件将符号微分方程 f(t,y) 作为输入,并输出斜率基于初始条件的场和解曲线。密码是
prompt={'dy/dt =','tspan','y0 ='};
title='Slope Field Calculator';
answer=inputdlg(prompt,title);
tspan = str2num(answer{2}); %#ok<*ST2NM>
y0 = str2double(answer{3});
syms t y
f = symfun(sym(answer{1}),[t,y]);
[t,y] = ode45(f, tspan, y0);
hold on
dirfield(f,-5:.3:5,-5,.3:5)
plot(t,y,'b','LineWidth',2)
dirfield(f,-5:.3:5,-5:.3:5)
函数输入f
作为@函数,或内联函数,或带引号的m文件名。然后,dirfield
函数使用从 t1 到 t2 的 t 值(间距为 dt)和使用从 y1 到 y2 的 y 值,为形式为 y' = f(t,y) 的一阶 ODE 绘制方向场间距为 dy。
根据MATLAB帮助,ode45
函数求解微分方程。
[TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0)
with TSPAN = [T0 TFINAL]
然后对初始条件 Y0
从时间 T0
到 TFINAL
的微分方程 y' = f(t,y) 求积分。输入 ODEFUN
是函数句柄。对于标量 T 和向量 Y,ODEFUN(T,Y)
必须 return 对应于 f(t,y) 的列向量。
当我 运行 代码时,对话框 运行 很好地接受了我的输入。但是当我点击 "OK" 时,代码会抛出这个错误:
Warning: Support of character vectors that are not valid variable names or
define a number will be removed in a
future release. To create symbolic expressions, first create symbolic
variables and then use operations on them.
> In sym>convertExpression (line 1559)
In sym>convertChar (line 1464)
In sym>tomupad (line 1216)
In sym (line 179)
In SlopeFieldsSolutionCurves (line 9)
Undefined function 'exist' for input arguments of type 'symfun'.
Error in odearguments (line 59)
if (exist(ode)==2)
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options,
varargin);
Error in SlopeFieldsSolutionCurves (line 10)
[t,y] = ode45(f, tspan, y0);
我哪里错了?
ode45
采用函数句柄,而不是符号函数。使用 matlabFunction 代替:
[t,y] = ode45(matlabFunction(f), tspan, y0);
要消除第一个警告,您需要稍微不同地定义 f
:
f = evalin( symengine, answer{1} );
f = symfun( f, [t,y] );