更新 Octave 的 fsolve 调用的函数中的参数

Updating parameters in a function being called by Octave's fsolve

我正致力于在 Octave 中对单个驱动腿的运动进行建模。这条腿有 3 个点:一个静止的臀部(A 点),一个沿着已知路径移动的脚(B 点),以及一个我正在尝试求解其位置和角度的膝盖(C 点)。

使用下面的代码,我可以成功求解膝盖的 XYZ 位置和参数 s0Theta_H 的单个值的相关角度。

现在我希望能够遍历多个 s0Theta_H 值以及 运行 求解器。我的问题是我不知道如何将这些变量的新值传递给方程式函数。

这很棘手的原因是使用 Octave 的 fsolve 所必需的函数格式会阻止将未知数以外的输入输入到函数中。我已尝试将全局变量更新为索引器,但为此我需要清除所有会导致其他问题的工作区变量。

任何关于如何更新此函数中的参数同时仍然能够将其输入 fsolve 的想法将不胜感激!

下面的代码调用求解器:

global AC = 150; % length of the thigh limb
global CB = 150; % length of the shin limb
global lspan = 75; % width span of the foot touch down wrt the hip
global bob = 10; % height of the hip joint off the ground during a step

inits = [ .75; 2.35; 37; 0; 125]; % initial guesses at horizontal step position

% x(1): hip joint - guessing a 45 deg (.75 rad) angle for hip joint
% x(2): knee joint - guessing a 135 deg (2.35 rad) angle (wrt to vert) 
% x(3): X position of the knee joint - guessing middle of the leg span in mm
% x(4): Y position of the knee joint - know it is 0 mm at the horizontal step position
% x(5): Z position of the knee joint - guessing the height to be ~80% of the height of a limb 

[x, fval, info] = fsolve(@Rug_Bug_Leg, inits); % when running fsolve for the first time often have to remove the output suppress

下面的代码显示了包含由 Octave 的 fsolve 函数求解的方程组的函数:

function y = Rug_Bug_Leg(x)

global AC; 
global CB; 
global lspan; 
global bob; 

s0 = 0; % fore/aft (Y) position of the foot during the step. Trying to iterate this
Theta_H = 0; % hip angle during the step. Trying to iterate this

y = zeros(6,1); % zeros for left side of each equation

% First set of equations, Joint C wrt to Joint A
y(1) = -1*x(3)+AC*sin(x(1))*cos(Theta_H);
y(2) = -1*x(4)+AC*sin(x(1))*sin(Theta_H);
y(3) = -1*bob - x(5)+AC*cos(x(1));

% Second set of equations, Joint B wrt to Joint C
y(4) = x(3)-lspan +CB*sin(x(2))*cos(Theta_H);
y(5) = x(4) - s0 +sin(x(2))*sin(Theta_H);
y(6) = x(5) + bob + CB*cos(x(2));
end function

你绝对可以做到! 您需要做的就是创建一个 return 函数。

首先让您的 Rug_Bug_Leg 函数将 s0Theta_H 作为输入:

function y = Rug_Bug_Leg(x, s0, Theta_H)

% ...

endfunction

然后,您可以像这样围绕 Rug_Bug_Leg 编写一个 "wrapper" 函数:

rbl = @(s0, Theta_H) @(x) Rug_Bug_Leg(x, s0, Theta_H)

现在,如果您使用某些值 (s0,Theta_H) 调用 rbl,它将 return 一个 函数 需要 x作为输入和 returns Rug_Bug_Leg(x,s0,Theta_H)。 例如,rbl(0,0) returns 函数:

@(x) Rug_Bug_Leg(x,0,0)

这是一个示例用法:

for s0=1:10
    for Theta_H=1:10
        [x, fval, info] = fsolve( rbl(s0,Theta_H), inits );
    endfor
endfor