2016-05-19 14 views
0

私は同時に方程式の系を解こうとしています。方程式自体は、いくつかの変数を持つ関数の勾配を計算することによって求められます。私は次のエラーを取得していますがPythonで関数の微係数を0に設定する

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は(%のEQ2 '%sの解決ができませんでした')上げる" 私はここにコードをされsympyを使用していますこれを解決するのを手伝ってください。または、私は勾配の束を計算し、得られた方程式の系を解くことができる他の方法がありますか?私は数値近似を得ることができ、複数の解が存在する場合でも、1つの解でさえ十分です。

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.(私はあなたがa = b = c解決策ではないものにしたいと思います) 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) 

への呼び出しが可能なソリューションのセットを提供します。それらのいくつかは、彼らがこの導出において無視したgrad要素(の一部)、ゼロ分母に対応することができるという意味で、無効であってもよいこと

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

注。

0

ln(x)の派生語は1/xであり、商規則はf(x)/g(x)が派生語(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)を有する。

あなたの式は対称であるので、私はそれらのすべてを知っている1の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が常に解決策をもたらすことを知っていますが(最初から明確になっています)、もしあれば、他の解決法に到達する方法はわかりません。

+0

私が示しているコードには対称勾配が付いています。だからここで私は(1,1,1)や(2,2,2)のような解決策を探しています。しかし、実際の実装では、私の目的関数は対称ではない勾配を持ちます。だから私はそれらの間の比率を知る必要がある方法で。 – user1434997

+0

私は(あなたが見ることができるように)数学ではそれほど良くないので、私は最後の方程式であなたを助けることはできません。ごめんなさい! – CodenameLambda

関連する問題