在python中寻找零交叉

2024-03-29 15:54:09 发布

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

我写了下面的代码来看看t我的ODE“指数衰变”在哪条线上穿过了零线。这是Brent Method。在

odr, hr, dr, cr, m = np.genfromtxt('data.txt',unpack=True)
n=0
with open('RDE_nob_trans.txt', 'w') as d:
  for i in range(len(dr)):
      c = cr[i]
      initp = dr[i]
      exponential_decay = lambda t, y: -(1/(1+t)) * (2 *(1-y)* (-2 + (y/c)) + 3 - 3 * y)
      t_span = [0, 1] # Interval of integration
      y0 = [initp] # Initial state: y(t=t_span[0])=2
      desired_answer = odr[i]
      sol_ode = solve_ivp(exponential_decay, t_span, y0) # IVP solution

      f_sol_ode = interp1d(sol_ode.t, sol_ode.y) # Build interpolated function
      ans = brentq(lambda x: f_sol_ode(x) - desired_answer, t_span[0], t_span[1])
      d.write("{0} {1} {2} {3} {4}\n".format(hr[i], dr[i], cr[i], m[i], ans))

在这段代码中,我们知道起始点initp = dr[i],我们知道微分方程在过零点{}处的值,我们愿意找出在哪一个{}我们有这个答案。没问题,我们通过这个代码得到答案。ans是零交叉处的t。在

我的问题是,如果我们的ODE的答案现在是desired_answer = odr[i]不仅仅是一个数字,而且是t的值,我们该怎么办。在

我的意思是使用odr[i]读取数据文件,然后读取数字。现在我们考虑一下像odr = 0.1 * t, 0.12 *t, 0.23 *t etc.这样的东西,它不是一个数字,是t的函数。在


Tags: 答案代码answerhr数字crodespan
1条回答
网友
1楼 · 发布于 2024-03-29 15:54:09

这不是solve_ivp接口的最有效使用。您可以使用event机制自动获得结果。在

def event(t,y): return y-desired_answer;
event.terminal = True;

sol_ode = solve_ivp(exponential_decay, t_span, y0, events=event) # IVP solution
ans = sol_ode.t[-1]

即使您想使用自己的解算器(或解算器调用),也可以使用密集输出选项获得特定于方法的精确分段多项式插值

^{pr2}$

要获得依赖于时间的函数的根,只需编写时间依赖性的代码,例如

def event(t,y): return y-0.23*t;

或者

ans = brentq(lambda t: f_sol_ode(t) - 0.23*t, t_span[0], t_span[1])

如果您想要可靠的结果,您应该显式地控制公差atol, rtol。在

相关问题 更多 >