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

时间:2014-02-05 06:05:31

标签: 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)))

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

df=diff(f,t)
sln=solve(simplify(df),t)
simplify(f.subs(t,sln[1]))

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

Result

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

df=expand_trig(diff(expand(f)**2,t))
sln=solve(df,t)
simplify(f.subs(t,sln[2]))

似乎答案几乎相同,只是另一种形式。

Result

预期答案是sinc函数加上常量如下:

Expected

因此,问题是如何获得最终的演示文稿。

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

Max

1 个答案:

答案 0 :(得分:2)

问题是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的{​​{1}}。但在这种情况下,如果您将n替换为log(exp(I*omega*t_r/2))omega*t_r/2,则会相同,因为它只会在omega*t_r/2 + 2*pi*I*n内添加2*pi*I*n

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

sin

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