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

时间:2013-12-31 15:10:17

标签: matlab symbolic-math equation-solving

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

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]),但它试图解决我没有放入向量的符号值。

Ty建议你的帮助。

3 个答案:

答案 0 :(得分:1)

根据solve的提示:

  
    

...调用[b,a] = solve(eqns,b,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

答案 1 :(得分:1)

如上所述,您目前正在尝试解决两组方程式。第一个是等于零的三个b方程。第二个是向量[q1,q2,q3,q4]等于零。因为你的第一个方程不是一个向量的函数,而只是这个向量的组成部分,solve将第二个参数视为方程而不是变量来解决。要解决所需的变量,只需按照文档列出它们:

s = solve(b,q1,q2,q3,q4)

[q1,q2,q3,q4] = solve(b,q1,q2,q3,q4)

现在您将获得非零解决方案。然而,你仍然会收到一个警告,因为你显然有三个方程式并试图解决四个未知数,并且可能存在无穷多个实数的解。实际上q4根本没有在这些方程式中使用。

答案 2 :(得分:0)

正确的语法是:

 b=[a2*cos(q1 + q2) + a1*cos(q1)==0;
    a2*sin(q1 + q2) + a1*sin(q1)==0;
    d1 + d4 + q3==0]