Python 没有正确计算方程
Python not computing equation correctly
我正在尝试编写一个简单的程序来绘制 x
vs y
。但是,它似乎没有计算 y
.
的正确值
例如在第一种情况下 x = -1
e^(x^2/2 - x) -1
的值应该是 3.48
,但它返回 1
.
我遇到的另一个错误是它似乎没有绘制 x
与 y
,而是为 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)
最后,您需要将 x
和 y
作为单独的参数传递给 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 代码快得多(有时快几个数量级),这就是人们喜欢它的原因。许多基本操作(+
、-
、*
、/
、**
)甚至被重载。查看“参考”部分中的最后一项以获取更多信息。
参考资料
我正在尝试编写一个简单的程序来绘制 x
vs y
。但是,它似乎没有计算 y
.
例如在第一种情况下 x = -1
e^(x^2/2 - x) -1
的值应该是 3.48
,但它返回 1
.
我遇到的另一个错误是它似乎没有绘制 x
与 y
,而是为 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)
最后,您需要将 x
和 y
作为单独的参数传递给 plot
,而不是将它们放在列表中:
plt.plot(x, y)
作为@xnx 回答我
这就是这里发生的事情,你使用的是一个整数范围 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 代码快得多(有时快几个数量级),这就是人们喜欢它的原因。许多基本操作(+
、-
、*
、/
、**
)甚至被重载。查看“参考”部分中的最后一项以获取更多信息。