gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:11:51 24 4
gpt4 key购买 nike

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

最佳答案

问题出在 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/2omega*t_r/2 + 2*pi*I*n,它是相同的,因为它只是在 sin 内添加一个 2*pi*I*n

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

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)

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

关于max - 如何在 Sympy 中找到函数的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21569792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com