两个For循环同时工作? bvp4c

时间:2017-04-25 09:04:22

标签: matlab for-loop ode differential-equations

我正在尝试使用bvp4c(边界条件)求解微分方程系统。我使用两个for循环来解决bvp4c的功能,但问题是首先完成循环,然后只有最后一个值与第二个for循环的迭代一起使用,有没有办法让它们同时工作?意味着第一个for循环的第一次迭代使用第二个for循环的第一个迭代值(而不是最后一个循环)?感谢

function RTrajfoll(X,Y)
    clf;
    for i = 1:length(X)-1
        init = bvpinit(linspace(X(i),X(i+1),10),[0 0]);
        sol = bvp4c(@Kpath1,@bcpath,init);
        x = linspace(X(i),X(i+1),100);
        BS = deval(sol,x);
        plot(x,BS(1,:),'linewidth',2)
        axis([-2 6 -2 6])
        hold on 
    end

    function bv = bcpath(L,R)
        for j = 1:length(Y)-1
            bv = [L(1)-Y(j) R(1)-Y(j+1)];
        end
    end

end

%Differential equations dy/dx and dtheta/dx 
function dx = Kpath1(~,c)
    L = 0.12;                        
    r = 0.1;
    WL = 0.25;WR = 0.25;
    y = c(1);th = c(2); 
    dy = tan(th);
    dth = (2*((r*WR)-(r*WL)))/(L*cos(th)*((r*WR)+(r*WL)));
    dx = [dy;dth];
    pose = [y;th];
end

2 个答案:

答案 0 :(得分:1)

观察到的行为正是预期的行为,您重复分配给bv,返回值是最后指定的值。

您需要将索引i传递给边界条件函数,作为参数

  sol = bvp4c(@Kpath1,@(L,R)bcpath(L,R,i),init);

function bv = bcpath(L,R,j)
      bv = [L(1)-Y(j) R(1)-Y(j+1)];
end

或通过在每次迭代中重新定义bcpath,使用索引作为全局变量

      for i = 1:length(X)-1
        function bv = bcpath(L,R)
          bv = [L(1)-Y(i) R(1)-Y(i+1)];
        end
        init = bvpinit(linspace(X(i),X(i+1),10),[0 0]);
        sol = bvp4c(@Kpath1,@bcpath,init);
...

答案 1 :(得分:0)

看看@ Lutz的答案,你可能不需要bv的完全成熟的功能。您可能会发现提供匿名函数句柄更方便,在这种情况下您不需要第三个参数:

sol = bvp4c(@Kpath1,@(L,R)[L(1)-Y(i) R(1)-Y(i+1)],init);