c# - 在 C# 中求解一个欠定的线性方程组
问题描述
我需要在 c# 中求解一个欠定的线性方程组。例如
欠定线性方程组:
x + 3 = y + z
x + w = 2
结果:
x = r1
y = -r2 + r1 + 3
z = r2
w = 2 - r1
现在我用 3 和 4 初始化 r1 和 r2 以获得我的结果之一。
我尝试像这样在 c# 中使用 Math.Net
using MathNet.Numerics.LinearAlgebra;
namespace SolveLinearEquations
{
class Program
{
static void Main(string[] args)
{
var A = Matrix<double>.Build.DenseOfArray(new double[,] {
{ 1, -1, -1, 0 },
{ 1, 0, 0, 1 }
});
var B = Vector<double>.Build.Dense(new double[] { -3, 2 });
var X = A.Solve(B);
}
}
}
但我接受这样的例外
System.ArgumentException: 'Matrix dimensions must agree: 2x4.'
不能 Math.Net 解决一个欠定的线性方程组或......?什么是最好的解决方案?
解决方案
这里有三种方法可以尝试。
1)通过添加另一个方程来改变你未确定的系统。例如,如果您得到 r1<0,则添加等式 r1 = a for some a >= 0;
2)将您的问题重铸为线性规划问题。这将使您能够添加约束,并且您可以构建目标函数以获得您喜欢的结果。据我所知,这不是 MathNet 直接支持的,但这里有一个解决方案的尝试:http: //type-nat.ch/post/lp-simplex-draft/
3) 使用通用的最小化函数。根据系统方程将要最小化的函数定义为误差项的总和。例如,将 y=mx+b 更改为 (y-(mx+b))^2。对于约束,添加条件误差项,例如 c = if (r1<0, r1^2, else 0)
推荐阅读
- c# - 我如何知道我的列表中的项目是否已更改?
- r - 如何查看由 for 循环生成的特定训练集和测试集?
- sql - BigQuery:使用 DML 原子地替换日期分区
- git - 如何仅合并来自另一个分支的一些文件
- android - react-native-udp Sochets.createSocket 未定义对象
- excel - 整个工作簿的 SUMIF
- java - Javadoc @link 到 Kotlin 类
- r - R闪亮的checkboxGroup在地图上绘制数据
- laravel - Laravel 5.4 Route [login] 未定义
- scala - 什么可以在尾递归功能中炸毁我的笔记本电脑?