2016-05-19 7 views
0

Я пытаюсь одновременно решить систему уравнений. Сами уравнения найдены путем вычисления градиента функции с некоторыми переменными. Я использую SymPy и вот код:Установить производные функции на 0 в Python

from sympy import * 
m = Matrix(symbols('a b c', positive = True)) 

y = 4*log(m[0]) + 4*log(m[1]) + 4*log(m[2]) - 2*log(m[1] + m[2]) \ 
    - 2*log(m[0] + m[2]) - 2*log(m[0] + m[1]) - 6*log(m[0] + m[1] + m[2]) 


s = [diff(y, i) for i in m] 
solve(s,m) 

Однако я получаю следующее сообщение об ошибке: "поднять NotImplementedError ('не смог решить% S' % EQ2)"

Может кто-нибудь помогите мне в решении этого. Или есть другой способ, которым я могу рассчитать кучу градиентов, а затем решить полученную систему уравнений? Я в порядке с получением численного приближения и при наличии нескольких решений даже одного решения будет достаточно.

EDIT Я понимаю, что он цель, что у меня есть в коде, показанном выше, будут иметь симметричные градиенты. Поэтому я ищу решение, подобное (1,1,1) или (2,2,2). Но в реальной реализации моя целевая функция будет иметь градиенты, которые не являются симметричными. Поэтому мне нужно знать соотношение между ними.

ответ

2
import sympy as sp 

# define a vector of variables 
vm = sp.var('m0:3', real = True) 

y = 4*sp.log(vm[0]) + 4*sp.log(vm[1]) + 4*sp.log(vm[2]) - 2*sp.log(vm[1] + vm[2]) \ 
    - 2*sp.log(vm[0] + vm[2]) - 2*sp.log(vm[0] + vm[1]) - 6*sp.log(vm[0] + vm[1] + vm[2]) 

Градиент w.r.t. чтобы vm может быть получен как

grad = [sp.diff(y, i) for i in vm] 

Однако результат представляет собой набор сложных рациональных полиномов, которые не могут быть обработаны с помощью sp.solve(grad, vm). Мы можем помочь solve, выполняя некоторую предварительную обработку уравнений, а именно, факторизующей и учитывая только числитель:

grad_numerators = [sp.numer(sp.diff(y, i).together()).factor() for i in vm] 

Теперь вызов

sp.solve(grad_numerators,vm) 

дает набор возможных решений.

[{m1: -m2, m0: 0}, 
{m0: -m1, m2: 0}, 
{m1: m2, m0: -4*m2/3}, 
{m1: 0, m0: -m2}, 
{m1: -3*m2/4, m0: -3*m2/4}, 
{m1: -4*m2/3, m0: m2}] 

Обратите внимание, что некоторые из них могут быть недействительны в том смысле, что они могут соответствовать нулевому знаменателю (некоторым) grad элементов, которые были проигнорированы в этом выводе.

0

deriviative из ln(x) является 1/x, а правило гласит, что фактор f(x)/g(x) имеет deriviative (g(x)f'(x) - g'(x)f(x))/(g(x)^2). Это результат дериватива log(base, x) (= ln(x)/ln(base)), являющегося (ln(base)/x - 0)/(ln(base)^2) = 1/xln(base). Поэтому alog(base, x) имеет производный a/xln(base).

Ваши формулы симметричны, поэтому я вычислить deriviative одного, чтобы знать все из них:

d/da 4loga + 4logb + 4logc - 2log(b+c) - 2log(a+c) - 2log(a+b) - 6log(a+b+c) = 4/aln(10) + 0 + 0 - 0 - 2/(a+c)ln(10) - 2/(a+b)ln(10) - 6/(a+b+c)ln(10) 
= 2/ln(10)*(2/a - 1/(a+c) - 1/(a+b) - 3/(a+b+c)) 

-> 2/ln(10)*(2/a - 1/(a+c) - 1/(a+b) - 3/(a+b+c)) = 2/ln(10)*(2/b - 1/(b+c) - 1/(a+b) - 3/(a+b+c)) = 2/ln(10)*(2/c - 1/(b+c) - 1/(a+c) - 3/(a+b+c)) | *ln(10)/2; - 3/(a+b+c) 
2/a - 1/(a+c) - 1/(a+b) = 2/b - 1/(b+c) - 1/(a+b) = 2/c - 1/(b+c) - 1/(a+c) | - 1/(a+c) - 1/(a+b) - 1/(b+c) 
2/a + 1/(b+c) = 2/b + 1/(a+c) = 2/c + 1/(a+b) 
-> (2(b+c) + a)/a(b+c) = (2(a+c) + b)/b(a+c) = (2(a+b) + c)/c(a+b) 

Я не знаю, как продолжить. Я просто знаю, что a = b = c всегда дает решение (которое было ясно к началу), но я не знаю, как добраться до других решений, если они есть. (Я думаю, вы хотите, те, которые не a = b = c решения)

+0

Цель, которую я имею в показанном коде, будет иметь симметричные градиенты. Поэтому я ищу решение, подобное (1,1,1) или (2,2,2).Но в реальной реализации моя целевая функция будет иметь градиенты, которые не являются симметричными. Поэтому мне нужно знать соотношение между ними. – user1434997

+0

Я не так хорош в математике (как вы можете видеть), поэтому я никак не могу помочь вам с последним уравнением. Сожалею! – CodenameLambda