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_r和T是两个参数。t_r当和的比值变化时,最大值位于不同的峰值处T。我在 Sympy 中没有找到解决它的方法。有什么建议吗?答案可以用下图来表示。

问题在于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)
这看起来像是您正在寻找的答案,除了绝对值(我不确定它们应该来自哪里)。