Python 为什么我的代码在使用列表理解时不准确?

Python 为什么我的代码在使用列表理解时不准确?,python,loops,list-comprehension,Python,Loops,List Comprehension,我正在学习python,并尝试了以下内容。这是我想出的代码: import numpy as np def f(x): return x**3-3*x**2-5.5*x+25 x = np.linspace(-3,5,10000) for i in x: if f(i)>f(i-1) and f(i)>f(i+1): max=i if f(i)<f(i-1) and f(i)<f(i+1): min=i pri

我正在学习python,并尝试了以下内容。这是我想出的代码:

import numpy as np

def f(x):
    return x**3-3*x**2-5.5*x+25

x = np.linspace(-3,5,10000)

for i in x:
    if f(i)>f(i-1) and f(i)>f(i+1):
        max=i
    if f(i)<f(i-1) and f(i)<f(i+1):
        min=i
print('Coordinates for maxima: ({:.3f},{:.3f})'.format(max,f(max)))
print('Coordinates for minima: ({:.3f},{:.3f})'.format(min,f(min)))
将numpy导入为np
def f(x):
返回x**3-3*x**2-5.5*x+25
x=np.linspace(-3,510000)
对于x中的i:
如果f(i)>f(i-1)和f(i)>f(i+1):
max=i
如果f(i)f(x[i+1]):
max=x[i]

如果f(x[i])而不是用1递增或递减i,如果您使用gap,即数组x的相邻元素之间的差值,则此代码将等效于下面的代码(忽略边界条件,-3和5)。检查下面的代码以供参考

import numpy as np

def f(x):
    return x**3-3*x**2-5.5*x+25

x = np.linspace(-3,5,10000)
gap = x[1] - x[0]

for i in x:
    if f(i)>f(i-gap) and f(i)>f(i+gap):
        max=i
    if f(i)<f(i-gap) and f(i)<f(i+gap):
        min=i
print('Coordinates for maxima: ({:.3f},{:.3f})'.format(max,f(max)))
print('Coordinates for minima: ({:.3f},{:.3f})'.format(min,f(min)))
将numpy导入为np
def f(x):
返回x**3-3*x**2-5.5*x+25
x=np.linspace(-3,510000)
间隙=x[1]-x[0]
对于x中的i:
如果f(i)>f(i-间隙)和f(i)>f(i+间隙):
max=i

如果f(i)首先,你的界是不同的。但是,使用正确的循环,您正在计算
linespace
参数(大约8/10000)给出的相邻横坐标值。对于不正确的循环,您正在计算由正负1的横坐标值分隔的点

如果我们忽略第一个问题,虽然算法不正确,但在本例中并不重要,因为在-3或5处没有局部极小值:

import numpy as np

def f(x):
    return x**3-3*x**2-5.5*x+25

x = list(np.linspace(-3,5,10000))
delta = 8/10000 #

for i in x:
    if f(i)>f(i-delta) and f(i)>f(i+delta):
        max=i
    if f(i)<f(i-delta) and f(i)<f(i+delta):
        min=i
print('Coordinates for maxima: ({:.3f},{:.3f})'.format(max,f(max)))
print('Coordinates for minima: ({:.3f},{:.3f})'.format(min,f(min)))
将numpy导入为np
def f(x):
返回x**3-3*x**2-5.5*x+25
x=列表(np.linspace(-3510000))
δ=8/10000#
对于x中的i:
如果f(i)>f(i-delta)和f(i)>f(i+delta):
max=i

如果先使用f(i),则不使用列表理解。第二,循环表达式

对于x中的i:
如果f(i)>f(i-1)。。。

适用于范围(1,len(x)-1)内的i:
如果f(x[i])>f(x[i-1])。。。
意思不同

首先,第一个循环覆盖
x
的所有元素,而第二个循环覆盖
x
的几乎所有元素,但不包括第一个和最后一个元素


其次,
f(i-1)
(其中
i
x
的一个元素)和
f(x[i-1])
(其中
i
是一个索引)的含义不同。你似乎认为第一个循环中的
f(i-1)
相当于第二个循环中的
f(x[i-1])
,而实际上它相当于
f(x[i]-1)
注意
-1
相对于括号的位置
]

您的代码没有这样做。在第二个代码中增加/减少索引,在第一个代码中增加/减少值。此外,第二个版本将跳过
x
@jasonharper-中的第一个元素和最后一个元素。否则它将产生一个
索引越界
错误。没有列表理解。好吧,对于这个特定的输入数据。一般来说不是。您的解决方案适用于等距数据,但不适用于一般情况。这与Alok Nayak的答案几乎相同,但另一个缺点是
x[0]
x[1]
之间的差距是硬编码的,而不是根据
x
@jmramsey计算的。您当然是正确的。但OP提出的问题是,为什么他的一种方法产生了错误的结果。答案是,他没有查看相邻的横坐标值,这才是真正的要点。我的
delta
值实际上只是一个很好的近似值,在这种情况下有效。但是这段代码(正如Alok发布的代码一样)仍然是错误的,因为边界条件仍然是错误的,并且无论如何都不能像现在这样使用。它只是作为OP出错的证据。
import numpy as np

def f(x):
    return x**3-3*x**2-5.5*x+25

x = list(np.linspace(-3,5,10000))
delta = 8/10000 #

for i in x:
    if f(i)>f(i-delta) and f(i)>f(i+delta):
        max=i
    if f(i)<f(i-delta) and f(i)<f(i+delta):
        min=i
print('Coordinates for maxima: ({:.3f},{:.3f})'.format(max,f(max)))
print('Coordinates for minima: ({:.3f},{:.3f})'.format(min,f(min)))