数式を解く

Finding unknowns in function from known output using Scipy/Python – StackOverflow

単なるLPだし,SciPyとか要らない(別に非線形方程式として解く必要はないと思う).

計算的に解くなら,numpyを使えばいいし,
せっかくなので,ここではSympyを使いながら考えてみる.

def interimfunc(x,y,z):
    #this is a dummy function - not a part of the actual question but included for completeness.
    #the actual function involves some statistical treatment - but that is not a problem here.
    sol = x*y+z
    return sol


def finalfunc(a, b):
    interimsol1 = interimfunc(0.4,a,b)
    interimsol2 = interimfunc(0.8,a,b)
    finalsol = interimsol1/interimsol2
    return finalsol

質問だけみれば,いまいちよく分からないけど,要はこれを纏めれば,

\frac{0.4 a + b}{0.8 a + b} = c

という式が出てきて,結局これは

a \left(0.8 c - 0.4\right) + b \left(c - 1\right) = 0

を解くという話になる.

まず,「particular value」が既知である場合.例えば,コメント欄にある
‘finalfunc(10,20)’で求まるcは,「28.0 c – 24.0 = 0」なので,
この時「c=6/7」と一意に求まる.これを特定の値と考えると,

「c=6/7」の時,a, bは,

\left [ \left \{ a : 0.5 b\right \}\right ]

となる.a, bについて自然数という条件があれば,

(a, b) = (1, 2), (2, 4), …, (n, 2n) (n ∈ N)

である事が分かる.

cは特定の値を取るが,未知である場合はどう解けるか.
(観測によって求まるがそれまでは分からない場合)

\left [ \left \{ a : \frac{2.5 b \left(- c + 1.0\right)}{2.0 c - 1.0}\right \}\right ]

回答にある例(c=[0.8260869565217391,0.8333333333333334])であれば,
(この値はどうやって求めたんだろうか……なんか逆算の様な気が……)

\left [ \left \{ a : 0.666666666666667 b\right \}\right ]
\left [ \left \{ a : 0.625 b\right \}\right ]

となる.

有理数を小数で表しているので不正確.

Rationalでやり直すと,

a \left(\frac{4 c}{5} - \frac{2}{5}\right) + b \left(c - 1\right) = 0
\left [ \left \{ a : \frac{2 b}{3}\right \}\right ]

できちんと(a, b) = (3n, 2n) (n ∈ N)が求められる事が分かる.
 
 
 
How to solve an equation system in OpenMDAO? – StackOverflow

x*z + z – 4 = 0
y = x + 2*z

The solution is z = 2.666667, y = 5.833333 for x = 0.5.

この式をSympyで解くと,

f = Eq(x * z + z - 4, 0)
g = Eq(x + 2*z, y)
solve([f, g])
\left [ \left \{ x : - \frac{1}{z} \left(z - 4\right), \quad y : \frac{1}{z} \left(2 z^{2} - z + 4\right)\right \}\right ]

z=2.666667で計算してみると,
(x, y) = (0.4999998125000235,5.8333338125000225)

カテゴリー: 未分類 パーマリンク