MatLab中的ode23-使用可选参数作为输入

MatLab中的ode23-使用可选参数作为输入,matlab,parameters,arguments,argument-passing,ode,Matlab,Parameters,Arguments,Argument Passing,Ode,我正在努力自学MatLab。我得到了大多数关于解决ODE的概念,但我有点不确定是否使用可选参数作为输入。我创建了以下函数: function xdot = funn(t,x,mu); if nargin < 3 | isempty(mu) mu = 1; end xdot = t +mu*x; 我不确定的是,当我使用ode23函数时,如何更改变量mu。我知道这应该可以通过输入可选参数实现,但我无法让它工作。如果我写: [t y] = ode23('funn',tspan,x0,o

我正在努力自学MatLab。我得到了大多数关于解决ODE的概念,但我有点不确定是否使用可选参数作为输入。我创建了以下函数:

function xdot = funn(t,x,mu);
if nargin < 3 | isempty(mu)
    mu = 1;
end
xdot = t +mu*x;
我不确定的是,当我使用
ode23
函数时,如何更改变量
mu
。我知道这应该可以通过输入可选参数实现,但我无法让它工作。如果我写:

[t y] = ode23('funn',tspan,x0,options)
然后一切都正确计算,我们自动得到
mu
=1

但如果我想改变这一点,我该如何继续?我尝试编写以下代码来设置
mu
=4:

[t y] = ode23('funn',tspan,x0,options,4)
但我只得到以下几点:

??? Error using ==> funn
Too many input arguments.

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

Error in ==> ode23 at 171
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

我这样做是基于我如何理解课本上写的程序,但显然我在这里做错了什么。如果有人能解释我如何更改参数
mu
,以及可选参数
p1、p2、
如何与
ode23
一起使用,我将不胜感激

我认为问题与
ode23
无关。问题似乎在于您没有在
funn
的函数定义中列出
varargin
。应该是:

function xdot = funn(t,x,mu,varargin)

通过这种方式,
funn
接受3个或更多参数,并且您不应该得到错误“太多输入参数”。

您需要做的是使用函数在函数调用中传递数据:

[t y] = ode23(@(t,y)funn(t,y,4),tspan,x0,options)

谢谢!谢谢你的回答。我知道ode23调用可以工作,但无论我为μ选择什么数字,微分方程的答案都是一样的。如果我写ode23('funn',tspan,x0,options,3)或ode23('funn',tspan,x0,options,300),我会得到完全相同的答案。什么原因会导致这种情况?函数
funn
的函数定义只允许3个参数:
t
x
mu
。在函数定义中,没有定义第四个参数应该在
funn
函数中输入的变量,所以MATLAB会给您一个错误。您可以尝试直接从MATLAB控制台调用
funn
funn(tspan,x0,options,3)
,您将得到相同的错误(当然,如果您定义了变量)。对于可选参数,您需要使用
varargin
。使用
varargin
,您可以检查
nargin
以获取参数总数,然后读取
varargin{1}
varargin{2}
等。感谢您的输入!我看到了在MATLAB控制台中直接调用'funn'是如何产生错误的,正如您所说的。然而,我必须承认我对这一点很陌生,所以我仍然不明白如何在调用'ode23'时设置'mu'参数。我的书并没有很好地解释这一点。拉斯曼的答案是正确的,我的答案是错误的。我有点累和困惑。对于可选参数,您不需要使用
varargin
,在本例中,这是一种替代方法。你的函数定义是正确的。好的。不过,我非常感谢您的意见:)。谢谢!啊,太好了!这成功了!谢谢。我之所以如此困惑,是因为我的书中说明了这样做的语法应该是:[ty]=ode23('funn',tspan,x0,options,p1,p2,…)。因此,我假设'mu'变量应该输入p1插槽中。。。书可能会误导人!是的,可能是这样。这本书是为Matlab7.8编写的,当我使用Matlab7.12时。
[t y] = ode23(@(t,y)funn(t,y,4),tspan,x0,options)