如何使用具有预定义变量列表的2个方程求解多变量

时间:2017-01-23 16:31:37

标签: matlab

我得到了2个方程式,总共有8个变量,但是将定义6个。每次6个变量的列表不会保持不变。我想解决变化的未知变量。有人告诉我尝试使用fsolve。

方程是:

0=Rao*cos(theta2)+Rab*cos(theta3)+Rbc*cos(theta4)-Rco*cos(theta1);
0=Rao*cos(theta2)+Rab*cos(theta3)+Rbc*cos(theta4)-Rco*cos(theta1)];

R是变量而且所有这些都是变量。

1 个答案:

答案 0 :(得分:0)

根据Mathworks文档(https://www.mathworks.com/help/optim/ug/fsolve.html),fsolve至少需要两个参数:funx0

fun是在解决方案中评估时生成零向量的函数。

x0是解决方案的初步猜测。

换句话说,如果

x = fsolve(fun,x0)

然后

fun(x) = 0

在您的情况下,funx是什么?

从你的问题来看,我并不清楚x究竟是什么,但它应该是一个包含两个未知变量的2 x 1向量。 (为了这个答案,我假设您要解决RaoRco,并在您更新问题时进行编辑。)

fun由您列出的公式决定。它们的格式在等式的一边是0。

此外,根据您的问题,您的两个方程看起来是相同的,这意味着fsolve会找到一个解决方案,但它不会是唯一的。我最好的猜测是你打算解决

0=Rao*cos(theta2)+Rab*cos(theta3)+Rbc*cos(theta4)-Rco*cos(theta1);
0=Rao*sin(theta2)+Rab*sin(theta3)+Rbc*sin(theta4)-Rco*sin(theta1);

因此,您可以定义一个函数

function y = full_function(x)
    y = [x(1)*cos(x(6))+x(2)*cos(x(7))+x(3)*cos(x(8))-x(4)*cos(x(5));
         x(1)*sin(x(6))+x(2)*sin(x(7))+x(3)*sin(x(8))-x(4)*sin(x(5))];
end

将变量名称转换为x的组件,并使用fsolve函数

进行求解
x0 = zero(8,1); % Use a different initial guess if you know more about the problem
x_full = fsolve(@full_function,x0);

Rao = x_full(1); Rab = x_full(2);
Rbc = x_full(3); Rco = x_full(4);
theta1 = x_full(5); theta2 = x_full(6);
theta3 = x_full(7); theta4 = x_full(8);

但是等等。为什么MATLAB解决所有8个变量?我们想要指定其中的6个并解决2个问题。

在这种情况下,您可以根据full_function定义一个新函数,它只需要2个参数。

在这里,我定义了一个填充已知参数的函数,但未知参数用新函数参数表示

constrained_function = @(x) full_function([x(1); Rab; Rbc; x(2); theta1; theta2; theta3; theta4]);

现在,fsolve只会尝试查找RaoRco的值。

因此,完整代码应该看起来像

function q41811094_fsolve_fixed_params()
    % Unknown variables - Enter initial guess
    Rao = 1; Rco = 1;

    % Known variables - Enter known values
    Rab = 1; Rbc = 1;
    theta1 = 0; theta2 = 0;
    theta3 = 0; theta4 = 0;

    % Package guesses for unknown variables
    x0 = [Rao; Rco];

    % Define new function with 6 defined values
    constrained_function = @(x) full_function([x(1); Rab; Rbc; x(2); theta1; theta2; theta3; theta4]);

    % Use fsolve to find 2 remaining values
    x_constrained = fsolve(constrained_function, x0);

    % Unpackage variable values
    Rao = x_constrained(1)
    Rco = x_constrained(2)

end

% Define function for all 8 parameters
function y = full_function(x)
    y = [x(1)*cos(x(6))+x(2)*cos(x(7))+x(3)*cos(x(8))-x(4)*cos(x(5));
         x(1)*sin(x(6))+x(2)*sin(x(7))+x(3)*sin(x(8))-x(4)*sin(x(5))];
end