2015-06-16 5 views
0

У меня есть система нелинейных уравнений, где можно Choosed любой п, поэтому длина вектора х = (x1, ..., хп) могут быть разными. Например, система может быть как то:SciPy - Все решения нелинейных уравнений системы

f1(x1,...,xn) = sum(xi + xi^2) = 0, i={1,n} 
    f2(x1,...,xn) = sum(e^xi + xi + sin(xi*pi)) = 0, i={1,n} 

Согласно this example, я использую fsolve() из SciPy библиотеки для решения такой NLE, но он возвращает только одно решение для каждого начального приближения * х = х0 , Но так как n может быть большим (например, n = 100), и может быть много решений, поэтому нецелесообразно делать начальные условия x = x0 для нахождения каждого решения.

Так что, пожалуйста, не могли бы вы дать мне пример, как найти Всех решения от fsolve() в такой ситуации? Или любым другим простым способом?

Дополнительного Например, я folloving простой системы:

def equations(p): 
    x, y = p 
    return (x**2-1, x**3-1) 

С различным исходным condiotions я имею разные решения: х, у = fsolve (уравнения, (0, 0)) (0,0, 0,0)

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

x, y = fsolve(equations, (-1, 1)) 
(-0.47029706057873205, 0.41417128904566508) 

можно использовать любую SciPy-функцию, как fsolve(), чтобы ц Все решения (корни), например: x, y = some_scipy_solver (уравнения, (x0, y0)) 1. (1.0, 1.0) 2. (0.0, 0.0) 3. (-0.47029706057873205, 0.41417128904566508) ...

где (x0, y0) = любое начальное приближение: (0, 0), (1, 1), (- 1, 1), (0,1, 10,0) и т. Д., И где I определите только ограничения для x0, y0, например: -1.0 < = x0 < 1.0, 0.0 < = x0 < 11.0.

+0

P.S.Я уже реализовал системы функций, которые мне нужны, например и модуль для решения этих систем с помощью fsolve (sys1, x0). Поэтому было бы очень полезно, если вы дадите мне пример с fsolve(), а также с помощью метода, который может просто заменить fsolve ((f1, f2), x0) или fsolve ([f1, f2], x0). – Fruitty

ответ

1

Может быть сложно (или невозможно) найти численно все решения даже для одного нелинейного уравнения, пусть вдоль системы. Например, рассмотрим уравнение,

sin(1/x) = 0 

, который имеет бесконечное число решений в интервале [0, 1]: вы не можете решить эту проблему с типовыми алгоритмами корневых ознакомительной.

В частности, scipy.optimize.fsolve использует локальные подходы оптимизации, чтобы найти одно решение данного уравнения. Понятно, что вы не можете использовать его (или что-нибудь еще в модуле scipy, действительно), чтобы найти все возможные решения. Конечно, если вы знаете, что система имеет определенное количество решений, вы можете просто случайно установить начальные условия на fsolve (как вы это сделали), пока не найдете их все. Однако нет общего метода, который бы работал для этой проблемы.

Вместо этого вам может быть повезло с решением вашей системы аналитически с sympy, если это достаточно просто.

+1

Я уже слышал о sympy, и я пробовал sympy.nsolve, который работал так же, как fsolve от scipy. Так что теперь я должен попытаться использовать sympy.solve, спасибо за совет! Как я понял, sympy.solve не дает численные решения (только аналитические функции как корень), не так ли? – Fruitty

+0

Да, вы правы. 'sympy.solve' возвращает аналитические корни и должен дать вам все решения. – rth

+0

К сожалению, аналитические корни как ___x1 = f (x2) ___ не поддерживают мои потребности. Мне нужно только численное решение - конечный результат, который я хочу получить, должен быть графовым графиком ___ f1 (x1, ..., xn) = F (f2 (x1, ..., xn)) ___. Итак, я просто хочу получить множество точек _ (x1, ..., xn) [1], ..., (x1, ..., xn) [m] _, решаемых численно, и график набора точек _ (f1 (x1, ..., xn) [1], f2 (x1, ..., xn) [1]), ..., (f1 (x1, ..., xn) [m], f2 (x1, ..., хп) [м]) _. – Fruitty

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

  • Нет связанных вопросов^_^