2017-09-06 85 views
-3

我有以下python函数需要输入a和b。使用Scipy/Python从已知输出中查找未知函数

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 

如果finalsol是已知的值。 如何通过求解非线性方程组来找出未知数“a”和“b”?

===

我在发帖之后得到4票回应。我是一名机械工程师和学习计算机科学。我曾尝试在互联网上进行研究,但需要改进我的搜索 - 因此我在这里向专家提出了一个问题。

===

除了上面的公式 - 还有一个信息:

interimsol2 = interimfunc(0.8,a,b) 

其中interimsol2 = 10 #i.e. known value 我们如何inclde我们未知的发现这个新的信息?

===

由@SergeyIvanov

def func(mu, sigma): 
    tenpercent = st.norm.ppf(2, mu, sigma) 
    ninetypercent = st.norm.ppf(2, mu, sigma) 
    rfs = tenpercent/ninetypercent 
    return rfs 
+0

你必须先做一些阅读。 'a,b'是函数'finalfunc'的参数。当你调用该函数以便能够计算并返回输出“finalsol”时,你必须提供它们。如果你想倒转过程并从'finalsol'转到'a'和'b',你必须首先进行数学运算。 –

+2

在我看来,无论你提供什么'a'和'b','finalsol'总是0.5。而且我不是数学家。这意味着产生它们的函数不是*可逆的*。所以你不能。如果你简化它,它归结为'finalsol = 0.4 * a * b /(0.8 * a * b)',这是'finalsol = 0.4/0.8 = 0.5' –

+0

在您当前的代码中,finalSol值= 0.5? –

回答

1

下面请我认为你应该求解非线性方程组的实际问题。此代码应解决两个方程的情况下,你的问题有两个已知的解决方案(当然你可以扩展它):

from scipy.optimize import fsolve 

known_values = [3,5] 

def interimfunc(x,y,z): 
    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 

def equations(p): 
    a, b = p 
    return (finalfunc(a,b) - known_values[0], # finalfunc(a,b) == solution1 
      finalfunc(a,b) - known_values[1]) # finalfunc(a,b) == solution2 

a, b = fsolve(equations, (1, 1))# solution 
print(a,b) 
# -6192.07497308 5779.26987919 

print(equations((a, b))) 
# (1.0000003476651482, -0.99999965233485177) <-- bad convergence beacause there is no free paremeter in finalfunc. 

但它仅与平等known_values的作品,那是没有意义的(解决方案将是一个随机组合a和b)。问题是你应该有一些东西来区分两个方程式finalfunc(例如附加参数),因为你可以通过不同的参数获得不同的解决方案。所以最后你应该有这样的事情:

from scipy.optimize import fsolve 

def interimfunc(x,y,z): 
    sol = x*y+z 
    return sol 

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


known_values = [0.8260869565217391,0.8333333333333334] 


def equations(p): 
    a, b = p 
    return (finalfunc(a,b,0) - known_values[0], # finalfunc(a,b,c) == solution1 
      finalfunc(a,b,1) - known_values[1]) # finalfunc(a,b,c) == solution2 


a, b = fsolve(equations, (1, 1))# solution 
print(a,b) 
print(equations((a, b))) 
# 10.0 15.0 <-- correct values 
# (4.4408920985006262e-16, 2.2204460492503131e-16) <-- good convergence 

对于最后一个例子:

from scipy.optimize import fsolve 
import scipy.stats as st 

def equations(p): 
    mu, sigma = p 
    tenpercent = st.norm.ppf(2, mu, sigma) 
    ninetypercent = st.norm.ppf(2, mu, sigma) 
    return (ninetypercent - 500, 
      tenpercent/ninetypercent - 1.0) 

mu, sigma = fsolve(equations,x0=(100, 10))# solution 
print("mu, sigma:",mu, sigma) 
print(equations((mu, sigma))) 

的这里的问题是,ppf可以产生nan和毁掉一个优化过程。所以猜测值应该非常仔细地提出。

+0

'finalsol'我们是什么值假设在第二个解决方案? –

+0

我自己解决了这个问题,'0'的'0.8260869565217391'和'1'的'0.8333'。但是'2'的值发生了变化...我们必须重新考虑如何解决这个问题。同时 - 这是MathCad正在做的事情:http://engr.bd.psu.edu/forsman/metbd_050/Assignments/Mathcad%20-%20Explanation_of_Find.pdf –

+0

我使用了第一种解决方案 - 但它需要一个很好的在行 'a,b = fsolve(equation,(1,1))#solution' 中猜测代替'(1,1)'的另一个观察结果是 - 它给出了多个紧密的问题解决方案,而不是精确的回答。 –