2015-05-21 5 views
0

Я видел это amazing example. Но мне нужно решить систему с границами на X и F, например:Scipy - система нелинейных уравнений с линейными ограничениями (новичок)

f1 = x+y^2 = 0 
    f2 = e^x+ xy = 0 
-5.5< x <0.18 
2.1< y < 10.6 
    # 0.15< f1 <20.5 - not useful for this example 
    # -10.5< f2 < -0.16 - not useful for this example 

Как я мог установить эту границу ограничивает для fsolve() из SciPy? Или может быть какой-то другой метод? Не могли бы вы дать мне простой пример кода?

+0

Как вы можете решить для 'f1 = 0', когда есть ограничение' f1> 0,15'? – cfh

+0

Google: нелинейная оптимизация Scypy & constraint. Используйте, например, scipy.optimize.minimize – Moritz

+0

Уважаемый @Moritz, конечно, я искал свой вопрос в Google, прежде чем я спросил Тебя. Но для меня не было полезного решения, которое я мог бы понять. Поэтому я попросил у вас простой пример. – Fruitty

ответ

1

Это зависит от системы, но здесь вы можете просто проверить ограничения после этого.

Сначала решите свою нелинейную систему, чтобы получить одно/не-несколько решений формы (x, y). Затем проверьте, какие из них, если таковые имеются, удовлетворяют ограничениям.

+0

Да, я тоже думал об этом. И, наверное, это может быть самый простой способ. – Fruitty

2

Я надеюсь, что это послужит вам стартером. Это было все there.

import numpy as np 
from scipy.optimize import minimize 

def my_fun(z): 
    x = z[0] 
    y = z[1] 

    f = np.zeros(2) 
    f[0] = x + y ** 2 
    f[1] = np.exp(x) + x * y 
    return np.dot(f,f) 

def my_cons(z): 
    x = z[0] 
    y = z[1] 
    f = np.zeros(4) 
    f[0] = x + 5.5 
    f[1] = 0.18 - x 
    f[2] = y - 2.1 
    f[3] = 10.6 - y 
    return f 

cons = {'type' : 'ineq', 'fun': my_cons} 
res = minimize(my_fun, (2, 0), method='SLSQP',\ 
      constraints=cons) 
res 

status: 0 success: True njev: 7 nfev: 29 fun: 14.514193585986144 x: array([-0.86901099, 2.1 ]) message: 'Optimization terminated successfully.' jac: array([ -2.47001648e-04, 3.21871972e+01, 0.00000000e+00]) nit: 7

EDIT: В ответ на замечания: Если функция значения f1 и f2 не обнулить вы просто должны переписать уравнения например:

f1 = -6 и f2 = 3

Ваша функция для минимизации будет:

def my_fun(z): 
    x = z[0] 
    y = z[1] 

    f = np.zeros(2) 
    f[0] = x + y ** 2 + 6 
    f[1] = np.exp(x) + x * y -3 
    return np.dot(f,f) 
+0

Но это делает минимизацию, OP хочет решить систему уравнений. Как это помогает? – cfh

+0

И что? Возможно, я не понимаю концепцию решения системы уравнений, но он хотел бы найти значения для x и y, которые выполняют ограничения, и система должна быть сведена к минимуму. F [0] = 0 и f [1] = 0' , Вы можете написать каждую систему уравнений так, чтобы остаточный результат был равен нулю. – Moritz

+0

Почему вы считаете, что (0,0) является минимумом системы? Значения f1 и f2 могут стать отрицательными. – cfh

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

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