我知道这一定是一个愚蠢的错误,但我真的无法解决这种类型的系统:
b =
a2*cos(q1 + q2) + a1*cos(q1)
a2*sin(q1 + q2) + a1*sin(q1)
d1 + d4 + q3
>> solve(b,[q1,q2,q3,q4])
Warning: The solutions are parametrized by the symbols:
z1 = C_
> In solve at 190
ans =
a1: [1x1 sym]
d1: [1x1 sym]
d4: [1x1 sym]
q1: [1x1 sym]
q2: [1x1 sym]
q3: [1x1 sym]
q4: [1x1 sym]
基本上,我希望我的程序将 a1,d1,d4 视为参数,将 q1,q2,q3,q4 视为变量。这就是为什么我以这种形式调用 solve(b,[q1,q2,q3,q4]),但它甚至试图求解我尚未放入向量的符号值。
为您提供帮助的建议。
根据solve
的提示:
。调用 [B,A] = 求解(EQNS,B,A) 将分配给 A 的 A 的解和分配给 B 的 B 的解分配。
但是您可能想要求解,b - [e1 e2 e3]' = 0
只有 3 个变量(假设 q1 q2 q3
),您无法求解 4 个变量,即 3 个方程和 4 个变量,这没有意义。
由于我认为它与某些机械系统有关,因此您可能只想求解实际值。您可以solve (eqn, 'Real', true)
执行此操作,也可以声明实际值:syms a1 a2 ... real
。
但是,您仍然不会得到漂亮的结果,除非您在这种情况下使用 'IgnoreAnalyticConstraints'
选项:
syms q1 q2 q3 d1 d4 a1 a2 e1 e2 e3 real
b = [...
a2*cos(q1 + q2) + a1*cos(q1)
a2*sin(q1 + q2) + a1*sin(q1)
d1 + d4 + q3];
res = solve(b-[e1 e2 e3]', q1, q2, q3, 'IgnoreAnalyticConstraints', true);
输出:(简化)
>> simplify(res.q1)
ans =
2*atan((2*a1*e2 + (- a1^4 + 2*a1^2*a2^2 + 2*a1^2*e1^2 + 2*a1^2*e2^2 - a2^4 + 2*a2^2*e1^2 + 2*a2^2*e2^2 - e1^4 - 2*e1^2*e2^2 - e2^4)^(1/2))/(a1^2 + 2*a1*e1 - a2^2 + e1^2 + e2^2))
2*atan((2*a1*e2 - (- a1^4 + 2*a1^2*a2^2 + 2*a1^2*e1^2 + 2*a1^2*e2^2 - a2^4 + 2*a2^2*e1^2 + 2*a2^2*e2^2 - e1^4 - 2*e1^2*e2^2 - e2^4)^(1/2))/(a1^2 + 2*a1*e1 - a2^2 + e1^2 + e2^2))
>> res.q2
ans =
-2*atan(((- a1^2 + 2*a1*a2 - a2^2 + e1^2 + e2^2)*(a1^2 + 2*a1*a2 + a2^2 - e1^2 - e2^2))^(1/2)/(- a1^2 + 2*a1*a2 - a2^2 + e1^2 + e2^2))
2*atan(((- a1^2 + 2*a1*a2 - a2^2 + e1^2 + e2^2)*(a1^2 + 2*a1*a2 + a2^2 - e1^2 - e2^2))^(1/2)/(- a1^2 + 2*a1*a2 - a2^2 + e1^2 + e2^2))
>> res.q3
ans =
e3 - d4 - d1
e3 - d4 - d1
如前所述,您目前正在尝试求解两组方程。第一个是等于零的三个b
方程。第二个是等于零[q1,q2,q3,q4]
向量。因为您的第一个方程不是向量的函数,而只是该向量的分量的函数,所以solve
将第二个参数视为方程而不是要求解的变量。要求解所需的变量,只需按照文档列出它们:
s = solve(b,q1,q2,q3,q4)
或
[q1,q2,q3,q4] = solve(b,q1,q2,q3,q4)
现在您将获得非零解决方案。但是,您仍然会收到警告,因为您显然有三个方程,并且正在尝试求解四个未知数,并且在实数上可能有无限数量的解。事实上,这些方程中根本没有使用q4
。
正确的语法是:
b=[a2*cos(q1 + q2) + a1*cos(q1)==0;
a2*sin(q1 + q2) + a1*sin(q1)==0;
d1 + d4 + q3==0]