Решить ограниченную задачу оптимизации с помощью символического числа переменных, используя SymPy - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь решить проблему минимизации с использованием SymPy. Для фиксированного числа переменных, скажем, w1, w2, я могу сделать это следующим образом:

from sympy import *

w1, w2 = var('w1, w2', real = True)
n1, n2 = symbols('n1, n2', integer = True)
p1, p2 = symbols('p1, p2', real = True)
f = w1**2 / (n1 * p1) + w2**2 / (n2 * p2)
g = w1 + w2 - 1

lam = symbols('lambda', real = True)
L = f - lam * g

gradL = [diff(L, c) for c in [w1, w2]]
KKT_eqs = gradL + [g]

stationary_points = solve(KKT_eqs, [w1, w2, lam], dict = True)

Можем ли мы решить эту проблему для переменного числа, скажем, k,переменных? Я пробовал следующее:

from sympy import *

i = symbols('i', cls = Idx)
k = symbols('k', integer = True)

w = IndexedBase('w', real = True)

n = IndexedBase('n', integer = True)
p = IndexedBase('p', real = True)

f = summation(w[i]**2 / (n[i] * p[i]), (i, 1, k))
g = summation(w[i], (i, 1, k)) - 1

lam = symbols('lambda', real = True)
L = f - lam * g

Однако я не смог понять, как мне принять оставшуюся часть кода.

(я новичок в pythonпоэтому, пожалуйста, потерпите меня.)

1 Ответ

0 голосов
/ 27 октября 2019

Одна вещь, которую вы можете сделать, это искать шаблон в конкретных случаях:

>>> from sympy import *
... from sympy.abc import i
... w = IndexedBase('w')
... np = IndexedBase('np')
... lam = symbols('lambda', real = True)
... def go(n):
...  ww = [w[i] for i in range(n)]
...  f = Add(*[wi**2/np[i] for i,wi in enumerate(ww)])
...  g = Add(*ww) - 1
...  L = f - lam * g
...  gradL = [diff(L, c) for c in ww]
...  KKT_eqs = gradL + [g]
...  return solve(KKT_eqs, ww + [lam], dict = True)
>>> go(2)
[{lambda: 2/(np[0] + np[1]), w[0]: np[0]/(np[0] + np[1]), w[1]: np[1]/(np[0] + np[1])}]
>>> go(3)
[{lambda: 2/(np[0] + np[1] + np[2]), w[0]: np[0]/(np[0] + np[1] + np[2]), w[1]: np[1]/(np[0] + np[1] + np[2]), w[2]: np[2]/(np[0] + np[1] + np[2])}]

Примечание: поскольку n[i]*p[i] всегда появляются вместе, эти две переменные были объединены в одну. Вы видите образец решений? Попробуйте go(4), если вы этого не сделаете.

Чтобы обобщить без конкретного понимания, вы могли бы что-то сделать с MatrixExpr.

...