[問題] float object not callable

看板Python作者 (@ Home)時間13年前 (2012/03/23 12:54), 編輯推噓0(0011)
留言11則, 3人參與, 最新討論串1/1
問題似乎主要在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)

03/23 14:57, , 1F
你的innerproduct()有問題,仔細看return self.innerpr
03/23 14:57, 1F

03/23 14:58, , 2F
oduct,你呼叫函式,然後把函式re-assign成數字,再retur
03/23 14:58, 2F

03/23 14:58, , 3F
n?邏輯錯了吧??
03/23 14:58, 3F

03/23 15:02, , 4F
因為你執行過一次k21,vector物件的innerproduct()就被
03/23 15:02, 4F

03/23 15:03, , 5F
overwrite成float型態self.innproduct[<-注意沒有()]
03/23 15:03, 5F

03/23 15:03, , 6F
(原因如上),你print時重新call .innerproduct()->爆
03/23 15:03, 6F

03/23 15:04, , 7F
typeof(^^^^^^^^^^^^^)==float
03/23 15:04, 7F

03/23 15:14, , 8F
就錯在def(): self.crossproduct, 就直接return你要的值
03/23 15:14, 8F

03/23 15:19, , 9F
你把原本的 self.crossproduct() 給用掉了 同1F說的
03/23 15:19, 9F

03/23 17:50, , 10F
thanks, 我想想看該怎麼改好了...
03/23 17:50, 10F

03/23 18:19, , 11F
似乎解決了 thanks!!!
03/23 18:19, 11F
文章代碼(AID): #1FR08WHp (Python)
文章代碼(AID): #1FR08WHp (Python)