如何在 Sympy 中找到函数的最大值?

Kat*_*ern 5 max sympy computer-algebra-systems

这些天我正在尝试使用 Sympy 重做单自由度系统的冲击谱。这个问题可以减少寻找函数最大值的问题。以下是两种情况,我不知道该怎么做。

第一个是

tau,t,t_r,omega,p0=symbols('tau,t,t_r,omega,p0',positive=True)
h=expand(sin(omega*(t-tau)))
f=simplify(integrate(p0*tau/t_r*h,(tau,0,t_r))+integrate(p0*h,(tau,t_r,t)))
Run Code Online (Sandbox Code Playgroud)

f最终目标是获得(变量为)的最大绝对值t。直接的方法是

df=diff(f,t)
sln=solve(simplify(df),t)
simplify(f.subs(t,sln[1]))
Run Code Online (Sandbox Code Playgroud)

这是结果,我尝试了很多方法,但无法进一步简化。

结果

因此,我尝试了另一种方式。因为我需要最大绝对值和abs(f)最大值出现的位置与 的平方相同的位置f,所以我们可以先计算 的平方f

df=expand_trig(diff(expand(f)**2,t))
sln=solve(df,t)
simplify(f.subs(t,sln[2]))
Run Code Online (Sandbox Code Playgroud)

看来答案几乎是一样的,只是换了一种形式。

结果

预期的答案是一个sinc函数加一个常数,如下所示:

预期的

因此,问题是如何得到最终的呈现。

第二个可能有点难。这个问题可以简化为找到 的最大值f=sin(pi*t/t_r)-T/2/t_r*sin(2*pi/T*t),其中t_rT是两个参数。t_r当和的比值变化时,最大值位于不同的峰值处T。我在 Sympy 中没有找到解决它的方法。有什么建议吗?答案可以用下图来表示。

最大限度

asm*_*rer 5

问题在于log(exp(I*omega*t_r/2))术语。SymPy 并未将其简化为I*omega*t_r/2. SymPy 并没有简化这一点,因为一般来说,log(exp(x)) != x,而是log(exp(x)) = x + 2*pi*I*n对于某些整数n。但在这种情况下,如果你替换log(exp(I*omega*t_r/2))omega*t_r/2or omega*t_r/2 + 2*pi*I*n,它会是相同的,因为它只会2*pi*I*n在 里面添加一个sin

我无法找出任何强制这种简化的函数,但最简单的方法就是进行替换:

In [18]: print(simplify(f.subs(t,sln[1]).subs(log(exp(I*omega*t_r/2)), I*omega*t_r/2)))
p0*(omega*t_r - 2*sin(omega*t_r/2))/(omega**2*t_r)
Run Code Online (Sandbox Code Playgroud)

这看起来像是您正在寻找的答案,除了绝对值(我不确定它们应该来自哪里)。