【问题标题】:How can I iterate using ode45?如何使用 ode45 进行迭代?
【发布时间】:2015-03-06 03:46:50
【问题描述】:

我正在尝试编写一些 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);

【问题讨论】:

    标签: matlab


    【解决方案1】:

    我会写如下函数(虽然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 在您的基础或调用者工作区中定义。

    【讨论】:

      【解决方案2】:

      ODE 求解器需要两个变量的函数。它正在寻找以下形式的函数:

      y' = f(t, y)
      

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

      在下面的 cmets 中,您引用了另一个问题。他们使用以下调用:

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

      使用@(t,y) 创建一个泛型函数,它是两个变量的函数。在本例中,函数 rateEquations 使用固定的 F 值调用。所以 ODE 实际上期待两个变量的函数。如果您有一个多于两个变量的函数,您可以通过复制您引用的示例中使用的技术将其重新转换为两个变量的函数。希望这会有所帮助!

      【讨论】:

      • 感谢您的回答。但是,如果它不能采用另一个变量,我该如何在函数中使用迭代呢?我想迭代现在为 7.8 的 beta 变量。
      • 答案不正确,您可以将附加参数传递给ode 函数,例如参见stackoverflow.com/questions/7680224/…
      • @am304,我更新了我的答案,并解释了您所引用的问题。它传递两个变量的函数,使用一种技术将 3 个变量的原始函数重铸为 2 个变量的通用函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多