2017-04-25 114 views
1

我想解決使用bvp4c(邊界條件)的微分方程系統。我使用兩個for循環來解決bvp4c的功能,但問題是循環先完成,然後只有最後一個值用於第二循環的迭代,是否有辦法讓它們同時工作?這意味着第一個for循環的第一次迭代使用第二個循環的第一次迭代值(而不是最後一次)。感謝兩個For循環同時工作? bvp4c

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 
+0

「X」和「Y」長度相同。即,對於i = 1:長度(X)-1'和'對於j = 1:長度(Y)-1'是否應該彼此對應? –

+0

是的,X和Y的長度都是一樣的 –

回答

0

看着@Lutz'你的答案可能不需要bv的完整功能。您可能會發現提供匿名函數句柄更方便,在這種情況下,您將不需要第三個參數:

sol = bvp4c(@Kpath1,@(L,R)[L(1)-Y(i) R(1)-Y(i+1)],init); 
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); 
... 
+0

是的,謝謝你的幫助:) :) –