от
Мне нужно программно решить систему линейных уравнений в C, объективных C, или (при необходимости) на C . Вот пример уравнения:


От этого, я хотел бы получить наилучшее приближение для a
,
b
, и
tx
.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

11 Ответы

0 голосов
от
Мне нужно программно решить систему линейных уравнений в C, объективных C, или (при необходимости) на C . Вот пример уравнения:


От этого, я хотел бы получить наилучшее приближение для a
,
b
, и
tx
.
0 голосов
от
Правило Крамера и Метод Гаусса два хороших универсальных алгоритмов (см. Также одновременных линейных уравнений). Если вы ищете код, проверить GiNaC, Максима, и SymbolicC (в зависимости от ваших требований лицензирования, конечно). Редактировать: я знаю, что ты работаешь в земле С, но я также должен положить в хорошее слово для SymPy (компьютерная система алгебры в Python). Вы можете многое узнать из ее алгоритмов (если вы можете прочитать немного о Python). Кроме того, под новой лицензией BSD, в то время как большинство бесплатные математические пакеты ГПЛ.
0 голосов
от
Вы можете решить это с помощью программы, точно так же, как вы удалите его вручную (с умножение и вычитание, а затем подавать результаты в уравнения). Это довольно стандартный среднего школьного уровня математики.


Так что вы в конечном итоге с:

a =   0.0785250
b =  

Если вы подключите эти значения обратно в A, B и C, вы поймете, что они правильные.

Хитрость заключается в том, чтобы использовать простую матрицу 4х3, что снижает, в свою очередь, на матрицу 3х2, 2х1, потом что "а = н", н, будучи фактическим количеством. Как только вы имеете это, вы кормите его в следующую матрицу, чтобы получить другое значение, то эти два значения в следующую матрицу до того, как вы решили все переменные.

Если у вас есть N различных уравнений, вы всегда можете решить для n переменных. Я говорю, отличается, потому что эти два не являются:

 7a   2b =  50
14a   4b = 100
Они такие же уравнение, умноженное на два, так что вы не получите решение от них - умножением первых двух после вычитания оставляет вас с истинным, но бесполезные высказывания:
0 = 0   0
К примеру, вот некоторый код на C, который работает одновременных уравнений, которые вы поместили в ваш вопрос. Во-первых, некоторые необходимые типы, переменные, поддержка функция для распечатки уравнение, и начала
main
:
#include
0 голосов
от
Для системы линейных уравнений 3х3 я думаю, было бы хорошо, чтобы выкатить свои собственные алгоритмы. Однако, вы, возможно, придется беспокоиться о точности, деление на ноль или очень малых чисел и что с этим делать бесконечно много решений. Мое предложение-перейти с обычной цифровой пакет линейной алгебры, такие как LAPACK.
0 голосов
от
Взгляните на основания решения Microsoft. С ней вы могли бы написать примерно такой код:
  SolverContext context = SolverContext.GetContext();
  Model model = context.CreateModel();

  Decision a = new Decision(Domain.Real, "a");
  Decision b = new Decision(Domain.Real, "b");
  Decision c = new Decision(Domain.Real, "c");
  model.AddDecisions(a,b,c);
  model.AddConstraint("eqA", 

Вот вывод:
===Решатель Фундамента Сервисной Отчета===
Датавремя: 04/20/2009 23:29:55
Название Модели: По Умолчанию
Возможности просила: ЛП
Время (МС): 1027
Общее время (МС): 1414
Решить Статус Завершения: Оптимальный
Решатель Выбрано: Майкрософт.SolverFoundation.Решателей.SimplexSolver
Директивы:
Майкрософт.SolverFoundation.Услуги.Директива
Алгоритм: Перстень
Арифметика: Гибридный
Ценообразование (точное): по умолчанию
Ценообразование (двойной): SteepestEdge
Основание: Провисание
Сводная Граф: 3
===Решения===
Цели:

Решения:
ответ: 0.0785250000000004
б: -0.180612500000001
с: -41.6375875
0 голосов
от
Вы ищете программное обеспечение, которое будет делать работу или на самом деле делают матричные операции, и делать каждый шаг? Первый, мой коллега просто использовал данные, используемые ГЛПК. Это всего лишь оболочка для ГЛПК, но он снимает много шагов настройки вещи. Похоже, тебе придется придерживаться ГЛПК, хотя в языке Си. Для последнего, благодаря вкусным для сохранения старой статье я использовал, чтобы узнать, ЛВ некоторое время назад, в формате PDF. Если вам нужна конкретная помощь в настройке дополнительно, дайте нам знать и я уверен, что я или кто-то будет бродить туда и помочь, но, я думаю, что это довольно прямо вперед. Удачи!
0 голосов
от
Шаблон числового набора из NIST есть инструменты для этого. Одним из более надежных способов является использование QR-разложение. Вот пример обертки так, что я могу назвать "GetInverse(а, Инва)" в мой код и он будет ставить обратные в Инва.
void GetInverse(const Array2D
0 голосов
от
Из формулировки вашего вопроса, похоже, у вас есть больше уравнений, чем неизвестных, и вы хотите, чтобы свести к минимуму нестыковки. Обычно это делается с помощью линейной регрессии, который минимизирует сумму квадратов ошибок. В зависимости от размера данных, вы можете сделать это в электронной таблице или в статистический пакет. R-это качественный, бесплатный пакет, который делает линейную регрессию, среди много других вещей. Существует много линейной регрессии (и много понял), но как это просто сделать, для простых случаев. Вот пример R, используя ваши данные. Отметим, что "Техас" является перехват вашей модели.
0 голосов
от
С точки зрения времени выполнения, эффективности, другие ответили лучше, чем я. если вы всегда будут иметь одинаковое количество уравнений в переменных, я, как правило Крамера как это легко реализовать. Просто написать функцию для вычисления определителя матрицы (или использовать тот, который уже написан, я уверен, что вы можете найти там), и разделить определителей двух матриц.
0 голосов
от
Лично я предпочитаю алгоритмы численного рецепты. (Я люблю с редакция.) Эта книга научит вас, почему алгоритмы работы, плюс покажем вам несколько довольно-хорошо отлаженный реализаций этих алгоритмов. Конечно, вы могли бы просто слепо использовать CLAPACK (я использовал его с большим успехом), но я бы сначала вручную ввести метод Гаусса алгоритм, чтобы хотя бы иметь слабое представление о работе, которое было потрачено на создание этих алгоритмов стабильный. Позже, если вы делаете более интересные линейной алгебры, глядя вокруг исходного кода Октавы будет ответить на множество вопросов.
...