MATLAB求解方程组问题

MATLAB求解方程组问题,matlab,equations,Matlab,Equations,我想用,我确信有一个非零解来解这些方程。方程式如下: 0.7071*x + 0.7071*z = x -0.5*x + 0.7071*y + 0.5*z = y -0.5*x - 0.7071*y + 0.5*z = z 我在MATLAB中写道: [x,y,z]=solve('0.7071 * x+0.7071 * z=x','-0.5 * x+0.7071 * y+0.5 * z=y','-0.5 * x-0.7071 * y+0.5 * z=z'

我想用,我确信有一个非零解来解这些方程。方程式如下:

0.7071*x            + 0.7071*z = x 
  -0.5*x + 0.7071*y +    0.5*z = y
  -0.5*x - 0.7071*y +    0.5*z = z
我在MATLAB中写道:

[x,y,z]=solve('0.7071 * x+0.7071 * z=x','-0.5 * x+0.7071 * y+0.5 * z=y','-0.5 * x-0.7071 * y+0.5 * z=z');
但结果是x=y=z=0。
正如我所说,我确信有一个解决办法。有人能帮忙吗?

我认为你不需要使用
求解
函数,因为你的方程是线性方程组

重铸为矩阵方程:

Ax = B
    0.7071*x + 0.7071*z = x 

    0.7071*x + 0.7071*x = x 

    1.4142*x = x 
就你而言:

    | -0.2929   0.0      0.7071  |  | x |     | 0 |
    | -0.5     -0.2929   0.5     |  | y |  =  | 0 |
    | -0.5     -0.7071  -0.5     |  | z |     | 0 |
利用MATLAB的内置函数进行求解。见例

MATLAB的核心是求解这类方程


使用(一个类似MATLAB的开源环境) GPL许可证;适用于Windows installer):

所以答案是:x=0,y=0,z=0


解决方案也可以手工推导。从最后两个方程式开始:

    -0.5*x + 0.7071*y +    0.5*z = y
    -0.5*x - 0.7071*y +    0.5*z = z

    0.2929*y =  -0.5*x + 0.5*z
    0.7071*y =  -0.5*x + 0.5*z

    0.2929*y = 0.7071*y
因此y=0.0,并且:

    0.7071*y =  -0.5*x + 0.5*z

    0 =  -0.5*x + 0.5*z

    0 =  -0.5*x + 0.5*z

    0.5*x = 0.5*z

    x = z
在第一个等式中插入:

Ax = B
    0.7071*x + 0.7071*z = x 

    0.7071*x + 0.7071*x = x 

    1.4142*x = x 

因此x=0.0。当x=z时,z=0.0。

我认为你不需要使用
解函数,因为你的方程是线性方程组

重铸为矩阵方程:

Ax = B
    0.7071*x + 0.7071*z = x 

    0.7071*x + 0.7071*x = x 

    1.4142*x = x 
就你而言:

    | -0.2929   0.0      0.7071  |  | x |     | 0 |
    | -0.5     -0.2929   0.5     |  | y |  =  | 0 |
    | -0.5     -0.7071  -0.5     |  | z |     | 0 |
利用MATLAB的内置函数进行求解。见例

MATLAB的核心是求解这类方程


使用(一个类似MATLAB的开源环境) GPL许可证;适用于Windows installer):

所以答案是:x=0,y=0,z=0


解决方案也可以手工推导。从最后两个方程式开始:

    -0.5*x + 0.7071*y +    0.5*z = y
    -0.5*x - 0.7071*y +    0.5*z = z

    0.2929*y =  -0.5*x + 0.5*z
    0.7071*y =  -0.5*x + 0.5*z

    0.2929*y = 0.7071*y
因此y=0.0,并且:

    0.7071*y =  -0.5*x + 0.5*z

    0 =  -0.5*x + 0.5*z

    0 =  -0.5*x + 0.5*z

    0.5*x = 0.5*z

    x = z
在第一个等式中插入:

Ax = B
    0.7071*x + 0.7071*z = x 

    0.7071*x + 0.7071*x = x 

    1.4142*x = x 

因此x=0.0。当x=z时,z=0.0。

x=0,y=0,z=0是正确的解决方案。这个问题很容易用手解决。

x=0,y=0,z=0是正确的解决方案。这个问题可以很容易地手工解决。

您正在寻找一个非平凡的解决方案v到a*v=v,v=[x;y;z]和

A = [ 0.7071 0 0.7071 ;
      -0.5 0.7071 0.5 ;
    -0.5 -0.7071 0.5 ];
B = [1 ; 1 ; 1];

AA = A-diag(B)

      -0.2929            0       0.7071
         -0.5      -0.2929          0.5
         -0.5      -0.7071         -0.5

BB = B-B

     0
     0
     0

