仅供参考我的代码
def makeList (start,end,h):
a=[]
a.append(start)
n=(end-start)/h
while(n!=0):
new=a[-1] +h
a.append(a[-1] +h)
n=n-1
return a
def generateBase(xList,f):
if(len(xList)==0):
return []
elif(xList[0]==0 or len(xList)==1):
return ([(xList[0],0,0)] + generateBase(xList[1:],f))
else:
return ([(xList[0],0,(f(xList[0])))] + generateBase(xList[1:],f))
def getThird(a):
return a[2]
def fdm(alpha,startx,endx,startt,endt,dx,dt,f):
baseSolution=generateBase((makeList(startx,endx,dx)),f)
totalSoltuion= baseSolution + startCalc(alpha,(makeList(startx,endx,dx)),(makeList(startt,endt,dt))[1:],baseSolution,dx,dt,[],[])
def startCalc(alpha,xList,tList,phiSolutions,dx,dt,newPhi,newX):
print newPhi
if(len(tList)==0):
return []
elif (len(xList)==1):
return ([(xList[0],tList[0],0)] + startCalc(alpha,(newX + [xList[0]]),tList[1:],(newPhi + [(xList[0],tList[0],0) ]),dx,dt,[],[]))
elif (xList[0]==0):
return ([(xList[0],tList[0],0)] + startCalc(alpha,(xList[1:]),tList,phiSolutions,dx,dt,(newPhi + [(xList[0],tList[0],0)]),(newX + [xList[0]])))
else:
print getThird(phiSolutions[0])
print getThird(phiSolutions[1])
print getThird(phiSolutions[2])
sol=newPhi(xList[0],tList[0],getThird(phiSolutions[0]),getThird(phiSolutions[1]),getThird(phiSolutions[2]),alpha)
return ([sol] + startCalc(alpha,(xList[1:]),tList,phiSolutions[1:],dx,dt,(newPhi + [sol]),(newX + [xList[0]])))
def newPhi(x,t,phiL,phiC,phiR,dx,dt,alpha):
return (x,t,(phiC + (alpha*(dt/(dx**2)))*(phiR-(2*phiC)+phiL)) )
def showMe(SolutionList):
GraphSolution(SolutionList)
showMe(fdm(1,0,1,0,1,.1,.01,(lambda x:x+1)))
问题在这里
sol=newPhi(xList[0],tList[0],getThird(phiSolutions[0]),getThird(phiSolutions[1]),getThird(phiSolutions[2]),alpha)
我遇到了这个问题
TypeError: 'list' object is not callable
这些数组中的东西是实数,我认为这个问题只发生在我尝试调用类似函数的列表时,如果我喜欢phiSolution(0)我不确定是什么想法问题,我打印出来的所有内容一个数字,如果有人能给我一些很好的见解。
答案 0 :(得分:2)
看看你的递归电话:
return ([(xList[0],tList[0],0)] + startCalc(alpha,(newX + [xList[0]]),tList[1:],(newPhi + [(xList[0],tList[0],0) ]),dx,dt,[],[]))
特别要仔细查看您的参数列表。它分解为这些论点:
startCalc(alpha, # arg 1
(newX + [xList[0]]), #arg 2
tList[1:], #arg 3
(newPhi + [(xList[0],tList[0],0) ]), # arg 4
dx, # arg 5
dt, # arg 6
[], # arg 7
[]) # arg 8
根据您对startCalc
...
startCalc(alpha,xList,tList,phiSolutions,dx,dt,newPhi,newX)
... newPhi
是位置参数#7。因此,当您进行尾递归调用时,会为newPhi
分配一个空列表。因此newPhi
是一个列表,sol=newPhi(<anything>)
确实试图调用它。如果您要尝试索引列表,请使用括号:
sol = newPhi[index]
另外,如另一个答案中所述,您使用标识符newPhi
作为函数名称和startCalc的输入参数名称。您需要更改其中一个来解决冲突。
答案 1 :(得分:2)
因为newPhi
是一个列表,因此无法调用。
请注意,您已定义newPhi
两次:一次作为函数(在代码中的第48行,startCalc
和showMe
的定义之间),以及第7次约为第29行的startCalc
函数的参数。引发TypeError
时生效的定义是startCalc
参数{。}}。
startCalc
由fdm
函数的第二行在第27行调用:
totalSoltuion= baseSolution + startCalc(alpha,(makeList(startx,endx,dx)),(makeList(startt,endt,dt))[1:],baseSolution,dx,dt,[],[])
如果你计算了7个参数,你会发现你正在传递一个空列表([]
)。
如果您希望newPhi
成为其中的函数,请移动上面的定义 startCalc
的定义,并重命名当前正在干扰的newPhi
参数使用newPhi
功能。你不能将它既是一个列表(见第34和36行)和一个函数(第42行)。