LINUX.ORG.RU

решение системы уравнений с дискретными переменными

 


0

2

Вот есть у меня система линейных уравнений. Часть из переменных в которой может изменяться только дискретно (назовем их D-переменные). Я делаю так: сначала считаю, как получится, потом фиксирую D-переменные на ближайшем допустимом значении. И решаю систему заново, добавив вычисленные значения D-переменных как константы.

Процесс итеративный, поэтому вычисление из-за многоэтапности затягивается. Как лучше учитывать в одной системе и дискретно изменяемые величины и «нормальные аналоговые»?


Ответ на: комментарий от jtootf

Так вы говорите про целочисленную задачу. А у меня условно 1000 вещественных переменных и всего 10 целочисленных. А вокруг этого метод наименьших квадратов. Как тут применить целочисленное программирование?

jcdr
() автор топика

Дискретные переменные — целочисленные? Или более общий случай, когда задано множество значений для каждой переменной?

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

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Иными словами, я бы исключил все аналоговые переменные (то же самое, что привести к диагональному виду)

Waterlaz ★★★★★
()
Ответ на: комментарий от jtootf

Не-не-не. Не пугай так, у него же немного не то.

Целочисленное ЛП — NP-полное, а решение целочисленной системы лин. уравнений лежит в P емнип.

Waterlaz ★★★★★
()

попробуй SMT solver какой-нибудь использовать. http://rise4fun.com/Z3/tutorialcontent/guide#h24 Там вроде есть такое. Хотя я не уверен, что это подходящий инструмент для решения такого рода задач

SZT ★★★★★
()

Вот например если надо найти для целых чисел решение уравнения x^2 = y^2 + z^2 где x, y, z больше 0 http://rise4fun.com/z3

(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (= (* x x) (+ (* y y) (* z z))))
(assert (> x 0))
(assert (> y 0))
(assert (> z 0))
(check-sat)
(get-model)
(exit)
Получаем вот такое решение
sat
(model 
  (define-fun z () Int
    12)
  (define-fun y () Int
    9)
  (define-fun x () Int
    15)
)
Т.е. 15^2 = 9^2 + 12^2

SZT ★★★★★
()
Ответ на: комментарий от Waterlaz

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

jcdr
() автор топика
Ответ на: комментарий от jcdr

В двух словах: ждатьВолшебнойТаблеткиМожноДолго, занимайтесьСамообразованием.

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

Northsoft ★★
()
Ответ на: комментарий от jcdr

Задано множество значений для каждой переменной.

Тогда упс, твоя задача NP-полная. Хорошего универсального ответа тут нет. Нужно конкретнее смотреть, какой вид у линейных уравнений и какие множества значений у дискретных переменных.

Waterlaz ★★★★★
()
Ответ на: комментарий от jcdr

Так чем тебе SMT солвер не нравится? Покажи пример этой твоей системы уравнений, которую тебе решить надо

SZT ★★★★★
()
Ответ на: комментарий от SZT

Тема интересная, спасибо. Но у меня практическая численная задача для матриц размером от 1000х1000. При таком количестве условий и ограничений сколько SMT будет искать допустимое решение?

jcdr
() автор топика
Ответ на: комментарий от SZT

Я так понял, что эти солверы ищут корректную модель, отвечающую всем всем условиям. Но вот, например:

(declare-const a Int) (declare-const b Int) (assert (> a 10)) (assert (> b 10)) (assert (< (+ a b) 20)) (check-sat) (get-model)

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

jcdr
() автор топика
Ответ на: комментарий от jcdr

Если a > 10 и b > 10 то сумма их ну никак не может быть меньше 20. Если надо учитывать шумы, то просто можно добавить в assert определенные допуски. Например сделать еще (declare-const noise Int) (assert (> noise -2)) (assert (< noise 2)) (таким образом получится что может принимать значение -1 0 1)
И вместо (assert (< (+ a b) 20)) сделать (assert (< (+ a b) (+ 20 noise) ))

Будет допустимая погрешность +-1

SZT ★★★★★
()
Ответ на: комментарий от jcdr

Я так понял, что эти солверы ищут корректную модель, отвечающую всем всем условиям.

Солверы могут еще искать что некое условие всегда выполняется. Кванторы всеобщности, кванторы существования, логика первого порядка, вот это все

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.