【问题标题】:Python not computing equation correctlyPython没有正确计算方程
【发布时间】:2015-09-30 14:50:19
【问题描述】:

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

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

我遇到的另一个错误是它似乎没有绘制xy,而是为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()

【问题讨论】:

  • 你能展示一下图表的样子吗?
  • 几点:(1)求幂是**,而不是^; (2) x 是一个整数数组,所以 x[i]**2/2 在 Python 2 中使用整数运算。您可以使用 x[i]**2/2.0 来解决这个问题。

标签: python numpy graphing


【解决方案1】:

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

参考文献

【讨论】:

    【解决方案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()
    

    【讨论】:

    • 我没有意识到python会做整数除法。很酷的技巧来绕过它。关于如何使用高阶多项式绘制我的点的任何建议?
    • 没关系意识到我可以使用 arange 命令创建更多点。
    • 建议:1) 使用 IPython 并以交互方式工作 2) 只需在 Python 中编写您想要的任何公式,它就可以工作,例如x ** 3.5 - 6.7 3) 确保使用浮点数而不是整数 4) 将每个公式定义为函数,然后将其映射到输入范围(阅读 map() 函数)
    • 如果这回答了您的问题并且您认为这是给定答案中最好的,请接受它。
    【解决方案3】:

    正如@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.])
    

    【讨论】:

      【解决方案4】:

      ^ 不是 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        相关资源
        最近更新 更多