【发布时间】:2019-06-07 06:03:40
【问题描述】:
在 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,但考虑到我们不知道它的价值,我们无法通过反复试验来找到它。
感谢您的帮助。
【问题讨论】:
-
您的目标是导数函数还是解的特定值?有了长长的介绍,我不确定它是否真的是第一个。这两种情况的答案都是“智能试错法”,也称为数值非线性求解器。可以使用 scipy.optimize.fsolve (?)。在第二种情况下也是边界值求解器或solve_ivp的事件机制。
-
@lutzl 我想获得
z。我们有dh/dz,所以我们选择一个z来查找该点的值。现在我有了答案,但我不知道在哪个z。 -
fsolve 需要初步猜测,我设置了
z0=0是的,你需要减去目标值z=scipy.optimze.fsolve(lambda vz: OD_H(y0,vz,c,b)-target, 0)。使用 odeint,您可以计算解决方案并检查它通过给定值的位置,并通过插值进行优化。一种粗略的方法是将 fsolve 应用于lambda vz: odeint(OD_H, y0, [0,vz])[-1,0]-target。这是昂贵的,因为它集成了每个函数调用,而使用solve_ivp的事件机制只需要一个集成。 -
是的,
target是目标值,0.59是问题中唯一给出的值。仍然不完全清楚您到底想要计算什么。您将如何测试求解器返回的值实际上是一个解决方案?鉴于正向问题,更容易确定如何解决正确的逆向问题。 -
这是变量
z的lambda-local值。你不应该需要它,因为它的作用域是 lambda 表达式,它也被声明了。