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
質問だけみれば,いまいちよく分からないけど,要はこれを纏めれば,
という式が出てきて,結局これは
を解くという話になる.
まず,「particular value」が既知である場合.例えば,コメント欄にある
‘finalfunc(10,20)’で求まるcは,「28.0 c – 24.0 = 0」なので,
この時「c=6/7」と一意に求まる.これを特定の値と考えると,
「c=6/7」の時,a, bは,
となる.a, bについて自然数という条件があれば,
(a, b) = (1, 2), (2, 4), …, (n, 2n) (n ∈ N)
である事が分かる.
cは特定の値を取るが,未知である場合はどう解けるか.
(観測によって求まるがそれまでは分からない場合)
回答にある例(c=[0.8260869565217391,0.8333333333333334])であれば,
(この値はどうやって求めたんだろうか……なんか逆算の様な気が……)
となる.
有理数を小数で表しているので不正確.
Rationalでやり直すと,
できちんと(a, b) = (3n, 2n) (n ∈ N)が求められる事が分かる.
How to solve an equation system in OpenMDAO? – StackOverflow
x*z + z – 4 = 0
y = x + 2*zThe 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])
z=2.666667で計算してみると,
(x, y) = (0.4999998125000235,5.8333338125000225)