Решатели уравнений для линейных математических уравнений

Мне нужно решить несколько математических уравнений в моем приложении. Вот типичный пример такого уравнения:

a + b * c - d / e = a

Дополнительные правила:

  • b % 10 = 0
  • b >= 0
  • b <= 100
  • Каждое число должно быть целым
  • ...

Я хотел бы получить возможные наборы решений для a, b, c, d и e.

Существуют ли какие-либо библиотеки с открытым исходным кодом или коммерческие, которые я могу использовать для решения такого уравнения? Если да, то какой результат они дают?


person Fabian    schedule 07.10.2008    source источник
comment
Это не похоже на домашнюю работу, Билл К. Большинство домашних заданий не требуют внешних библиотек. Пожалуйста, подумайте, прежде чем переставить тег.   -  person Landon    schedule 08.10.2008


Ответы (10)


Решение линейных систем обычно можно решить с помощью линейного программирования. Я бы порекомендовал взглянуть на Boost uBLAS для начала — у него есть простой треугольный решатель. Затем вы можете проверить библиотеки, ориентированные на более специфичные для предметной области подходы, например QSopt.

person paxos1977    schedule 07.10.2008

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

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

Хорошим ресурсом для общих решателей и т. д. будет GAMS. Большая часть программного обеспечения может быть немного тяжеловата для того, что вы просите.

person simon    schedule 07.10.2008

Вам нужна система компьютерной алгебры.

См. https://stackoverflow.com/questions/160911/symbolic-math-lib, ответы на которые в основном так же важны для c++, как и для c.

person dmckee --- ex-moderator kitten    schedule 07.10.2008

Я знаю, что это не ваш настоящий вопрос, но вы можете упростить данное уравнение до:

d = b * c * e, где e != 0

person quinmars    schedule 07.10.2008
comment
Это не работает для d=0, b=1, c=1. Лучшее, что я придумал, это b * c = d / e - person dummy; 08.10.2008

Почти наверняка в числовых рецептах будет что-то

person Simon    schedule 07.10.2008

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

Тем не менее, многие из них доступны, попробуйте этот список в Википедии:

http://en.wikipedia.org/wiki/Сравнение_компьютерных_алгебра_систем

-Адам

person Adam Davis    schedule 07.10.2008

Это похоже на линейное программирование. Помогает ли этот список?

person andreas buykx    schedule 07.10.2008
comment
это почти не похоже на линейное программирование. - person David Nehme; 18.10.2008

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

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

person I GIVE CRAP ANSWERS    schedule 07.10.2008

Глядя только на часть «дополнительных правил», это похоже на линейное программирование, и в этом случае LINDO или аналогичная программа, реализующая симплексный алгоритм, должна быть в порядке.

Однако, если первое уравнение действительно типично, оно показывает, что ваша задача НЕ является задачей линейной алгебры — никакие две переменные, умножающие или делящие друг друга, не должны появляться в линейном уравнении!

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

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

person Joe Pineda    schedule 14.10.2008

Калькулятор TI-89 имеет приложение «решатель». Он был создан для решения проблем, подобных той, что в вашем примере. Я знаю, что это не библиотека. Но есть несколько эмуляторов TI-89.

person Jason    schedule 09.11.2009