反向使用Python解决ODE

时间:2019-01-12 16:10:35

标签: python ode

在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.59y0 = 0.69的答案,我如何获得z?应该是0.153,但请考虑一下我们不知道它的值,并且我们无法反复尝试才能找到它。

感谢您的帮助。

1 个答案:

答案 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])