Python 没有正确计算方程

Python not computing equation correctly

我正在尝试编写一个简单的程序来绘制 x vs y。但是,它似乎没有计算 y.

的正确值

例如在第一种情况下 x = -1 e^(x^2/2 - x) -1 的值应该是 3.48,但它返回 1.

我遇到的另一个错误是它似乎没有绘制 xy,而是为 x.[=22= 的每个值绘制单独的一行]

import numpy as np
import math
import matplotlib.pyplot as plt

x = np.arange(-2, 2)
y = np.arange(-2, 2)

for i in range(-3, 3):
    y[i] = math.exp(( x[i]^2/2 ) - x[i])-1

print x, y
plt.plot([x, y])
plt.show()

^ 不是 Python 中的求幂运算符,它是按位异或。您需要改用 **。此外,如果您在数组上绘制函数,直接编写函数并通过 vectorize.

应用它会更清晰

此外,如果您使用的是 Python2.7,则应添加 from __future__ import division 以获得真正的(浮点)除法,否则 x/2 将改为使用整数除法。

from __future__ import division
import math
import numpy as np    
import matplotlib.pyplot as plt

f = np.vectorize(lambda x: math.exp((x**2/2) - x) - 1)
x = np.arange(-2, 2)
y = f(x)

最后,您需要将 xy 作为单独的参数传递给 plot,而不是将它们放在列表中:

plt.plot(x, y)

作为@xnx 回答我 几天前 "NumPy arrays have a fixed datatype (dtype) which is inferred from the initialization data if you don't specify it yourself. It won't change unless you tell it to"

这就是这里发生的事情,你使用的是一个整数范围 np.arange(-2, 2),然后数字没有浮点除法。

import numpy as np
import math
import matplotlib.pyplot as plt

x = np.arange(-2., 2.)  #<-- use dots to define a float array
y = []

for i in range(-3, 3):
    y.append(math.exp(( x[i]**2/2 ) - x[i])-1)

y = np.array(y)
print x, y

# x = array([-2., -1.,  0.,  1.])    
# y = array([ 3.48168907, 0. , 0.39346934,  53.59815003, 3.48168907, 0.])

您的代码中存在的问题:

  • 您使用了异或运算符 ^ 而不是求幂运算符 **
  • 您没有将值列表正确地传递给 plt.plot()
  • 用一个整数除以一个整数,你实际上是在做整数除法,即3/2 -> 1
  • 您通过分配给 y[i] 不小心将所有结果四舍五入为整数,因为 y 是作为整数数组制作的(正如@efirvida 解释的那样,这是因为 np.arange()从给定值推断类型)
  • 您迭代的索引范围非常不清楚,那里有很多错误空间...(实际上不是错误)

这适用于 Python 3.4:

import numpy as np
import math
import matplotlib.pyplot as plt

x = np.arange(-2, 2)
y = np.ndarray(len(x), float)

for i in range(len(x)):
    y[i] = math.exp(( (x[i]**2)/2.0 ) - x[i])-1
print(x, y)
plt.plot(x, y)
plt.show()

内置的 numpy 数组操作非常适合此操作。

这是你想要的行:

 y = np.exp(np.power(x, 2)/2 - x) - 1

然后完整代码变成

import numpy as np
import math
import matplotlib.pyplot as plt

x = np.arange(-2, 2)

y = np.exp(np.power(x, 2)/2 - x) - 1


print(x, y)
plt.plot(x, y)
plt.show()

(注意,plot语句这里也改了)

详情

如果您在使用 numpy 时开始编写循环,请寻找其他方法。矢量运算可以比相应的 python 代码快得多(有时快几个数量级),这就是人们喜欢它的原因。许多基本操作(+-*/**)甚至被重载。查看“参考”部分中的最后一项以获取更多信息。

参考资料