решить систему нелин. уравнений

Форум для обсуждения вопросов математики

Модератор: Admin

Abraziv
Сообщения: 12
Зарегистрирован: Вт окт 27, 2015 1:07 pm

решить систему нелин. уравнений

Сообщение Abraziv » Вт апр 05, 2016 6:55 pm

Ребята, выручайте. Необходимо решить следующую систему:

Код: Выделить всё

A1*x^2+B1*y^2+C1*z^2+D1*x+E1*y+F1*z+G1*x*y+H1*x*z+K1*y*z+M1 = 0
A2*x^2+B2*y^2+C2*z^2+D2*x+E2*y+F2*z+G2*x*y+H2*x*z+K2*y*z+M2 = 0
x^2 + y^2 + z^2 - R^2 = 0


где x,y,z переменные, остальное коэффициенты и слагаемые.

Данная система представляет из себя два двуполосных гиперболоида (1 и 2 уравнение) и уравнение сферы (3).
Решаю данную систему численно следующим образом. Первое и второе уравнение возвожу в квадрат, дальше из третьего выражаю x^2 и подставляю в 1 и 2 (вместо x^2). Получаю два уравнения 4 степени относительно y и z. Если положить z параметром, то оба получившихся уравнения представляют из себя кривые образованные пересечением каждой ветвью гиперболоида и сферы разрезанные плоскостью параллельной XY, т.е. если z параметр и я меняю его от -R до R (R-радиус сферы), то я секу получившуюся кривую плоскостью z = za, где -R <= za <= R.
Как я уже говорил z это параметр и изменяется от -R до R, поэтому в цикле перебираю z и решаю на каждой итерации два уравнения 4 степени, этим нахожу два yi, i=1,2,3,4. Получившиеся yi каждого из уравнений вычитаю по модулю из друг друга и выбираю наименьшую получившуюся разницу для всех z (-R до R), каждого i.
Таким образом я локализовываю до 4 корней и далее уточняю методом Ньютона.
В принципе работает, но не для всех входных коэффициентов (почему-то). Мне необходимо, чтобы корни находились всегда, когда это возможно при заданных коэффициентах.
Пробовал также сложить два получившихся уравнения 4 степени и прогнать получившиеся уравнения для каждой z (целой). По идеи если сложить два уравнения 4th, то и yi должны существовать будут далеко не для всех z. Но и последний способ не всегда ищет корни, более того ещё хуже чем первый.
Проблемы у меня могут быть из-за не корректного решения уравнений 4 степени, т.к. матлабовский код:

Код: Выделить всё

syms  y;
S1 = solve(P11*y^4 + P12*y^3 + P13*y^2 + P14*y + P15);
S2 = solve(P21*y^4 + P22*y^3 + P23*y^2 + P24*y + P25);

почему то находит гораздо больше корней и локализация корней полученных с помощью решения уравнений 4 степени матлабовской solve практически всегда уточняется методом Ньютона.
Я не понимаю, как такое происходит. Я написал три функции для решения quartic 3 различными алгоритмами, использовал различные библиотеки, но всё равно матлаб находит больше корней для этих двух quartic. Я уже практически отчаялся.
Интересная особенность, то что matlab с помощью функции solve решает систему на ура, причём находит все 8 корней (их и должно быть 8 ), пусть и не всегда вещественные. Я понятия не имею как реализована эта функция, но я бы хотел что нибудь подобное.

Некоторые советовали использовать алгоритм Бухбергера для нахождения других полиномов, более простых и красивых. Но увы больше 3 редукций, у меня сделать не получилось, дальше редуцируется в 0. Хотя конечно идеалом было бы получить 3 уравнения 8 степени относительно x y и z и решить их численно.

Есть у кого нибудь идеи или совет, как победить, башка уже не варит просто, слишком сложно. Спасибо заранее.