我得到了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是变量而且所有这些都是变量。
答案 0 :(得分:0)
根据Mathworks文档(https://www.mathworks.com/help/optim/ug/fsolve.html),fsolve
至少需要两个参数:fun
和x0
。
fun
是在解决方案中评估时生成零向量的函数。
x0
是解决方案的初步猜测。
换句话说,如果
x = fsolve(fun,x0)
然后
fun(x) = 0
在您的情况下,fun
和x
是什么?
从你的问题来看,我并不清楚x
究竟是什么,但它应该是一个包含两个未知变量的2 x 1向量。 (为了这个答案,我假设您要解决Rao
和Rco
,并在您更新问题时进行编辑。)
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
只会尝试查找Rao
和Rco
的值。
因此,完整代码应该看起来像
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