如何使用ode45进行迭代?

时间:2015-03-06 03:46:51

标签: matlab

我正在尝试编写一些matlab代码。为什么我的新变量w不会被接受,以便我的函数可以采用另一个参数?我想迭代现在为7.8的变量并改为使用迭代。

 function dZ=sys(x,Z,w)
    c=@(z)4800 - 20.2090 + (17.3368)*z/1000+ (272.9057)*exp(-z*0.7528/1000); % c(z)
    c=c(2000);
    deg=w;

% Z(1):=z
% Z(2):=u
    dZ=zeros(2,1);    % a column vector
    dZ(1)=Z(2);
    dZ(2)=-(c/cosd(7.8))^2*(((-272.9057*0.7528/1000)*exp(-Z(1)*0.7528/1000)) + 17.3368/1000)/...
        (4800 - 20.2090 + (17.3368)*Z(1)/1000+ (272.9057)*exp(-Z(1)*0.7528/1000))^3;
    end

我尝试在之前使用的函数中使用新变量时收到错误消息。

Error using sys (line 4)
Not enough input arguments.

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

Error in ode45 (line 114)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in underwater (line 2)
[X,Z]=ode45(@sys,x,[2000 tand(7.8)], 7.8);

2 个答案:

答案 0 :(得分:3)

我会按如下方式编写函数(尽管w似乎没有使用):

function dZ=sys(t,Z,w)
    z = 2000;
    c = 4800 - 20.2090 + (17.3368)*z/1000+ (272.9057)*exp(-z*0.7528/1000);
    deg=w; % not used?

    dZ=zeros(2,1);    % a column vector
    dZ(1)=Z(2);
    dZ(2)=-(c/cosd(7.8))^2*(((-272.9057*0.7528/1000)*exp(-Z(1)*0.7528/1000)) + 17.3368/1000)/...
        (4800 - 20.2090 + (17.3368)*Z(1)/1000+ (272.9057)*exp(-Z(1)*0.7528/1000))^3;
end

然后按如下方式调用ode解算器:

[T,Z_sol] = ode45(@(t,Z) sys(t,Z,w),x,[2000 tand(7.8)]);

其中wx在您的基础或来电工作空间中定义。

答案 1 :(得分:0)

ODE求解器期望两个变量的函数。它正在寻找以下形式的功能:

y' = f(t, y)

因此,如果您将@sys传递给ode45,它必须只是两个变量的函数。

在下面的评论中,您可以参考另一个问题。他们使用以下电话:

[t,N] = ode45(@(t,y) rateEquations(t,y,F), timeSpan, initialConditions)

使用@(t,y)生成一个泛型函数,它是两个变量的函数。在此示例中,使用固定的F值调用函数rateEquations。所以ODE实际上是期望两个变量的函数。如果您具有两个以上变量的函数,则可以通过复制您引用的示例中使用的技术将其重新设置为两个变量的函数。希望这有帮助!