Как решить нелинейную систему за Python - PullRequest
2 голосов
/ 30 мая 2020

У меня есть три разных трехмерных уравнения, и я хочу получить пересечение между ними (решение системы). Мои переменные: x, y, z

Уравнения:

-0.006683 x**2 - 0.06893 x + 56.73- z = 0
0.002538 y**2 - 1.115 y + 56.73 - z = 0
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2 = 12.580**2

Как я могу решить эту нелинейную систему в python?

1 Ответ

1 голос
/ 30 мая 2020

Если вы переписываете функции:

-0.006683 x**2 - 0.06893 x + 56.73- z = 0
0.002538 y**2 - 1.115 y + 56.73 - z = 0
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2 - 12.580**2 = 0

, это немного помогает.

У вас есть три уравнения и три неизвестных.

Перебор Метод силы - это от l oop до значений x, y и z (в некоторой области x, y и z) и посмотреть, насколько близки все уравнения к нулю.

fa = -0.006683 x**2 - 0.06893 x + 56.73- z
fb = 0.002538 y**2 - 1.115 y + 56.73 - z
fc = (x-24.680)**2+(y-238.341)**2+(z+13.971)**2 - 12.580**2

Используйте 'функция стоимости', например cost = fa * fa + fb * fb + f c * f c, и ищите минимум.

Существуют и другие методы, такие как метод Нелдера-Мида, которые можно использовать, и они более эффективны. https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method

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

@ warped дает более приятное, более подходящее решение Pythoni c, однако всегда есть вероятность, что существует no решение или несколько решений. Кстати, это проблема геометрии? Последнее уравнение выглядит как уравнение сферы.

from scipy.optimize import fsolve
import math

def equations(p):
    x, y, z = p
    return (-0.006683 * x*x - 0.06893 * x + 56.73- z, \
            0.002538 * y*y - 1.115 * y + 56.73 - z, \
          (x-24.680)**2+(y-238.341)**2+(z+13.971)**2-12.580**2)

x, y, z =  fsolve(equations, (1,1,1))

print (equations((x,y,z)))

print(x,y,z)

Используя метод, указанный в этом вопросе с использованием SymPy (на который подробно ответил @Oscar Benjamin), Как решить пару нелинейных уравнения, используя Python?

, вы можете найти другие решения другим способом. Однако этот метод не нашел никаких решений, по крайней мере, с моим первым ударом по нему.

from sympy import *

x, y, z = symbols('x, y, z')
eq1 = Eq(-0.006683 * x * x - 0.06893 * x + 56.73- z, 0)
eq2 = Eq(0.002538 * y * y - 1.115 * y + 56.73 - z, 0)
eq3 = Eq((x-24.680)**2+(y-238.341)**2+(z+13.971)**2-12.580**2, 0)

sol = solve([eq1, eq2, eq3], [x, y,z])


print(sol)
print("")
if(len(sol)>1):
    soln = [tuple(v.evalf() for v in s) for s in sol]
    for idx, each in enumerate(soln):
        print(idx,each)
...