Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-曲线的相交导致它们之间的标识_Python_Scipy_Precision - Fatal编程技术网

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

Python-曲线的相交导致它们之间的标识,python,scipy,precision,Python,Scipy,Precision,我有一个两个变量的函数-f(x,y)。我想在不同的y值上运行,对于每个y值,找到f(x,y)的前n个根(作为单个变量的函数)。然后,我想画一个图表,显示根是如何随着y的变化而改变位置的(因此y是水平轴,曲线代表不同根的位置)。当我这样做时,我得到了以下图表: 如您所见,曲线图中有一些突然的凸起,这些凸起同时出现在所有曲线上(根据我对函数f的了解,这些凸起不应该存在)。请注意,每当两条曲线即将相交时,就会发生这些凹凸。我得出的结论是,出现这些颠簸的原因如下: 每当两个根彼此非常接近时(对于某些y

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

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

每当两个根彼此非常接近时(对于某些y,这意味着两条根曲线即将相交),它们就会被识别为同一根(为了找到根,我使用scipy的root_标量函数在小间隔上平分的方法,但如果根非常接近,那么该方法无法同时识别这两个根)。当这种情况发生时,这会导致图形中的“移动”-根的编号发生变化,因此曲线可以彼此切换位置(因此凹凸实际上是由于根曲线进入不同根曲线的位置)

我想知道是否有人知道如何解决这个问题。我曾考虑过减小二等分的间隔,但如果根曲线相交,这将无济于事(因为根任意接近)。我还考虑过将对分间隔的大小设置为取决于之前记录的根之间的距离-如果在上一次迭代中我有两个相距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
def secroots(s,l):#s是y的值,l是我要查找的根数
根=[]
delta=0.01#这将是分割间隔的大小
i=0.01#这是我开始寻找根的地方
while(len(根)