AA\BB

     0
     0
     0
A =
   0.70710678118655                  0   0.70710678118655
  -0.50000000000000   0.70710678118655   0.50000000000000
  -0.50000000000000  -0.70710678118655   0.50000000000000
可以将其转换为(A-I)v=0,其中I是3x3单位矩阵。要找到一个非平凡的解决方案,您需要做的是检查a-I的空空间:

>> null(A-eye(3))

ans =

   0.67859834454585
  -0.67859834454585
   0.28108463771482
所以,你有一个一维零空间。否则,您将看到多个列。列的每个线性组合都是这个空空间中的一个点,a-I映射到空向量。所以,这个向量的每一个倍数都是问题的解决方案

实际上,矩阵A是第一类旋转矩阵,因为det(A)=1,A'*A=恒等式。所以它的特征值为1,旋转轴作为相应的特征向量。上面我计算的向量是标准化的旋转轴

注:为此,我将0.7071替换为sqrt(0.5)。如果舍入误差是一个问题,但您事先知道必须有一个非平凡的解决方案,那么最好的办法是对a-I进行奇异值分解,并选择最右边的奇异向量:

>> [u,s,v] = svd(A-eye(3));
>> v(:,end)

ans =

   0.67859834454585
  -0.67859834454585
   0.28108463771482

通过这种方法,你可以计算一个向量v,它在| v |=1的约束下最小化| a*v-v |,其中|.|是欧几里德范数。

你正在寻找一个非平凡的解v到a*v=v,v=[x;y;z]和

A =
   0.70710678118655                  0   0.70710678118655
  -0.50000000000000   0.70710678118655   0.50000000000000
  -0.50000000000000  -0.70710678118655   0.50000000000000
可以将其转换为(A-I)v=0,其中I是3x3单位矩阵。要找到一个非平凡的解决方案,您需要做的是检查a-I的空空间:

>> null(A-eye(3))

ans =

   0.67859834454585
  -0.67859834454585
   0.28108463771482
所以,你有一个一维零空间。否则,您将看到多个列。列的每个线性组合都是这个空空间中的一个点,a-I映射到空向量。所以,这个向量的每一个倍数都是问题的解决方案

实际上,矩阵A是第一类旋转矩阵,因为det(A)=1,A'*A=恒等式。所以它的特征值为1,旋转轴作为相应的特征向量。上面我计算的向量是标准化的旋转轴

注:为此,我将0.7071替换为sqrt(0.5)。如果舍入误差是一个问题,但您事先知道必须有一个非平凡的解决方案,那么最好的办法是对a-I进行奇异值分解,并选择最右边的奇异向量:

>> [u,s,v] = svd(A-eye(3));
>> v(:,end)

ans =

   0.67859834454585
  -0.67859834454585
   0.28108463771482

通过这种方法,您可以计算一个向量v,该向量在| v |=1的约束下最小化| a*v-v |,其中|.|是欧几里德范数。

朋友们使用MATLAB命令rref(a)来表示Ax=B。。。。它将给出一个上三角矩阵。然后你可以很容易地计算出非平凡解。。。但请记住,如果rref(A)=I(如您的情况),则不存在非平凡解。
祝你好运

朋友们使用MATLAB命令rref(A)for Ax=B。。。。它将给出一个上三角矩阵。然后你可以很容易地计算出非平凡解。。。但请记住,如果rref(A)=I(如您的情况),则不存在非平凡解。
祝你好运,我写的A=[0.7071 0.7071;-0.50.7071 0.5;-0.5-0.7071 0.5]
[x;y;z]=A*[x;y;z]
但它给出了错误。请注意,右边是x,y,z不是零。请你帮我在Matlab中写下它。我用应该在Matlab中运行的代码更新了这个问题。谢谢你的兴趣,但是B数组应该是[x;y;z],你写的方程和我在问题中写的方程不一样。-1你在什么地方搞砸了。有一个非常重要的解决方案。事实上,有无穷多个,因为Tv=0系统的矩阵T是单数的。我写了A=[0.7071 0 0.7071;-0.50.7071 0.5;-0.5-0.7071 0.5]
[x;y;z]=A*[x;y;z]
但它给出了错误。请注意,右边是x,y,z不是零。请你帮我在Matlab中写下它。我用应该在Matlab中运行的代码更新了这个问题。谢谢你的兴趣,但是B数组应该是[x;y;z],你写的方程和我在问题中写的方程不一样。-1你在什么地方搞砸了。有一个非常重要的解决方案。事实上,有无穷多个,因为你的Tv=0系统的矩阵T是奇异的。由于第一个方程缺少y,手工求解应该不难。你得到了什么?+/-符号不会有任何影响。@Hani:为什么你确定有一个非零解?…因为它是第一类旋转矩阵。因此,它有一个ei