Scipy - Система нелинейных уравнений с линейными ограничениями (новичок)

Я видел этот потрясающий пример. Но мне нужно решить систему с границами по X и F, например:

    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? Или может быть есть какой-то другой метод? Не могли бы вы дать мне простой пример кода?


person Fruitty    schedule 21.05.2015    source источник
comment
Как можно найти f1 = 0 при наличии ограничения f1 > 0.15?   -  person cfh    schedule 21.05.2015
comment
Google: нелинейная оптимизация Scipy и ограничений. Используйте, например, scipy.optimize.minimize   -  person Moritz    schedule 21.05.2015
comment
Уважаемый @Moritz, конечно, я искал свой вопрос в Google, прежде чем задать Вам. Но для меня не было полезного решения, которое я смог бы понять. Поэтому я попросил Вас привести простой пример.   -  person Fruitty    schedule 22.05.2015
comment
@Moritz, И, наверняка, я посмотрел страницу scipy.optimize, но в чем разница между .minimize и .fsolve? Похоже, что .minimize предназначен для задачи типа F=(f1,f2,..)-›min (то есть больше похоже на (df/dx=0)), а не для систем уравнений, как представлено выше. Как использовать .minimize для систем, отличных от LAE?   -  person Fruitty    schedule 22.05.2015
comment
@cfh, спасибо, я просто думал о своей собственной системной проблеме и не подумал, что этот простой пример не нуждается в каких-либо ограничениях, потому что это проблема f (x) = const.   -  person Fruitty    schedule 22.05.2015


Ответы (2)


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

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

person cfh    schedule 21.05.2015
comment
Да, я тоже об этом тоже думал. И, думаю, это может быть самый простой способ. - person Fruitty; 22.05.2015

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

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

РЕДАКТИРОВАТЬ: В ответ на комментарии: если значения вашей функции 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)
person Moritz    schedule 22.05.2015
comment
Но это минимизация, ОП хочет решить систему уравнений. Как это помогает? - person cfh; 22.05.2015
comment
Ну и что ? Может быть, я не понимаю концепции решения системы уравнений, но он хотел бы найти значения для x и y, которые удовлетворяют ограничениям, и система явно должна быть минимизирована f[0] = 0 and f[1] = 0. Вы можете написать любую систему уравнений так, чтобы невязка была равна нулю. - person Moritz; 22.05.2015
comment
Как вы думаете, почему (0,0) является минимумом системы? Значения f1 и f2 могут стать отрицательными. - person cfh; 22.05.2015
comment
Он написал f1=0 и f2=0 - person Moritz; 22.05.2015
comment
Вы ничего не выиграете, переписав ее как задачу оптимизации с ограничениями: если оптимизация достигает 0 (чего в вашем случае нет), то вы нашли решение, но ограничения не активны, и вы могли бы просто решить уравнение без ограничений в любом случае. Если вы не достигли 0, вы не нашли решение. - person cfh; 22.05.2015
comment
Давайте продолжим обсуждение в чате. - person Moritz; 22.05.2015