作者Strogatz (@ Home)
看板Python
標題[問題] float object not callable
時間Fri Mar 23 12:54:53 2012
問題似乎主要在function2的設計?
import math
import time
from pylab import *
class vec(object):
def __init__(self, x, y, z):
self.vec=(x, y, z)
def distance(self):
self.a=self.vec[0]
self.b=self.vec[1]
self.c=self.vec[2]
return math.sqrt(self.a**2+self.b**2+self.c**2)
def unit(self):
dis=self.distance()
self.aunit=self.a/dis
self.bunit=self.b/dis
self.cunit=self.c/dis
return self.aunit, self.bunit, self.cunit
def add(self, vector1, vector2):
self.sum=(vector1[0]+vector2[0], vector1[1]+vector2[1],
vector1[2]+vector2[2])
return self.sum
def addfour(self, vec1, vec2, vec3, vec4):
comebine1=vector.add(vec1,vec2)
comebine2=vector.add(vec3,vec4)
self.outcome=vector.add(comebine1, comebine2)
return self.outcome
def smultiply(self,scalar, vec):
self.product=(scalar*vec[0],scalar*vec[1],scalar*vec[2])
return self.product
def innerproduct(self, vec1, vec2):
self.innerproduct=(vec1[0]*vec2[0]+vec1[1]*vec2[1]+vec1[2]*vec2[2])
return self.innerproduct
def crossproduct(self, vec1, vec2):
self.crossproduct=(vec1[1]*vec2[2]-vec1[2]*vec2[1],
vec1[2]*vec2[0]-vec1[0]*vec2[2], vec1[0]*vec2[1]-vec1[1]*vec2[0])
return self.crossproduct
def function2(self, vec1, vec2):
self.coef1=c1*self.innerproduct(vec2, vec2)
self.term1=self.smultiply(self.coef1, vec2)
self.term2=self.smultiply(c2,self.crossproduct(vec2,vec1))
self.term3=self.smultiply(c3,(0,0,1))
self.term4=self.smultiply(c4*vec1[2],vec1)
self.sumoffour=self.addfour(self.term1,self.term2,self.term3,self.term4)
self.outcome=self.smultiply(h, self.sumoffour)
return self.outcome
def rungekutta1(self,vec1,vec):
self.k11=self.smultiply(h,vec)
self.k11_half=self.smultiply(.5, self.k11)
self.y12=self.add(vec, self.k11_half)
self.k12=self.smultiply(h,self.y12)
self.k12_half=self.smultiply(.5, self.k12)
self.y13=self.add(vec, self.k12_half)
self.k13=self.smultiply(h,self.y13)
self.y14=self.add(vec, self.k13)
self.k14=self.smultiply(h,self.y14)
self.k12_double=self.smultiply(2.0, self.k12)
self.k13_double=self.smultiply(2.0, self.k13)
self.k1s=self.addfour(self.k11, self.k12_double, self.k13_double,
self.k14)
self.n_next=self.add(vec1, self.smultiply(1.0/6, self.k1s))
return self.n_next
def rungekutta2(self, vec1, vec2):
self.k21=self.function2(vec1, vec2)
self.n21=self.add(vec1,self.smultiply(.5*h,(1,1,1)))
self.d_n21=self.add(vec2,self.smultiply(.5,self.k21))
#self.k22=self.function2((0,0,0),(0,0,0))
return self.d_n21
c1=-1.0
c2=-1.0
c3=1.0
c4=-1.0
h=.00001
vector=vec(1,2,3)
allone=vec(1.0,1.0,1.0)
n=(1.0,1.0,1.0)
d_n=(1.0,-1.0,0.0)
#print vector.rungekutta1(n, d_n)
#print vector.add(n,vector.smultiply(h+(h**2)/2+(h**3)/6+(h**4)/24, d_n))
#print vector.function2(n, d_n)
#print vector.rungekutta2(n, d_n)
k21=vector.function2(n, d_n)
n21=vector.add(n, vector.smultiply(.5*h,(1,1,1)))
d_n21=vector.add(d_n, vector.smultiply(.5,k21))
print n21, d_n21
print vector.function2(n21, d_n21)
不知道為何這樣會顯示錯誤訊息?
Traceback (most recent call last):
File "D:\Python\spinningtop.py", line 105, in <module>
k21=vector.function2(n, d_n)
File "D:\Python\spinningtop.py", line 38, in function2
self.coef1=c1*self.innerproduct(vec2, vec2)
TypeError: 'float' object is not callable
然後我發現如果拿掉下面全部,只執行
print vector.function2(n, d_n)
是可以跑出來的
但如果加上綠色任何一條,就失敗了,顯示float object not callable
不知道問題出在哪裡,謝謝。orz
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.36.20.117
※ 編輯: Strogatz 來自: 114.36.20.117 (03/23 13:51)
→ mail6543210:你的innerproduct()有問題,仔細看return self.innerpr 03/23 14:57
→ mail6543210:oduct,你呼叫函式,然後把函式re-assign成數字,再retur 03/23 14:58
→ mail6543210:n?邏輯錯了吧?? 03/23 14:58
→ mail6543210:因為你執行過一次k21,vector物件的innerproduct()就被 03/23 15:02
→ mail6543210:overwrite成float型態self.innproduct[<-注意沒有()] 03/23 15:03
→ mail6543210:(原因如上),你print時重新call .innerproduct()->爆 03/23 15:03
→ mail6543210: typeof(^^^^^^^^^^^^^)==float 03/23 15:04
→ kilfu0701:就錯在def(): self.crossproduct, 就直接return你要的值 03/23 15:14
→ kilfu0701:你把原本的 self.crossproduct() 給用掉了 同1F說的 03/23 15:19
→ Strogatz:thanks, 我想想看該怎麼改好了... 03/23 17:50
→ Strogatz:似乎解決了 thanks!!! 03/23 18:19