4

这些天我正在尝试使用 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]))

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

结果

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

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

似乎答案几乎相同,只是形式不同。

结果

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

预期的

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

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

最大限度

4

1 回答 1

4

问题是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*nsin.

我想不出任何强制这种简化的函数,但最简单的方法是只做一个替换:

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)

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

于 2014-02-08T01:35:35.390 回答