1

Рассмотрим следующие системы уравнений:Как найти комплексные корни системы многомерной полиномиальное уравнение (Python)

1623.66790917 * x ** 2 + 468.829686367 * x * y + 252.762128419 * y ** 2 + -1027209.42116 * x + -301192.975791 * y + 188804356.212 = 0 

11154.1759415 * x ** 2 + 31741.0229155 * x * y + 32933.5622632 * y ** 2 + -16226174.4037 * x + -26323622.7497 * y + 6038609721.67 = 0 

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

+0

Эти уравнения являются, вероятно, эффективен квартиком уравнения, которое в то время как правило, можно решить символический это предел степени, что в общем случае может быть решена символический. Возможно, вы ищете цифровой метод? – skyking

+0

@skyking Символическое решение, раскрывающее сложные корни, просто приятно. Я попробовал sympy solve_poly_system, но это заняло много времени без решения. – Bahribayli

+0

Вы хотите найти решение * для этой конкретной системы уравнений? Но вы уже это знаете. Предположительно, вы имеете в виду некоторый класс систем уравнений. Какой класс? – strubbly

ответ

1

Вы можете решить эти уравнения численно, используя mpmath findroot(). Насколько я знаю, нет способа рассказать findroot(), чтобы найти несколько корней, но мы можем обойти это ограничение: сначала найдите пару решений (xa, ya), затем разделите уравнения на (x - xa) * (y - ya). Вам нужно предоставить исходное приблизительное решение, но мне удалось найти что-то, что работало только в нескольких попытках.

from mpmath import mp 

mp.dps = 30 
prec = 20 

f_1 = lambda x, y: 1623.66790917 * x ** 2 + 468.829686367 * x * y + 252.762128419 * y ** 2 + -1027209.42116 * x + -301192.975791 * y + 188804356.212 

f_2 = lambda x, y: 11154.1759415 * x ** 2 + 31741.0229155 * x * y + 32933.5622632 * y ** 2 + -16226174.4037 * x + -26323622.7497 * y + 6038609721.67 

def solve(f1, f2, initxy): 
    return mp.findroot([f1, f2], initxy, solver='muller') 

def show(x, y): 
    print 'x=', mp.nstr(x, prec) 
    print 'y=', mp.nstr(y, prec) 
    print mp.nstr(f_1(x, y), prec) 
    print mp.nstr(f_2(x, y), prec) 
    print 

f1a = f_1 
f2a = f_2 
xa, ya = solve(f1a, f2a, (240+40j, 265-85j)) 
show(xa, ya) 

f1b = lambda x, y: f1a(x, y)/((x - xa) * (y - ya)) 
f2b = lambda x, y: f2a(x, y)/((x - xa) * (y - ya)) 
xb, yb = solve(f1b, f2b, (290+20j, 270+30j)) 
show(xb, yb) 

выход

x= (246.82064795986653023 + 42.076841530787279711j) 
y= (261.83565021239842638 - 81.555049135736951496j) 
(0.0 + 3.3087224502121106995e-24j) 
(0.0 + 0.0j) 

x= (289.31873055121622967 + 20.548128321524345062j) 
y= (272.23440694481666637 + 29.381152413744722108j) 
(0.0 + 3.3087224502121106995e-24j) 
(0.0 + 0.0j) 
+0

Спасибо за решение и образец кода. Когда я прокомментировал ОП, я хочу найти все четыре решения для системы уравнений, состоящие из двух уравнений для двух коник. Эти коники являются копланарными кругами под проективной гомографией. Пара решений представляет собой изображение круговой точки (ICP) под гомографией. Как упоминалось в OP, у меня нет хорошей оценки для начала. Я ищу более общий подход, который автоматически решает систему уравнений. – Bahribayli

+1

@Bahribayli: Ну, да, придумать хорошие начальные оценки непросто. :) Если вы можете создавать пары параметрических уравнений для этих коник, тогда вы можете легко создавать списки точек на кривых и затем искать приблизительные совпадения в списках; по существу рисуя кривые в CxC и ища точки, где они пересекаются. OTOH, вы можете получить приемлемые результаты, просто используя случайно созданные точки, находящиеся в области плоскости CxC, покрытой конами. –

Смежные вопросы