Python没有正确计算方程式

时间:2015-09-30 14:50:19

标签: python numpy graphing

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

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

我遇到的另一个错误是它似乎没有绘制x vs y,而是为x的每个值设置一个单独的行。

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()

4 个答案:

答案 0 :(得分:3)

内置的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代码快得多(有时几个数量级),这就是人们喜欢它的原因。许多基本操作(+-*/**)甚至超载。查看“参考文献”部分中的最后一项以获取更多信息。

参考

答案 1 :(得分:2)

代码中的问题:

  • 您使用了xor运算符^而不是指数运算符**
  • 您没有将值列表正确传递给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()

答案 2 :(得分:0)

^不是Python中的取幂运算符,它是按位XOR。您需要使用**代替。此外,如果您要在数组上绘制函数,直接编写函数并通过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)

答案 3 :(得分:0)

由于@xnx几天前回答了我的question“NumPy数组有一个固定的数据类型(dtype),如果你没有自己指定它,可以从初始化数据中推断出来。除非你告诉它,它不会改变它到“

这就是这里发生的事情,你正在使用一系列int 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.])