MATLAB 中的微分方程求解器 (ODE45)
Differential equation solver (ODE45) in MATLAB
像下面这样定义一个微分方程在MATLAB中没有问题,我可以用ODE45函数来求解
# example.m
x = pi / 2;
x_span=[0 pi/2];
ic=[0 1];
[X OUT] = ode45(@fun,x_span,ic)
#fun.m
function out=fun(x,s)
y1 = s(1)
y2 = s(2)
out=[y2;x*y1];
但是,如果我在 x
的基础上添加新函数,ODE45 将无法工作
# example.m
x = pi / 2;
A1 = sin(x);
A2 = sin(x)+1;
x_span=[0 pi/2];
ic=[0 1];
[X OUT] = ode45(@fun,x_span,ic)
#fun.m
function out=fun(A1,A2,s)
y1 = s(1)
y2 = s(2)
out=[y2;A1*y1+A2];
错误是
??? Input argument "s" is undefined.
Error in ==> fun at 2
y1 = s(1)
Error in ==> odearguments at 98
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ==> ode45 at 172
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in ==> example2 at 8
[X OUT] = ode45(@fun,x_span,ic)
您可以使用匿名函数代替函数句柄@fun
。然后你可以像这样在匿名函数中定义变量 A1
和 A2
:
[X OUT] = ode45(@(x,s)fun(A1,A2,s),x_span,ic)
请注意,传递给 ode45
的函数需要两个参数。由于您的函数 fun
中不需要 x
,因此您不需要在匿名函数中传递它。
完整的代码可以像这样定义在一个文件中:
function ode_Tb
x = pi / 2;
A1 = sin(x);
A2 = sin(x)+1;
x_span=[0 pi/2];
ic=[0 1];
[X OUT] = ode45(@(x,s)fun(A1,A2,s),x_span,ic)
function out=fun(A1,A2,s)
y1 = s(1)
y2 = s(2)
out=[y2;A1*y1+A2];
像下面这样定义一个微分方程在MATLAB中没有问题,我可以用ODE45函数来求解
# example.m
x = pi / 2;
x_span=[0 pi/2];
ic=[0 1];
[X OUT] = ode45(@fun,x_span,ic)
#fun.m
function out=fun(x,s)
y1 = s(1)
y2 = s(2)
out=[y2;x*y1];
但是,如果我在 x
的基础上添加新函数,ODE45 将无法工作
# example.m
x = pi / 2;
A1 = sin(x);
A2 = sin(x)+1;
x_span=[0 pi/2];
ic=[0 1];
[X OUT] = ode45(@fun,x_span,ic)
#fun.m
function out=fun(A1,A2,s)
y1 = s(1)
y2 = s(2)
out=[y2;A1*y1+A2];
错误是
??? Input argument "s" is undefined.
Error in ==> fun at 2
y1 = s(1)
Error in ==> odearguments at 98
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ==> ode45 at 172
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in ==> example2 at 8
[X OUT] = ode45(@fun,x_span,ic)
您可以使用匿名函数代替函数句柄@fun
。然后你可以像这样在匿名函数中定义变量 A1
和 A2
:
[X OUT] = ode45(@(x,s)fun(A1,A2,s),x_span,ic)
请注意,传递给 ode45
的函数需要两个参数。由于您的函数 fun
中不需要 x
,因此您不需要在匿名函数中传递它。
完整的代码可以像这样定义在一个文件中:
function ode_Tb
x = pi / 2;
A1 = sin(x);
A2 = sin(x)+1;
x_span=[0 pi/2];
ic=[0 1];
[X OUT] = ode45(@(x,s)fun(A1,A2,s),x_span,ic)
function out=fun(A1,A2,s)
y1 = s(1)
y2 = s(2)
out=[y2;A1*y1+A2];