如何用Breeze求解齐次线性方程组

How to solve the homogeneous system of linear equation with Breeze

我尝试用Breeze求解齐次线性方程组。

斧=0

我想得到一个重要的解决方案

但是,我在寻找非平凡解时遇到了一些问题

我该怎么办?

谢谢

这是我的代码:

    val A =DenseMatrix(
    (1.0,2.0,3.0,2.0),
    (1.0,3.0,5.0,5.0),
    (2.0,4.0,7.0,1.0),
    (-1.0,-2.0,-6.0,-7.0)
    )

    val e = DenseVector(0,0,0,0)

    val x = A \ e

错误:

    breeze.linalg.MatrixSingularException: 
at breeze.linalg.operators.DenseMatrixMultiplyStuff$implOpSolveMatrixBy_DMD_DMD_eq_DMD$.LUSolve(DenseMatrixOps.scala:151)
at breeze.linalg.operators.DenseMatrixMultiplyStuff$implOpSolveMatrixBy_DMD_DMD_eq_DMD$.apply(DenseMatrixOps.scala:127)
at breeze.linalg.operators.DenseMatrixMultiplyStuff$implOpSolveMatrixBy_DMD_DMD_eq_DMD$.apply(DenseMatrixOps.scala:115)
at breeze.linalg.ImmutableNumericOps$class.$bslash(NumericOps.scala:144)
at breeze.linalg.DenseMatrix.$bslash(DenseMatrix.scala:53)
at breeze.linalg.operators.DenseMatrixMultiplyStuff$implOpSolveMatrixBy_DMD_DVD_eq_DVD$.apply(DenseMatrixOps.scala:221)
at breeze.linalg.operators.DenseMatrixMultiplyStuff$implOpSolveMatrixBy_DMD_DVD_eq_DVD$.apply(DenseMatrixOps.scala:218)
at breeze.linalg.ImmutableNumericOps$class.$bslash(NumericOps.scala:144)
at breeze.linalg.DenseMatrix.$bslash(DenseMatrix.scala:53)
at .<init>(<console>:27)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
at scala.tools.nsc.interpreter.IMain.loadAndRunReq(IMain.scala:573)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
at scala.tools.nsc.interpreter.ILoop.reallyInterpret(ILoop.scala:760)
at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:805)
at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:717)
at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:581)
at scala.tools.nsc.interpreter.ILoop.innerLoop(ILoop.scala:588)
at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:591)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process.apply$mcZ$sp(ILoop.scala:882)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process.apply(ILoop.scala:837)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process.apply(ILoop.scala:837)
at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:837)
at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:904)
at org.jetbrains.plugins.scala.compiler.rt.ConsoleRunner.main(ConsoleRunner.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

首先,你的代码不会产生这个错误,而是一个类型错误,因为你的向量是[Int]。在 post 之前,请尝试 运行 您 post 的代码。
其次,你的矩阵有非零行列式,所以没有这样的解决方案。
你可以很容易地看到 breeze

scala> import breeze.linalg._
import breeze.linalg._

scala>   val A =DenseMatrix(
     |     (1.0,2.0,3.0,2.0),
     |     (1.0,3.0,5.0,5.0),
     |     (2.0,4.0,7.0,1.0),
     |     (-1.0,-2.0,-6.0,-7.0)
     |     )
A: breeze.linalg.DenseMatrix[Double] =
1.0   2.0   3.0   2.0
1.0   3.0   5.0   5.0
2.0   4.0   7.0   1.0
-1.0  -2.0  -6.0  -7.0
scala> det(A)
res6: Double = -14.0

我们可以改变一行,使它们变成linearly-dependent

scala> val nl = DenseVector(1,2,-1,0.0).t * A
ago 19, 2016 6:47:22 PM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
ago 19, 2016 6:47:22 PM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
nl: breeze.linalg.Transpose[breeze.linalg.DenseVector[Double]] = Transpose(DenseVector(1.0, 4.0, 6.0, 11.0))


scala> val C = A.copy
C: breeze.linalg.DenseMatrix[Double] =
1.0   2.0   3.0   2.0
1.0   3.0   5.0   5.0
2.0   4.0   7.0   1.0
-1.0  -2.0  -6.0  -7.0

scala>  C(3,::) := nl
res1: breeze.linalg.Transpose[breeze.linalg.DenseVector[Double]] = Transpose(DenseVector(1.0, 4.0, 6.0, 11.0))

scala> C
res2: breeze.linalg.DenseMatrix[Double] =
1.0  2.0  3.0  2.0
1.0  3.0  5.0  5.0
2.0  4.0  7.0  1.0
1.0  4.0  6.0  11.0

scala> det(C)
ago 19, 2016 6:48:17 PM com.github.fommil.netlib.LAPACK <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeSystemLAPACK
ago 19, 2016 6:48:17 PM com.github.fommil.netlib.LAPACK <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeRefLAPACK
res3: Double = -0.0

所以我们现在有了一个可以用于此的矩阵。 我们必须将它分解为奇异值并寻找零值

scala> val svd.SVD(u,s,v) = svd(C)
u: breeze.linalg.DenseMatrix[Double] =
-0.2418695880246191   0.18180320883181855  0.8749797442170381    -0.3779644730092261
-0.4572321583765708   0.05780050748664106  -0.46494008565837486  -0.755928946018455
-0.39944397391966924  0.8267072956674623   -0.11892189088772076  0.3779644730092271
-0.7568899308580912   -0.5293030718623615  0.0640214637880056    0.3779644730092274
s: breeze.linalg.DenseVector[Double] = DenseVector(16.921266409229123, 5.964439026615583, 0.31017770016412793, 6.020650824737852E-16)
v: breeze.linalg.DenseMatrix[Double] =
-0.13325714344103542  -0.3829956407255237  -0.6116100715073144  -0.6793305479205232
0.22864098865050173   0.28948654309971367  0.5776812852057681   -0.7281518882733954
0.7615548778852732    0.43696733513844804  -0.4774219714970357  0.03408...
scala> s
res4: breeze.linalg.DenseVector[Double] = DenseVector(16.921266409229123, 5.964439026615583, 0.31017770016412793, 6.020650824737852E-16)

我们可以看到最后一个值为null (6.020650824737852E-16 ~ 0) 可能有多个零值,但如果矩阵的行列式为 0,则始终至少有一个。 我们现在创建一个除空奇异值位置外全为零的向量,并将矩阵 v 的转置乘以它

scala> val nts =  v.t * DenseVector(0,0,0,1.0)
nts: breeze.linalg.DenseVector[Double] = DenseVector(0.5916079783099643, -0.7606388292556632, 0.25354627641855365, 0.08451542547285162)

这是您想要的重要解决方案。我们可以检查一下:

scala> C * nts
res5: breeze.linalg.DenseVector[Double] = DenseVector(2.1094237467877974E-15, 1.4432899320127035E-15, 2.9976021664879227E-15, 1.4432899320127035E-15)

我们可以看到除了舍入误差外都是0。