微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python-曲线的相交会导致它们之间的识别

如何解决Python-曲线的相交会导致它们之间的识别

我有两个变量的函数-f(x,y)。我想在y的各种值上运行,并针对y的每个值,找到f(x,y)的前n个根(作为单个变量的函数)。然后,我想画一个图,显示随着y的变化,根的位置如何变化(所以y是水平轴,曲线表示不同根的位置)。当我这样做时,我得到以下图:

enter image description here

如您所见,图形上的所有曲线同时出现一些突然的颠簸(据我对函数f的了解,这些颠簸不应该存在)。请注意,每当两条曲线要相交时,就会发生这些颠簸。我得出结论,出现这些颠簸的原因如下:

每当两个根彼此非常接近时(意味着,对于某些y,两个根曲线即将相交),它们将被标识为相同的根(要找到这些根,我在小间隔使用scipy的root_scalar函数,但如果根非常接近,则该方法将无法识别两者。发生这种情况时,会在图形中引起“移位”-根的编号发生更改,因此曲线可以相互切换位置(因此,凹凸实际上是由于根曲线进入了另一个根的位置而引起的)曲线)。

我想知道是否有人对如何解决这个问题有想法。我曾考虑过使二等分的间隔变小,但是如果根曲线相交,这将无济于事(因为根被任意关闭)。我还考虑过将二等分区间的大小设置为取决于先前记录的根之间的距离-如果在上一次迭代中我有两个相距0.2的根,则在下一个根查找迭代中(对于下一个值) y)我将间隔的大小设置为0.1,以便仍可以区分它们。但这会导致过程无法收敛-我观察的间隔越来越小,并且过程没有终止。

我也想更笼统地提出这个问题。当计算两条曲线时(它们不是不同的函数,但实际上是相互依赖的,例如我的函数的两个连续根的情况),有没有一种方法可以避免两条曲线相交时“识别”两条曲线?我该如何区分他们?

我很高兴听到任何想法。我还将附加代码的找到根的部分,以传达正在发生的事情(然后,我将对y的许多不同值重复此过程,以获得给定的曲线)。如果您还有其他问题,请告诉我。

谢谢!

def secroots(s,l): # s is the value of y,l is the number of roots I want to find
    roots=[]
    delta=0.01 #this will be the size of the intervals for biscetion
    i=0.01 #this is where I start looking for roots
    while (len(roots)<(l)):
        c = secdet(i,s) #secdet is the function f(x,y)
        d = secdet(i+delta,s)
        if c*d<0:
            x = optimize.root_scalar(lambda a: secdet(a,s),bracket=[i,i+delta],method='bisect')
            if x.converged:
                roots.append(x.root)
        i=i+delta
    return roots

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。