在Python中,我们用在特定点OD_H
上的起始点y0 = od0
来求解微分方程z
,类似于以下代码
def OD_H(od, z, c, b):
....
return ....
od = solve_ivp(lambda od, z: OD_H(od, z, c, b), t_span = [z1, z], y0 = [od0])['y'][-1][-1]
或
od = odeint(OD_H, od0, [0, z], args=(c, b))[-1]
所以我们有
answer of ODE OD_H(y0 = 0.69, z=0.153) = 0.59
我的问题是,
现在,如果我有OD_H = 0.59
和y0 = 0.69
的答案,我如何获得z
?应该是0.153
,但请考虑一下我们不知道它的值,并且我们无法反复尝试才能找到它。
感谢您的帮助。
答案 0 :(得分:1)
在这种情况下,您将提出一个根本问题,其中求解器函数的评估结果减去所需的答案就是函数f(x),其中f(x)= 0。
因为ODE求解器返回点数组而不是可调用函数,所以您需要首先对求解点进行插值。然后,将其用于寻根问题。
from scipy.integrate import solve_ivp # Recommended initival value problem solver
from scipy.interpolate import interp1d # 1D interpolation
from scipy.optimize import brentq # Root finding method in an interval
exponential_decay = lambda t, y: -0.5 * y # dy/dt = f(t, y)
t_span = [0, 10] # Interval of integration
y0 = [2] # Initial state: y(t=t_span[0])=2
desired_answer = 0.59
sol_ode = solve_ivp(exponential_decay, t_span, y0) # IVP solution
f_sol_ode = interp1d(sol_ode.t, sol_ode.y) # Build interpolated function
brentq(lambda x: f_sol_ode(x) - desired_answer, t_span[0], t_span[1])