Приносим извинения, если этот вопрос плохо сформулирован, но я пытаюсь использовать z3 (в python с привязкой языка) для решения некоторых нелинейных уравнений, но, к сожалению, ни qfnra-nlsat, ни общий решатель не могут решить следующую систему, если только а, б и все дано:Насколько нелинейность может обрабатываться z3 на практике?
y == 0.001 * (a ** 2.07) * (b ** 0.9) * (c ** 0.7) + 0.002
y > 0.0
Я попытался с помощью следующей тактики:
t = z3.Then('simplify', 'qfnra-nlsat')
, и я также пытался подставляя нелинейные части с некоторыми промежуточными названиями и добавить экспоненциальные части назад в дальнейшем с инкрементным решателем с использованием push()
. Но z3 в основном застревает (дольше, чем я пытался), в обоих случаях.
Я новичок в CSP и теоретический фон, извините, если это глупый вопрос, но мне интересно, не существует ли такая нелинейность вне (эмпирически) разрешима z3 или я не использую ее правильно? Благодаря!
Edit:
Вот питон код, который не работает на моей машине:
import z3
a = z3.Real('a')
b = z3.Real('b')
c = z3.Real('c')
y = z3.Real('y')
eq = [
y == 0.001 * (a ** 2.07) * (b ** 0.9) * (c ** 0.7) + 0.002,
y >= 0.0
]
t = z3.Then('simplify', 'qfnra-nlsat')
s = t.solver()
s.add(eq)
r = s.check()
print r
m = s.model()
print m
Вот результат:
unknown
[y = 1/500 ]
Edit:
Казалось что последний код из z3 git repo некорректно нарушен. Я пробовал с выпуском 4.4.1, и все получилось.
Следить за вопрос, хотя, если я просто добавить еще одно ограничение ниже:
a == 16.0
и Z3 застревает, который я не мог понять ... Кажется, что дополнительное ограничение выше довольно тривиально, первоначальное предположение о том, что b и c являются как 1s, должны решить систему, но я думаю, что это не так, как работает z3? Любая идея о том, как решить систему с помощью этого нового ограничения?
Забыл упомянуть, z3 застревает, когда даны a, b и c.Если я не оставлю какой-либо из валов rhs или присвою значение y, z3 просто сдастся и немедленно вернет неизвестное. – weil0ng
Кроме того, я объявлял все переменные как тип Real. – weil0ng