使用Scipy/Python从已知输出中查找函数中的未知项

2024-10-03 02:38:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下python函数需要输入a和b

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 我们如何在未知的发现中包含这些新信息?你知道吗

===

@SergeyIvanov要求的实际问题

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

Tags: thereturnisdefnotfunctionsigmabut
1条回答
网友
1楼 · 发布于 2024-10-03 02:38:55

我认为你应该解一个非线性方程组。对于两个已知解的两个方程,这段代码应该可以解决您的问题(当然您可以扩展它):

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.

但它只适用于相同的已知值,这是毫无意义的(解决方案将是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并破坏优化过程。所以猜测值应该非常谨慎地提出。你知道吗

相关问题 更多 >