2016-05-19 44 views
0

Ich versuche, ein Gleichungssystem gleichzeitig zu lösen. Die Gleichungen selbst werden gefunden, indem der Gradient einer Funktion mit einigen Variablen berechnet wird. Ich verwende sympy und hier ist der Code:Setze Ableitungen einer Funktion auf 0 in 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) 

Jedoch habe ich die folgende Störung erhalte: "NotImplementedError erhöhen (% EQ2 '% s konnte nicht lösen')"

Kann jemand Bitte hilf mir, das zu lösen. Oder gibt es einen anderen Weg, auf dem ich ein paar Gradienten berechnen und dann das erhaltene Gleichungssystem lösen kann? Mir geht es gut mit einer numerischen Approximation und wenn mehrere Lösungen vorhanden sind, wird sogar eine Lösung ausreichen.

EDIT Ich verstehe, dass er Ziel, das ich in dem Code habe über symmetrische Gradienten gezeigt hat. Hier suche ich nach einer Lösung wie (1,1,1) oder (2,2,2). Aber in der tatsächlichen Implementierung wird meine Zielfunktion Gradienten haben, die nicht symmetrisch sind. In gewisser Weise muss ich das Verhältnis zwischen ihnen kennen.

Antwort

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]) 

Der Gradient w.r.t. zu vm als

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

Allerdings ist das Ergebnis einer Reihe von komplizierten rationalen Polynome, die durch sp.solve(grad, vm) nicht behandelt werden können. Wir können solve helfen, indem sie eine Vorverarbeitung auf den Gleichungen durchgeführt wird, nämlich, Faktorisierung und unter Berücksichtigung nur der Zähler:

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

Jetzt ein Aufruf an

sp.solve(grad_numerators,vm) 

gibt eine Reihe von möglichen Lösungen.

[{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}] 

Beachten Sie, dass einige von ihnen im Sinne ungültig sein können, dass sie auf einen Null Nenner für (einige) die grad Elemente entsprechen, das in dieser Ableitung ignoriert wurde.

0

Die Ableitung von ln(x) ist 1/x, und die Quotientenregel besagt, dass f(x)/g(x) die derivative (g(x)f'(x) - g'(x)f(x))/(g(x)^2) hat. Dies führt dazu, dass die Ableitung log(base, x) (= ln(x)/ln(base)) (ln(base)/x - 0)/(ln(base)^2) = 1/xln(base) ist. Daher hat alog(base, x) die derivative a/xln(base).

Ihre Formeln sind symmetrisch, so dass ich berechnen die deriviative eines alle von ihnen zu wissen:

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) 

Ich weiß nicht, wie es weitergeht. Ich weiß nur, dass a = b = c immer eine Lösung liefert (was von Anfang an klar war), aber ich weiß nicht, wie ich zu den anderen Lösungen kommen soll, wenn es welche gibt. (Ich würde vermuten, Sie diejenigen wollen, die nicht a = b = c Lösungen)

+0

Das Ziel, das ich in dem Code gezeigt habe, wird symmetrische Gradienten haben. Hier suche ich nach einer Lösung wie (1,1,1) oder (2,2,2).Aber in der tatsächlichen Implementierung wird meine Zielfunktion Gradienten haben, die nicht symmetrisch sind. In gewisser Weise muss ich das Verhältnis zwischen ihnen kennen. – user1434997

+0

Ich bin nicht so gut in Mathematik (wie Sie sehen können), also kann ich Ihnen mit der letzten Gleichung sowieso nicht helfen. Es tut uns leid! – CodenameLambda