下面请我认为你应该求解非线性方程组的实际问题。此代码应解决两个方程的情况下,你的问题有两个已知的解决方案(当然你可以扩展它):
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
和毁掉一个优化过程。所以猜测值应该非常仔细地提出。
你必须先做一些阅读。 'a,b'是函数'finalfunc'的参数。当你调用该函数以便能够计算并返回输出“finalsol”时,你必须提供它们。如果你想倒转过程并从'finalsol'转到'a'和'b',你必须首先进行数学运算。 –
在我看来,无论你提供什么'a'和'b','finalsol'总是0.5。而且我不是数学家。这意味着产生它们的函数不是*可逆的*。所以你不能。如果你简化它,它归结为'finalsol = 0.4 * a * b /(0.8 * a * b)',这是'finalsol = 0.4/0.8 = 0.5' –
在您当前的代码中,finalSol值= 0.5? –