решить недоопределенную систему линейных уравнений в c# - PullRequest
0 голосов
/ 11 апреля 2020

Мне нужно решить недоопределенную систему линейных уравнений в c#. Например,

Недоопределенная система линейных уравнений: x + 3 = y + z x + w = ​​2

Результат: х = г1 y = -r2 + r1 + 3 z = r2 w = 2 - r1 и теперь я инициализирую r1 и r2 с 3 и 4, чтобы получить одно из моих повторений.

Я пытаюсь использовать Math. Net в c#, как это

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.'

Не могу ли математика. Net решить недоопределенную систему линейных уравнений или ...? Каково лучшее решение для этого?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Вот три способа попробовать.

1) Измените неопределенную систему, добавив другое уравнение. Например, если вы получаете r1 <0, то добавьте уравнение r1 = a для некоторого a> = 0;

2) Пересмотрите свою задачу как задачу линейного программирования. Это даст вам возможность добавлять ограничения, а также вы можете построить целевую функцию, чтобы получить результат, который вам нравится. Насколько я знаю, это прямо не поддерживается Mat hNet, но здесь есть попытка найти решение: http://type-nat.ch/post/lp-simplex-draft/

3) Использовать функцию минимизации общего назначения , Определите функцию, которая будет минимизирована как сумма слагаемых ошибок на основе уравнений системы. Например, измените y = mx + b на (y- (mx + b)) ^ 2. Для ограничений добавьте условие условной ошибки, например, c = if (r1 <0, r1 ^ 2, иначе 0) </p>

0 голосов
/ 11 апреля 2020

Я решил это так

using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double.Solvers;

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 },
                { 0, 0, 0, 0 },
                { 0, 0, 0, 0 }
            });
            var B = Vector<double>.Build.Dense(new double[] { -3, 2, 0, 0 });
            var x = A.SolveIterative(B, new MlkBiCgStab());
        }
    }
}

, но теперь у меня проблема. Это решение дает мне уникальное значение для каждой переменной, и иногда эти значения являются отрицательными, но мне нужны положительные значения для каждой переменной. что мне делать?

...