Нахождение оптимального решения системы линейных уравнений в c ++

0

Здесь проблема:

В настоящее время я пытаюсь создать систему управления, которая требуется для нахождения решения ряда сложных линейных уравнений без единственного решения.

Моя проблема возникает из-за того, что будет только шесть уравнений, тогда как может быть более 20 неизвестных (обычно это более шести неизвестных). Разумеется, это не даст точного решения через стандартное гауссово исключение или путем изменения их в матрице с уменьшенной формой эшелона строк.

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

Конечно, я пытаюсь создать код, который найдет правильное решение, но в случае наличия нескольких комбинаций, которые дают удовлетворительные результаты, я хотел бы минимизировать Sum of (value of unknown * efficiency constant) over all unknowns, т.е. Sigma [x I * e I ] от я = 0 до n, но поиск точного решения имеет больший приоритет.

Производительность также важна из-за того, что этот алгоритм может потребоваться несколько раз в секунду.

Итак, есть ли у кого-нибудь идеи помочь мне в реализации этого?

  • 3
    Линейное программирование? Даже наивный решатель должен быть достаточно быстрым для разумных значений «несколько».
  • 1
    Возможно, вам стоит взглянуть на библиотеки CLooG или PPL (используемые GCC) для решения задач линейного программирования.
Показать ещё 2 комментария
Теги:
performance
algorithm
matrix
equation

2 ответа

2
Лучший ответ

Изменение: вы можете просто придерживаться линейного программирования с ограничениями равенства и неравенства, но здесь интересное точное решение, которое не включает ограничение, которое ваши неизвестные находятся между 0 и 1.

Здесь обсуждаем вашу проблему: http://see.stanford.edu/materials/lsoeldsee263/08-min-norm.pdf

Я переведу вашу проблему в математику, чтобы сделать вещи немного легче понять:

у вас есть матрица 6x20 A и вектор x с 20 элементами. Вы хотите минимизировать (x ^ T) e при условии Ax = y. Согласно слайдам, если бы вы просто минимизировали сумму x, то ответ A ^ T (AA ^ T) ^ (-1) y. Я еще раз посмотрю на это, как только у меня появится такая возможность, и посмотрим, каково решение минимизации (x ^ T) e (т.е. Ваша конкретная проблема).

Редактировать: я посмотрел в powerpoint еще немного, а рядом с ним появился слайд, озаглавленный "Общая нормальная минимизация с ограничениями равенства". Я собираюсь переключить нотацию в соответствии со слайдом:

Ваша проблема в том, что вы хотите минимизировать || Ax-b ||, где b = 0, а A - ваш e-вектор, а x - 20 неизвестных. Это зависит от Cx = d. Видимо, ответ таков:

x = (A ^ TA) ^ -1 (A ^ T b -C ^ T (C (A ^ TA) ^ -1 C ^ T) ^ -1 (C (A ^ TA) ^ [CN00 ] A ^ Tb - d))

это некрасиво, но это не так плохо, как вы думаете. Там действительно не так много расчетов. Например (A ^ TA) ^ -1 нужно только вычислить один раз, а затем вы можете повторно использовать ответ. И ваши матрицы не такие большие.

Обратите внимание, что я не использовал ограничение, состоящее в том, что элементы x находятся в пределах [0,1].

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню