2011-05-23 85 views
0

因为我得到的建议,让另外一个问题在这里去...我想绘制的总和,和我有一个代码:类型错误在Python绘制总和

from scitools.std import * 
from math import factorial, cos, e, sqrt 
from scipy import * 
import numpy as np 


def f1(t): 
    return 0.5*(1 + sum((a**(2*n)*cos(2*sqrt(1 + n)*t))/(e**a**2*factorial(n)) for n in range(0,100))) 

a=4 
t = linspace(0, 35, 1000) 
y1 = f1(t) 

plot(t, y1) 

xlabel(r'$\tau$') 
ylabel(r'P($\tau$)') 
legend(r'P($\tau$)') 
axis([0.0, 35.0, 0.0, 1.0]) 
grid(True) 
show() 

,但我得到错误

Traceback (most recent call last): 
    File "D:\faxstuff\3.godina\kvantna\vježbe\qm2\v8\plot.py", line 12, in <module> 
    y1 = f1(t) 
    File "D:\faxstuff\3.godina\kvantna\vježbe\qm2\v8\plot.py", line 8, in f1 
    return 0.5*(1 + sum((a**(2*n)*cos(2*sqrt(1 + n)*t))/(e**a**2*factorial(n)) for n in range(0,100))) 
    File "C:\Python26\lib\site-packages\numpy\core\fromnumeric.py", line 1415, in sum 
    res = _sum_(a) 
    File "D:\faxstuff\3.godina\kvantna\vježbe\qm2\v8\plot.py", line 8, in <genexpr> 
    return 0.5*(1 + sum((a**(2*n)*cos(2*sqrt(1 + n)*t))/(e**a**2*factorial(n)) for n in range(0,100))) 
TypeError: unsupported operand type(s) for /: 'numpy.ndarray' and 'numpy.float64' 

那么,似乎是什么问题?它得到了做数组的东西,但我不知道是什么:\

编辑:画面中,数学是这样的: image

回答

1

您不能由numpy.float64分割numpy.ndarray。这是有问题的代码:

return 0.5*(1 + sum((a**(2*n)*cos(2*sqrt(1 + n)*t))/(e**a**2*factorial(n)) 
+0

但这就是我想要绘制的总和:\为什么用Mathematica做这么容易,用Python这么难? :\ – 2011-05-23 19:39:16

+0

@dingo_d可能是因为你在用Mathematica术语思考而不是Numpy术语? – 2011-05-23 19:40:37

+0

@ Rafe Kettler:你能帮我学习如何用Numpy术语思考吗? :D 第一部分是数组,第二部分是浮点数。但如何改变呢? – 2011-05-23 19:47:14

1

我不明白是什么发电机表达在return语句的结束f1这样做,但这:

a=4 
t = linspace(0, 35, 1000) 
y1 = numpy.array([f1(t_i) for t_i in t]) 

应该让你的地方。它通过循环t创建一个新的numpy.array,对每个值调用f1并从结果中构建一个列表。这样,f1里面的t就是一个数字,而不是整个数组,这意味着您的算术可以正确应用到它。

+0

原则上这应该起作用,但是现在他说“long”和“float”存在问题 TypeError:不支持的*:'long'和'numpy.float64'的操作数类型 A朋友帮助了我,他通过离散化来解决它 - 做这些事情的正确方法XD 我想我更喜欢Mathematica。感谢您的帮助:) – 2011-05-23 20:31:55

+0

与标准Python相比,处理numpy类型的男孩可能很奇怪!我想这就是你为速度付出的代价。很高兴你想出来了。 – 2011-05-23 20:52:07