我有一个等式,如下:
R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) = 0
。
我想使用numpy中可用的数值解算器在此等式中求解tau
。最好的方法是什么?
此公式中R
和a
的值因此公式的不同实现而有所不同,但在要为tau求解时固定为特定值。
答案 0 :(得分:38)
在传统的数学符号中,你的等式是
SciPy fsolve
函数搜索给定表达式等于零的点("零"或"根"表达式)。您需要向fsolve
提供一个初步猜测,即""附近"你想要的解决方案找到这样一个初始猜测的好方法是只绘制表达式并寻找零交叉。
#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
# Define the expression whose roots we want to find
a = 0.5
R = 1.6
func = lambda tau : R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau)))
# Plot it
tau = np.linspace(-0.5, 1.5, 201)
plt.plot(tau, func(tau))
plt.xlabel("tau")
plt.ylabel("expression value")
plt.grid()
plt.show()
# Use the numerical solver to find the roots
tau_initial_guess = 0.5
tau_solution = fsolve(func, tau_initial_guess)
print "The solution is tau = %f" % tau_solution
print "at which the value of the expression is %f" % func(tau_solution)
答案 1 :(得分:9)
您可以将等式重写为
a
和非零R
,您将在复杂空间中获得a
个解决方案; a=0,1,...4
有分析解决方案(参见here); 因此,一般来说,您可能有一个,多个或没有解决方案,其中一些或全部可能是复杂的值。您可以轻松地将scipy.root
投入此等式,但没有数值方法可以保证找到所有解。
要在复杂的空间中解决:
import numpy as np
from scipy.optimize import root
def poly(xs, R, a):
x = complex(*xs)
err = R * x - x + 1 - R
return [err.real, err.imag]
root(poly, x0=[0, 0], args=(1.2, 6))