两个 For 循环同时工作? bvp4c
Two For loops working Simultaneously ? bvp4c
我正在尝试使用 bvp4c(边界条件)求解微分方程组。我正在使用两个 for 循环来解决 bvp4c 的功能,但问题是一个 for 循环首先完成,然后只有最后一个值用于第二个 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
观察到的行为正是预期的行为,你重复赋值给bv
,return值为最后赋值。
您需要将索引 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);
...
看看@Lutz 的回答,您可能不需要 bv
的完整功能。您可能会发现提供匿名函数句柄更方便,在这种情况下您将不需要第三个参数:
sol = bvp4c(@Kpath1,@(L,R)[L(1)-Y(i) R(1)-Y(i+1)],init);
我正在尝试使用 bvp4c(边界条件)求解微分方程组。我正在使用两个 for 循环来解决 bvp4c 的功能,但问题是一个 for 循环首先完成,然后只有最后一个值用于第二个 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
观察到的行为正是预期的行为,你重复赋值给bv
,return值为最后赋值。
您需要将索引 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);
...
看看@Lutz 的回答,您可能不需要 bv
的完整功能。您可能会发现提供匿名函数句柄更方便,在这种情况下您将不需要第三个参数:
sol = bvp4c(@Kpath1,@(L,R)[L(1)-Y(i) R(1)-Y(i+1)],init);