- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试求解类似 Ax=0
的齐次线性方程组。这是一个示例矩阵,为简单起见,它已经被简化:
1 2 | 0
3 6 | 0
我希望得到的解决方案至少是[ 2, -1 ]
。但根本的解决方案是 [2C; -1C]
。您可以看到 Det(A) = 0
和 Rank(A) = 1
。你当然知道这样的系统有简单的解决方案 [0,0]
。
我正在尝试:
Matrix<double> A = Matrix<double>.Build.DenseOfArray(new double[,]
{
{ 1, 2 },
{ 3, 6 }
});
Vector<double> B = Vector<double>.Build.Dense(new double[] { 0, 0 });
var result = A.Solve(B); //result = Nan, Nan.
This solution不适用于我的情况(B = 0,Det(A) = 0)。
最佳答案
要求解线性方程,您可以尝试 Matrix<T>.SolveIterative(Vector<T> input, IIterativeSolver<T> solver, Iterator<T> iterator = null, IPreconditioner<T> preconditioner = null)
.
获取可用的求解器:
var solvers = Assembly.GetAssembly(typeof(Matrix<double>))
.GetTypes()
.Where(t => t.GetInterfaces().Contains(typeof(IIterativeSolver<double>)) &&
t.GetConstructors().Any(ctor => ctor.GetParameters().Count() == 0))
.Select(t => Activator.CreateInstance(t))
.Cast<IIterativeSolver<double>>();
它给出:
MathNet.Numerics.LinearAlgebra.Double.Solvers.BiCgStab
MathNet.Numerics.LinearAlgebra.Double.Solvers.GpBiCg
MathNet.Numerics.LinearAlgebra.Double.Solvers.MlkBiCgStab
MathNet.Numerics.LinearAlgebra.Double.Solvers.TFQMR
用你的数据试试它们:
Matrix<double> A = Matrix<double>.Build.DenseOfArray(new double[,]
{
{ 1, 2 },
{ 3, 6 }
});
Vector<double> B = Vector<double>.Build.Dense(new double[] { 0, 0 });
像这样:
foreach (var solver in solvers)
{
try
{
Console.WriteLine(solver);
Console.WriteLine(A.SolveIterative(B, solver));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
在你的情况下,这不是运气。结果是:
MathNet.Numerics.LinearAlgebra.Double.Solvers.BiCgStab
Algorithm experience a numerical break down
MathNet.Numerics.LinearAlgebra.Double.Solvers.GpBiCg
DenseVector 2-Double
NaN
NaN
MathNet.Numerics.LinearAlgebra.Double.Solvers.MlkBiCgStab
Algorithm experience a numerical break down
MathNet.Numerics.LinearAlgebra.Double.Solvers.TFQMR
DenseVector 2-Double
0
0
虽然它可以像 here 那样工作.
无论如何MathNet
非常好,可以轻松构建解决方案。
使用大学的线性代数和图书馆的功能:
static class MatrixExtension
{
public static Vector<double>[] SolveDegenerate(this Matrix<double> matrix, Vector<double> input)
{
var augmentedMatrix =
Matrix<double>.Build.DenseOfColumnVectors(matrix.EnumerateColumns().Append(input));
if (augmentedMatrix.Rank() != matrix.Rank())
throw new ArgumentException("Augmented matrix rank does not match coefficient matrix rank.");
return augmentedMatrix.SolveAugmented();
}
private static Vector<double>[] SolveAugmented(this Matrix<double> matrix)
{
var rank = matrix.Rank();
var cut = matrix.CutByRank(rank);
// [A|R]x[X] = [B]
var A = Matrix<double>.Build.DenseOfColumnVectors(cut.EnumerateColumns().Take(rank));
var R = Matrix<double>.Build.DenseOfColumnVectors(cut.EnumerateColumns().Skip(rank).Take(cut.ColumnCount - rank - 1));
var B = cut.EnumerateColumns().Last();
var vectors = Matrix<double>.Build.DenseDiagonal(R.ColumnCount, 1)
.EnumerateColumns().ToArray();
return vectors.Select(v => A.Solve(B - R * v))
.Zip(vectors, (x, v) => Vector<double>.Build.DenseOfEnumerable(x.Concat(v)))
.ToArray();
}
private static Matrix<double> CutByRank(this Matrix<double> matrix, int rank)
{
var result = Matrix<double>.Build.DenseOfMatrix(matrix);
while (result.Rank() < result.RowCount)
result = result.EnumerateRows()
.Select((r, index) => result.RemoveRow(index))
.FirstOrDefault(m => m.Rank() == rank);
return result;
}
}
现在:
Console.WriteLine(A.SolveDegenerate(B).First());
给予:
DenseVector 2-Double
-2
1
另一个例子:
Matrix<double> A = Matrix<double>.Build.DenseOfArray(new double[,]
{
{ 1, 2, 1 },
{ 3, 6, 3 },
{ 4, 8, 4 }
});
Vector<double> B = Vector<double>.Build.Dense(new double[3]);
foreach (var x in A.SolveDegenerate(B))
Console.WriteLine(x);
给予:
DenseVector 3-Double
-2
1
0
DenseVector 3-Double
-1
0
1
关于c# - 齐次线性方程组的基本解 : Ax=0 with Det(A)=0 with MathNet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53314020/
我正在从 Alvin Alexander 的 网站学习功能点分析。 http://alvinalexander.com/FunctionPoints/在他的示例中,他正在从 GUI 屏幕计算 DET,
我正在从 Alvin Alexander 的 网站学习功能点分析。 http://alvinalexander.com/FunctionPoints/在他的示例中,他正在从 GUI 屏幕计算 DET,
iex(1)> :dets.open_file(:storage, [{:type, :set}]) {:ok, :storage} 当我尝试使用其他参数时,关于 Erlang 文
所以我一直在使用 ETS - 效果很好。但是,我将它用作路由数据的缓存 - 在模块加载时加载,并在进行更改时保存(读取的次数远远多于写入的次数)。 我认为 DETS 会让事情变得更加干净 - 我不必担
numpy.linalg.det 的文档指出 The determinant is computed via LU factorization using the LAPACK routine z/d
我所需要的只是 Erlang 中的一个大型持久查找表,尽管我需要一个明确的答案,但 dets 似乎就是这样: 表中二进制文件的总大小有多大。 每个条目可以有多大 第一个问题的答案小于100G怎么办 最
谁知道Numpy为什么返回“-2.0000000000000004”而不是“-2” >>> M = [[1,2],[3,4]] >>> numpy.linalg.det(M) -2.000000000
DETS Erlang 文档中描述了一个选项 ram_file open_file(name, args) {ram_file, boolean()} - Whether the table is t
检查小方阵(<16*16 元素)是否奇异(不可逆,det = 0)的最快算法是什么(链接到 C 或 C++ 示例会很酷)? 最佳答案 最好的方法是计算 condition number通过 SVD 并
我正在寻找等效于 Erlangs DETS 的持久键/值存储, 除了没有 DETS 2G 表大小限制。 最佳答案 Berkeley DB Java Edition (使用 Clojure 包装器 he
我得到了一个非常大的矩阵(我无法更改矩阵的值),我需要计算(协方差)矩阵的逆矩阵。 有时我会收到错误提示 Matrix is close to singular or badly scaled.
我正在尝试求解类似 Ax=0 的齐次线性方程组。这是一个示例矩阵,为简单起见,它已经被简化: 1 2 | 0 3 6 | 0 我希望得到的解决方案至少是[ 2, -1 ]。但根本的解决方案是 [2C;
描述(这是一个 hwk 问题): 我不知道从哪里开始。我计划使用拉普拉斯展开式,但我不确定如何将其应用于 nxn 矩阵。任何帮助,将不胜感激。 注意:我已经有一个为 nxn 矩阵生成随机矩阵的函数。计
我想写 M.det() 而不是 numpy.linalg.det(M),所以我这样做了: numpy.matrix.det = numpy.linalg.det 它奏效了。 对这个程序有什么要说的吗?
我正在尝试用 Python 估计 log(det(AAT)+1) 的平均值。我的简单代码工作正常,直到我得到 17×17 矩阵,此时它给了我一个数学错误。这是代码: iter = 10000 fo
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我基本上想将名为“EKTE9”的文本文件第一行中的 unix 时间值转换为迄今为止的值。我认为使用日期时间库是可行的方法,但我不知道如何在我的代码中实现它。一些答案将不胜感激。 import matp
我是一名优秀的程序员,十分优秀!