Python 个最大参数

Python arguments for maximum

我有这个代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

def rownanie(Y, t, l, q, a, u):
    y1, y2, z1, z2 = Y
    dydt = [y2, ((l*q)/a)*(1/y1)*(1-z2*u), z2, (a*y2*u)/y1]
    return dydt

l = 100
q = 1
a = 10
u = 0.25

y0 = -1
z0 = 0
y0_prim, z0_prim = 0, 0  
t = np.linspace(0, 100, 10001)
sol = odeint(rownanie, [y0, y0_prim, z0, z0_prim], t, args=(l,q,a,u))
print(sol)


plt.plot(sol[:, 0], sol[:, 2]) 
plt.xlabel('Y')
plt.ylabel('Z')
plt.grid()

所以我有 4 列数据,可以说 [:, 0] 到 [:,0]。我只需要关注两个:[:, 0]、[:, 2]。当我制作它的图表时 - 它是一个调和函数。 [:, 0] 是值,[:, 2] 是参数。我需要找到这些值为最大值的参数。或者我需要差异,我尝试使用 "if" 的两个参数(两个最大值)之间的距离,但这些值是近似值,因此它们不相同。你能帮我解决这个问题吗?

Graph

我需要找到这个差异,但每个最大值都有点不同

你是对的,你需要定义一个相对于最大值的差异容差。我标记了澄清的要点。这里的想法是首先得到与最大值 max(sol[:, 0]) 的差值。然后,您可以使用容差为 1e-4 的 NumPy 数组索引。 [abs(diff) < 1e-4] returns 此条件成立的索引。现在你有这些最高 5 分。你可以用它们做任何你想做的处理。公差的选择还取决于您的网格点数(在本例中为 10001)。它需要一些玩耍。也可以编写一些函数来巧妙地检查这一点。

diff = sol[:, 0] - max(sol[:, 0])
plt.plot(sol[:, 0], sol[:, 2]) 
plt.plot(sol[:, 0][abs(diff) < 1e-4], sol[:, 2][abs(diff) < 1e-4], 'kx')