如何在 Matlab 中求解符号方程组



我知道这一定是一个愚蠢的错误,但我真的无法解决这种类型的系统:

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]

最新更新