如何修复‘tuple与int实例间不支持<运算’错误及构建DS0矩阵
问题:构建DS0矩阵时触发类型错误
我需要构建矩阵S、I、H、L和DS0,其中S、I、H、L已成功创建,但DS0的构建出现错误。
原代码
import numpy as np import sympy as sp from sympy.matrices import zeros from gekko import GEKKO n=3;z=1 m = GEKKO(remote=False) x = [sp.symbols('x%d' % i) for i in range(8*n-4)] t=sp.symbols('t ') B=np.zeros((n,n)) number = range(n) for i in number: for j in number: if i<j : B[i][j]=0 else : B[i][j]=sp.factorial(i+j)/(2**j*sp.factorial(j)*sp.factorial(i-j)) PS=[x[0:n]];PI=[x[n:2*n]];PH=[x[2*n:3*n]];PL=[x[3*n:4*n]] TS=[[1]];TI=[[1]];TH=[[1]];TL=[[1]] for i in range(n-1): TS.append([t**(x[4*n+i]+i+1)]) TI.append([t**(x[5*n+i-1]+i+1)]) TH.append([t**(x[6*n+i-2]+i+1)]) TL.append([t**(x[7*n+i-3]+i+1)]) S=np.dot(np.dot(PS,B),TS) I=np.dot(np.dot(PI,B),TI) H=np.dot(np.dot(PH,B),TH) L=np.dot(np.dot(PL,B),TL) DS0=zeros((n,n)) for i in number: if i==0: DS0[i][i]=0 else: DS0[i][i]=sp.gamma(x_4*n+i+1)/sp.gamma(x_4*n+i+1-z) print (DS0)
错误信息
运行代码后触发错误:
TypeError: '<' not supported between instances of 'tuple' and 'int'
错误详情:
line 1212, in zeros if rows < 0 or cols < 0: TypeError: '<' not supported between instances of 'tuple' and 'int'
解决方案
修正
zeros()调用方式:
Sympy的zeros()函数要求传入两个独立的整数参数(行数、列数),而非元组。原代码中zeros((n,n))会把元组当作单个参数传入,导致函数内部将元组和整数做比较时触发类型错误。将其改为:DS0=zeros(n, n)修正变量索引错误:
代码中x_4*n+i+1是无效语法,x是列表,需用索引访问元素,改为x[4*n+i]。对应行修正为:DS0[i][i] = sp.gamma(x[4*n+i] + 1) / sp.gamma(x[4*n+i] + 1 - z)
修复后的完整代码
import numpy as np import sympy as sp from sympy.matrices import zeros from gekko import GEKKO n=3;z=1 m = GEKKO(remote=False) x = [sp.symbols('x%d' % i) for i in range(8*n-4)] t=sp.symbols('t ') B=np.zeros((n,n)) number = range(n) for i in number: for j in number: if i<j : B[i][j]=0 else : B[i][j]=sp.factorial(i+j)/(2**j*sp.factorial(j)*sp.factorial(i-j)) PS=[x[0:n]];PI=[x[n:2*n]];PH=[x[2*n:3*n]];PL=[x[3*n:4*n]] TS=[[1]];TI=[[1]];TH=[[1]];TL=[[1]] for i in range(n-1): TS.append([t**(x[4*n+i]+i+1)]) TI.append([t**(x[5*n+i-1]+i+1)]) TH.append([t**(x[6*n+i-2]+i+1)]) TL.append([t**(x[7*n+i-3]+i+1)]) S=np.dot(np.dot(PS,B),TS) I=np.dot(np.dot(PI,B),TI) H=np.dot(np.dot(PH,B),TH) L=np.dot(np.dot(PL,B),TL) # 修复zeros调用方式 DS0=zeros(n, n) for i in number: if i==0: DS0[i][i]=0 else: # 修复变量索引错误 DS0[i][i]=sp.gamma(x[4*n+i]+1)/sp.gamma(x[4*n+i]+1-z) print (DS0)
内容的提问来源于stack exchange,提问作者hojat saeidi
相关产品推荐
相关产品推荐

