Как получить все корни (сложные и действительные) из сложной нелинейной системы, используя python? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь решить сложную нелинейную систему . Проблема в том, что существует много корней, и некоторые из них сложные корни . Из этих корней мне нужно выбрать только ту, у которой действительная часть находится между [0,1] и не имеет сложной части (например, 0,23 + 0i). например:

root1: 1.02 + 2i

root2: 0.23 + 1.23i

root3: 0.23 + 0i

...

Вот моя система: тау1 и тау2 - это переменные, которые мне нужно найти. Уравнения t1 и t2 зависят от tau1 и tau2

x0=0 # initial position
xf=30 # final position
x1= 10;
x2 = 20;
tf=20 # final time

tau_wp=[]
def f(tau_wp):
    tau1, tau2 = tau_wp
    a=(1-tau1)**5*(-10*tau2**3 +15*tau2**4 -6*tau2**5) + (1-tau1)**4*(20*tau2**3 -35*tau2**4 + 15*tau2**5) + (1-tau1)**3*(-10*tau2**3 +20*tau2**4 -10*tau2**5) + (tau2-tau1)**5
    b=(1-tau2)**5*(-10*tau1**3 +15*tau1**4 -6*tau1**5) + (1-tau2)**4*(20*tau1**3 -35*tau1**4 + 15*tau1**5) + (1-tau2)**3*(-10*tau1**3 +20*tau1**4 -10*tau1**5)

    den=a*b -36*tau2**5*(1-tau2)**5*tau1**5*(1-tau1)**5

    p2=(-6*tau1**5*(1-tau1)**5*(xf-x0)*(10*tau2**3-15*tau2**4+6*tau2**5) \
                                         -(xf-x0)*(10*tau1**3-15*tau1**4+6*tau1**5)*a \
                                         + (x1-x0)*a + (x2-x0)*(6*tau1**5*(1-tau1**5)))

    p1=(a*b -36*tau2**5*(1-tau2)**5*tau1**5*(1-tau1)**5)*(-(xf-x0)*(10*tau1**3-15*tau1**4+6*tau1**5) +(x1-x0)) \
                        + b*( (xf-x0)*(10*tau2**3 -15*tau2**4 +6*tau2**5)*(6*tau1**5*(1-tau1)**5) \
                        + (xf-x0)*(10*tau1**3 -15*tau1**4 +6*tau1**5)*a \
                        - (x1-x0)*a - (x2-x0)*(6*tau1**5*(1-tau1)**5))


    u0=(xf-x0)*(30*tau1**2-60*tau1**3 +30*tau1**4)+p1*tf**5/120*(60*tau1**9-270*tau1**8+480*tau1**7-420*tau1**6+180*tau1**5-30*tau1**4) \
           + p2*tf**5/120 * ((1-tau2)**5*(-30*tau1**2 +60*tau1**3 -30*tau1**4) + (1-tau2)**4*(60*tau1**2 - 140*tau1**3 +75*tau1**4) + \
            (1-tau2)**3*(-30*tau1**2 +80*tau1**3 - 50*tau1**4))

    u1=(xf-x0)*(30*tau2**2 - 60*tau2**3 + 30*tau2**4)+p1*tf**5/120*((1-tau1)**5*(-30*tau2**2 +60*tau1**3 -30*tau1**4) + \
        (1-tau1)**4*(60*tau2**2 - 140*tau2**3 +75*tau2**4) + (1-tau1)**3*(-30*tau2**2 +80*tau2**3 - 50*tau2**4) \
        + 5*tau2**4 -20*tau2**3*tau1 +30*tau2**2*tau1**2 -20*tau2*tau1**3 +5*tau1**4) \
        + p2*tf**5/120*(60*tau2**9-270*tau2**8+480*tau2**7-420*tau2**6+180*tau2**5-30*tau2**4)

    ## system of nonlinear equations dependent on tau1 and tau2
    t1=u0*p1 ### equation 1
    t2=u1*p2 ### equation 2

    return [t1,t2]

Я пытался использовать fsolve, но с fsolve я не смог получить сложную часть.

Есть ли способ сделать это в python?

Большое вам спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 апреля 2020

Это немного сбивает с толку, потому что вы говорите, что «не можете получить сложную часть», но в вопросе вы говорите, что вы ищете решения, где мнимая часть равна 0, а величина реальной части находится между 0 и 1. Если это правильно, то nsolve может решить эту пару уравнений, если вы достаточно хорошо начальное предположение:

>>> from sympy import symbols
>>> v = symbols('tau1:3')
>>> nsolve(f(v), (tau1, tau2), (.5,.4))
Matrix([
[0.495387590772031],
[ 0.49736468918969]])

Вы можете получить приблизительное представление о том, где искать корни, посмотрев на значения t1 и t2 для различных значений tau1 и tau2. Поскольку они оба должны быть равны нулю, я смотрю логарифм суммы квадратов - чем меньше, тем лучше:

>>> Matrix(10,10,lambda i,j:
log(sqrt(sum([k.subs(tau1,i/10).subs(tau2,j/10)**2 for k in (t1,t2)]))).round())
Matrix([
[zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo, zoo],
[-17,  -5,  -6,  -3,  -2,  -2,  -3,  -4,  -5,  -7],
[ -7,  -2,  -1,   0,   0,   0,   0,   0,  -1,  -2],
[ -1,   0,   3,   4,   3,   3,   4,   4,   3,   1],
[  3,   4,   6,   7,   6,   4,   7,   7,   6,   4],
[  5,   6,   8,   9,   9,   5,   9,   9,   8,   6],
[  8,   8,  10,  11,  11,   6,  11,  11,  10,   8],
[  9,   9,  11,  12,  12,   7,  12,  12,  11,   9],
[  9,  10,  12,  13,  13,   7,  13,  13,  12,  10],
[  8,  11,  13,  13,  13,   7,  13,  13,  12,  10]])

(Значения зоопарка соответствуют тривиальному решению, когда tau1 равно нулю.

...