[問題] float object not callable
問題似乎主要在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
03/23 14:57, 1F
→
03/23 14:58, , 2F
03/23 14:58, 2F
→
03/23 14:58, , 3F
03/23 14:58, 3F
→
03/23 15:02, , 4F
03/23 15:02, 4F
→
03/23 15:03, , 5F
03/23 15:03, 5F
→
03/23 15:03, , 6F
03/23 15:03, 6F
→
03/23 15:04, , 7F
03/23 15:04, 7F
→
03/23 15:14, , 8F
03/23 15:14, 8F
→
03/23 15:19, , 9F
03/23 15:19, 9F
→
03/23 17:50, , 10F
03/23 17:50, 10F
→
03/23 18:19, , 11F
03/23 18:19, 11F
Python 近期熱門文章
PTT數位生活區 即時熱門文章