【问题标题】:MATLAB Solving equations problemMATLAB 求解方程问题
【发布时间】:2009-11-13 11:22:14
【问题描述】:

我想使用MATLAB 求解这些方程,并且我确定存在非零解。方程式是:

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。 正如我所说,我确信有一个解决方案。有人可以帮忙吗?

【问题讨论】:

  • 由于第一个方程缺少 y,因此手动求解应该不难。你得到了什么?
  • +/- 符号不会有任何效果。
  • @Hani:你为什么确定有非零解决方案?
  • ...因为它是第一类旋转矩阵。因此,它有一个特征值为 1 的特征向量。这个特征向量是旋转轴和非平凡解。
  • MuPAD 还说解决方案是 x=y=z=0,当我要求它找到假设 x 0 的解决方案时,它只会给我一个空的解决方案。

标签: matlab equations


【解决方案1】:

您正在寻找 v=[x;y;z] 和...的 A*v=v 的非平凡解决方案 v...

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=identity.所以它的特征值为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 来最小化 |A*v-v|在|v|=1 的约束下|.|是欧几里得范数。

【讨论】:

  • 非常感谢,这正是我想要的,但坦率地说,我不明白你是怎么得到它的。请你给我一个描述这个想法的参考资料(不是一本完全线性代数书,而是只有这个想法,例如:书中的一章或一节)。
  • 你不明白的到底是什么?
  • 零空间,特征值。为什么 A-I 会给出结果,尽管它乘以 v (A-I)v=0。我在 matlab 中阅读了 null 函数的作用,但我无法完全理解。你为什么只从 svd 结果中取 v 以及 u 和 s 代表什么。我真的很感谢你的描述和你花时间解释,但问题不在于我在没有深入研究这些主题的情况下学习了线性代数,而且我现在(刚刚)没有时间阅读一本完整的线性代数书。带着我的感激。哈尼·阿尔穆斯利..
  • 忘记空值。您应该了解的重要一点是 SVD 是什么以及这 3 个矩阵的属性是什么。我建议您自己对此主题进行一些研究。我想,维基百科是一个好的开始。
  • 基本上,您正在计算矩阵 A 的特征向量:AX=lambda*X,lambda=1。 [V D] = eig(A) 并选择与真实特征值 1 D(3,3) 对应的向量 V(:,3)。这个页面可能有一些解释:en.wikipedia.org/wiki/Eigenvalue,_eigenvector_and_eigenspace
【解决方案2】:

我认为您不需要使用 solve 函数,因为您的方程是线性方程组。

重铸为矩阵方程:

Ax = B

在你的情况下:

    | -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: Solution of Linear Systems of Equations

MATLAB的核心就是求解这类方程。


使用FreeMat(一个类似 MATLAB 的开源环境 GPL 许可证; direct download URL 用于 Windows 安装程序):

   A = [ -0.2929 0.0 0.7071; -0.5 -0.2929 0.5; -0.5 -0.7071 -0.5 ]

   B = [0.0; 0.0; 0.0]

   A\B

   ans =
    0
    0
    0

所以解是: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

插入第一个方程:

    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。

【讨论】:

  • 我写了 A=[0.7071 0 0.7071;-0.5 0.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 是奇异的。
【解决方案3】:

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

【讨论】:

  • 这是一个解决方案。这不是问题所需的解决方案。 Null 给出了非平凡的解决方案。
【解决方案4】:
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

【讨论】:

    【解决方案5】:

    朋友们使用MATLAB命令rref(A) for Ax=B....它会给出一个上三角矩阵。然后你可以轻松计算非平凡的解决方案......但请记住,如果 rref(A)=I (如你的情况)那么非平凡的解决方案不存在。 祝你好运

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多