如何在matlab中解决冗余符号系统?

时间:2014-01-04 18:48:35

标签: matlab symbolic-math equation-solving equations

    n0 =

 nx*cos(a) + nz*cos(b)*sin(a) + ny*sin(a)*sin(b)
                           ny*cos(b) - nz*sin(b)
 nz*cos(a)*cos(b) - nx*sin(a) + ny*cos(a)*sin(b)

在a和b中,ns固定(但当然,未分配)值。 如果我做

[a,b]=solve(n0-[1 0 0]',a,b,'IgnoreAnalyticConstraints',true)

我得到了

    Error using solve>assignOutputs (line 257)
3 variables does not match 2 outputs.

    Error in solve (line 193)
varargout = assignOutputs(nargout,sol,sym(vars));

然后我想知道''3个变量''? 然后我试试

>> [a,b,c]=solve(n0-[1 0 0]',a,b,'IgnoreAnalyticConstraints',true)

这是回应

a =

cos(a)/(cos(a)^2 + sin(a)^2)


b =

(sin(a)*sin(b))/((cos(a)^2 + sin(a)^2)*(cos(b)^2 + sin(b)^2))


c =

(cos(b)*sin(a))/((cos(a)^2 + sin(a)^2)*(cos(b)^2 + sin(b)^2))

它在做什么?什么在c?我想他正在解决关于nx ny nz的问题,但为什么呢?每次我尝试用n个变量解决n + k方程的问题时,我都会得到奇怪的错误,即使系统的等级只是n。

这意味着即使a = 2 b = 3 a + b = 5也会给我带来麻烦。 我该如何解决?

1 个答案:

答案 0 :(得分:0)

我也无法复制“解决错误”错误。您使用的是什么版本的Matlab?另外,我认为缺少一些错误消息 - 总是列出整个错误消息。在任何情况下,R2013a,solve都找不到任何解决方案。 Mathematica 9's Solve也找不到任何内容。

我怀疑为什么@DanielR和我无法在第二种情况下完全减少你的问题是你上面的一行中可能有错误 - 应该是:

[a,b,c] = solve(n0-[1 0 0]','IgnoreAnalyticConstraints',true)

产生

a =

cos(a)/(cos(a)^2 + sin(a)^2)


b =

(sin(a)*sin(b))/((cos(a)^2 + sin(a)^2)*(cos(b)^2 + sin(b)^2))


c =

(cos(b)*sin(a))/((cos(a)^2 + sin(a)^2)*(cos(b)^2 + sin(b)^2))

有哪些输出abc(这些简化为cos(a)sin(a)*sin(b)sin(a)*cos(b),办法)?一个很大的提示是,所有解决方案都是根据原始变量ab,而不是nxnynz。当您没有指定要为solve选择要解决的变量时。如果您以结构形式返回解决方案,则输出的性质会变得清晰:

s = solve(n0-[1 0 0]','IgnoreAnalyticConstraints',true)

s = 

    nx: [1x1 sym]
    ny: [1x1 sym]
    nz: [1x1 sym]

但我认为你可能希望ab解决nxnynz的问题,而不是其他问题。四处走走。您使用solve查找超定系统的解决方案是不正确的。即使你有更多的方程式然后是未知数,这对于非线性方程也不总是可行的。如果您可以为nxnynz变量中的任何变量引入一些assumptions甚至其他公式或指定数值,solve也许可以分离和反转方程式。

对于线性系统,除了之外,你不应该使用术语“rank”。对于您提供solve的线性系统示例,可以正常工作:

[a,b] = solve([a==2 b==3 a+b==5],a,b)

[a,b] = solve(a==2,b==3,a+b==5,a,b)

[a,b] = solve([1 0;0 1;1 1]*[a;b]==[2;3;5],a,b)

返回

Warning: 3 equations in 2 variables. 
> In /Applications/MATLAB_R2013a.app/toolbox/symbolic/symbolic/symengine.p>symengine at 56
  In mupadengine.mupadengine>mupadengine.evalin at 97
  In mupadengine.mupadengine>mupadengine.feval at 150
  In solve at 170 

a =

2


b =

3