Python scipy fsolve для решения большого числа нелинейных уравнений - PullRequest
2 голосов
/ 19 июня 2019

Я хочу решить систему из 6 нелинейных уравнений, используя Python.Я обнаружил, что довольно легко могу использовать scipy fsolve для решения системы из 3 нелинейных уравнений.Однако, когда я расширяю это до более крупной системы, я обнаруживаю, что решение не решает систему уравнений.Есть ли что-то, что я могу исправить, что позволит решить 6 нелинейных уравнений?

import numpy as np
from scipy.optimize import fsolve

def system(z):
   #arbitrary system of 3 nonlinear equations
   x1 = z[0]
   x2 = z[1]
   x3 = z[2]

   F = np.empty((3))
   F[0] = 20* x1 + x2**2
   F[1] = x2 - x1
   F[2] = x3 + 5 - x1*x2

   return F

def system2(z):
   #arbitrary system of 6 nonlinear equations
   x1 = z[0]
   x2 = z[1]
   x3 = z[2]
   x4 = z[3]
   x5 = z[4]
   x6 = z[5]

   F = np.empty((6))
   F[0] = 20* x1 + x2**2
   F[1] = x2 - x1
   F[2] = x3 + 5 - x1*x2
   F[3] = x3 + x2
   F[4] = x5 + x4**2
   F[5] = x6**2 + x1 - 20

   return F

uInitial = np.array([1,1,1])
u = fsolve(system,uInitial)
print('Solution: ',u)
print('Solution check: ',system(u),'\n') #yields zeros as expected

vInitial = np.array([1,1,1,1,1,1])
v = fsolve(system2,vInitial)
print('Solution: ',v)
print('Solution check: ',system2(v)) #unexpectedly does not yield zeros. Equations not solved correctly.

При применении данного решения обратно в систему уравнений, я должен ожидать получить нули (или почти ноль).Это подтвердило бы, что вычисленное решение решает данную систему уравнений.Я попытался проверить с помощью этого метода как для системы из 3 уравнений, так и для системы из 6 уравнений, но только система из 3 уравнений решается правильно с помощью этой проверки.Что я могу сделать, чтобы решить систему из 6 нелинейных уравнений?

1 Ответ

0 голосов
/ 19 июня 2019

Ваша система противоречива, и ваше первоначальное предположение неверно. Попробуйте добавить четвертое уравнение к первой системе из трех уравнений:

F[0] = 20 * x1 + x2**2  # "first" equation
F[1] = x2 - x1  # "second" (=> x1 == x2)
F[2] = x3 + 5 - x1*x2  # "third"
F[3] = x3 + x2  # "fourth" equation (=> x3 == -x2)

Сначала давайте решим первые три уравнения. Из второго уравнения следует, что x1 равно x2. Поэтому первое уравнение можно переписать так:

F[0] = 20 * x1 + x1**2

, что приводит к x1 = -20x2 = -20). Использование этого в третьем уравнении приводит к x3 = 395. Попробуйте изменить начальные условия для первой системы на uInitial = np.array([-30, -30, 1]) - вы должны получить правильный ответ.

Теперь давайте решим все четыре уравнения. Третье уравнение, используя тот факт, что x2 == x1, можно переписать как:

F[2] = x3 + 5 - x1**2

Из четвертого уравнения следует, что x3 == -x2 (и так же x3 == -x1). Следовательно, это уравнение можно переписать как x3 + 5 - x3**2 == 0 => x3 = 0.5 +(-) sqrt(21)/2, что отличается от 395, который мы получили выше, используя первые три уравнения.

Это показывает, что у вас есть противоречивая система уравнений, которая не имеет решения.

...