Python ValueError:使用ODEINT中的数组设置具有序列的数组元素
我是python初学者,但我对算法了如指掌。 我需要你的帮助,我希望你能在以下问题上帮助我。我只能说,请帮帮我。对我来说,给这个问题打否定或肯定的分数并不重要,请帮助我 在以下代码中,我遇到了一个问题:Python ValueError:使用ODEINT中的数组设置具有序列的数组元素,python,arrays,matrix,odeint,Python,Arrays,Matrix,Odeint,我是python初学者,但我对算法了如指掌。 我需要你的帮助,我希望你能在以下问题上帮助我。我只能说,请帮帮我。对我来说,给这个问题打否定或肯定的分数并不重要,请帮助我 在以下代码中,我遇到了一个问题: 让我解释一下:在代码的中间使用代码< >数据文件>代码> M =(SS-H)< /代码>。TXT 最初是: M=(u[i] -h)< /代码>,我用 SS 代替 u[i]代码>代码>。现在,如果我想用aa替换z[I],以删除for循环并避免导入data\u file.txt,我该怎么办 如果我只
让我解释一下:在代码的中间使用代码< >数据文件>代码> M =(SS-H)< /代码>。TXT 最初是:<代码> M=(u[i] -h)< /代码>,我用<代码> SS <代码>代替<代码> u[i]代码>代码>。现在,如果我想用
aa
替换z[I]
,以删除for循环并避免导入data\u file.txt
,我该怎么办
如果我只是将此代码中的z[I]
替换为现在的aa
,它会得到一个错误:
ValueError:设置带有序列的数组元素。
我已经搜索了这个错误,我刚刚发现ODE采用1-D数组。据我所知,aa
是二维阵列。
现在我谈论我的问题。我要做的一件事是调用m[1]
,代码自动取aa[1]
和ss[1]
,这意味着m[1]=(ss[1]-m-h)
和aa[1]
进入h
和其他m
请给我一些帮助。
数据文件如下:
0.01 32.95388698
0.012 33.87900347
0.014 33.84214074
0.016 34.11856704
0.019 34.59344598
0.023 34.93902653
0.026 35.25209633
0.031 35.74850165
0.037 36.06978761
0.043 36.43457047
代码是:
from math import *
import numpy as np
from scipy.integrate import quad
from scipy.integrate import odeint
z,u=np.genfromtxt('Datafile.txt',unpack=True)
aa=np.array([0.01,0.012,0.014,0.016,0.019,0.023,0.026,0.031,0.037,0.043])
ss=np.array([32.95388698,33.87900347,33.84214074,34.11856704,34.59344598,
34.93902653,35.25209633,35.74850165,36.06978761,36.43457047])
Cov= [[21282,-10840,1918,451,946,614,785,686,581,233],
[0,28155,-2217,1702,74,322,380,273,424,487],
[0,0,6162,-1593,1463,419,715,580,664,465],
[0,0,0,5235,-722,776,588,591,583,403],
[0,0,0,0,7303,-508,1026,514,596,315],
[0,0,0,0,0,3150,-249,800,431,358],
[0,0,0,0,0,0,3729,-88,730,321],
[0,0,0,0,0,0,0,3222,-143,568],
[0,0,0,0,0,0,0,0,3225,-508],
[0,0,0,0,0,0,0,0,0,5646]]
def ant(z,O_m,O_D):
return 1/sqrt(((1+z)**2)*(1+O_m*z)-z*(2+z)*O_D)
def HDE(y,z):
a=1/(1+z)
p=log(alpha+beta*a)
pd=beta*a/(alpha+beta*a)
dydz = -((C**2-y)*((pd/p)*(y-2)-(pd**3)/(p**2)+(pd**2)/p+1.5*(y*(b+1)-1))/(1-(pd**2)/(p**2)+2*pd/p-0.5*(C**2+y)))*(1/(1+z))
return dydz
b=0.01
M=4
C=0.5
O_m=0.23
alpha=1
beta=2
for i in range (len(z)):
y0=1-O_m
z0=0
z1=z[i]
y = odeint(HDE,y0,[z0,z1])
O_D=y[-1,0]
q=quad(ant,0,z[i],args=(O_m,O_D))[0]
h=5*log10((1+z[i])*(299000/70)*q)+25 # Here is the main problem of my code
# h and q must work with aa instead of z[i]
fl=(ss-h)
l1=[[fl[0],fl[1],fl[2],fl[3],fl[4],fl[5],fl[6],fl[7],fl[8],fl[9]]]
l2=[[fl[0]],[fl[1]],[fl[2]],[fl[3]],[fl[4]],[fl[5]],[fl[6]],[fl[7]],[fl[8]],[fl[9]]]
mm=np.dot(l2,Cov)
zz=np.dot(mm,l2)
hh=np.linalg.det(zz) #calculation of determinant
print (hh)
感谢您的帮助和关注对于矩阵的组件,您可以使用以下结构: 这很清楚,不需要任何解释 第二段分别选择每个组件,并在矩阵中正确使用
def new_calculation(n):
yn = odeint(HDE,y0,[z0,xx[n]])
yyn=yn[-1,0]
O_Dn=1-O_m-(1/(2*rc*yyn))
q=quad(ant,0,xx[n],args=(O_m,O_Dn))[0]
h=log10((1+xx[n])*(299000/70)*q)+25
fn=(ss[n]-h)
return fn
f_list = []
for i in range(2): # the value '2' reflects matrix size
f_list.append(new_calculation(i))
rdag=[f_list]
rmat=[[f] for f in f_list]
mm=np.dot(rdag,Cov)
zz=np.dot(mm,rmat)
hh=np.linalg.det(zz)
我猜
quad
函数不会接受数组作为输入。您可以通过将代码放入函数f(x)并使用numpy.vectorize
来避免这种情况,但最终它还是在内部实现了for循环。或者,您可以只运行列表理解,例如,out=[f(x)for x in range(len(z))]
,避免再次执行显式的for
循环调用。嗨,bob和Ethan,您可以添加一些所需的输出吗?我的意思是,你给一些输入,函数返回什么?还有,你有Cov=#10*10矩阵的例子吗?那个矩阵是什么样子的?@Damianaltenero更新了我的朋友。请给出一个最小且可重复的例子。您可以使数据非常小,然后写入或随机生成数据,或者向文件添加链接。如果我们可以运行您的代码,那么帮助会容易得多。@Bob好极了,现在,当您执行print(hh)
希望您成为输出的内容时