Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:尝试多次运行函数并为每次运行保存值_Python - Fatal编程技术网

Python:尝试多次运行函数并为每次运行保存值

Python:尝试多次运行函数并为每次运行保存值,python,Python,我试图从我正在运行的数值模拟中获得一些数据。 我有一个函数,可以解算ODE并将所需的值保存在向量中,rv。我想运行我的函数1000次,并获得每个时间步的rv的平均值,但我不知道如何执行 我的第一个想法是调用函数1000次,并将数据保存在一个数组中 for i in range(1000): datavector = np.array(0) circle(N,dt,x0,y0,phi0,r,T,nu,v,Omega,R) datavector = np.append(dat

我试图从我正在运行的数值模拟中获得一些数据。 我有一个函数,可以解算ODE并将所需的值保存在向量中,
rv
。我想运行我的函数1000次,并获得每个时间步的
rv
的平均值,但我不知道如何执行

我的第一个想法是调用函数
1000次
,并将数据保存在一个数组中

for i in range(1000):
    datavector = np.array(0)
    circle(N,dt,x0,y0,phi0,r,T,nu,v,Omega,R)
    datavector = np.append(datavector, rv)
但当我这样做时,我得到了以下错误消息:
name错误:未定义名称“rv”

我会附上我的代码,因为我不太擅长解释。抱歉弄得这么乱

import math
import numpy as np
import matplotlib.pyplot as plt

def circle(N,dt,x0,y0,phi0,r,T,nu,v,Omega,R):


kB = 1.38*10**-23 # Boltzmann constant [J/K]plt #math constants
DT = kB*T/(6*math.pi*nu*r)  # Translational diffusion coefficent [m^2/s]
DR = kB*T/(8*math.pi*nu*r**3) # Rotational diffusion coefficent [rad^2/s]
n = 0 #iteration constant


x=x0 #vectors and initial values
y=y0
phi=phi0
phiv= np.array(phi) #vector containing phi-values
xv= np.array(x) #vector containing x-values
yv= np.array(y) #vector containing y-values
rv=np.array(np.sqrt(x**2+y**2))
xss=np.array(x) #vector containing start and (soon) end value
yss=np.array(y) # same as above

phiK=math.sqrt(2*DR*dt) #constants used in the iteration
xyK=math.sqrt(2*DT*dt)
Odt=Omega*dt

while n < N: #from 0 -> N-1
    phi = phi + Odt + phiK*np.random.normal(0,1) #eq (9)
    x = x + v*math.cos(phi)*dt + xyK*np.random.normal(0,1) #eq (10)
    y = y + v*math.sin(phi)*dt + xyK*np.random.normal(0,1) #eq (11)
    if (x**2+y**2) > R**2: #if the particle is outside the boundary
        if abs(x) > R: #need to make sure arccos(x/R) is meaningful
            xn = np.sign(x)*R
            theta = np.sign(y)*np.arccos((xn/R))#angle to particle
        else:
            theta = np.sign(y)*np.arccos((x/R))#angle to particle  
        rp = np.array([x,y]) #r for the particle
        rr = np.array([np.cos(theta)*R,np.sin(theta)*R]) #r for the boundary closest to the particle
        #d = rp - rr #smallest distance from particle to boundary
        q = (2*np.linalg.norm(rr)/np.linalg.norm(rp)) - 1
        x = q*np.array(rp[0]) #x- and y-value forced inside the boundary
        y = q*np.array(rp[1])

    phiv = np.append(phiv, phi) #adding all phi-values to a vector
    xv = np.append(xv, x) # adding all x-values to a vector
    yv = np.append(yv, y) # adding all y-values to a vector'
    rv = np.append(rv,(np.sqrt(x**2+y**2)))
    n=n+1 #iteration 


return(rv)
#print(rv)

for i in range(2): #run the program a number of times
    datavector = np.array(0)
    circle(1E5,1E-3,0*np.random.uniform(-1E-5,1E-5),0*np.random.uniform(-1E-5,1E-5),np.random.uniform(-2*np.pi,2*np.pi),1E-6,300,1E-3,5*1E-6,0,2E-5)
    datavector = np.append(datavector, rv)
np.savetxt('testet.txt', datavector)
导入数学
将numpy作为np导入
将matplotlib.pyplot作为plt导入
定义圆(N,dt,x0,y0,phi0,r,T,nu,v,ω,r):
kB=1.38*10**-23#玻尔兹曼常数[J/K]plt#数学常数
DT=kB*T/(6*math.pi*nu*r)#平移扩散系数[m^2/s]
DR=kB*T/(8*math.pi*nu*r**3)#旋转扩散系数[rad^2/s]
n=0#迭代常数
x=x0#向量和初始值
y=y0
φ=φ0
phiv=np.数组(phi)#包含phi值的向量
xv=np.数组(x)#包含x值的向量
yv=np.数组(y)#包含y值的向量
rv=np.数组(np.sqrt(x**2+y**2))
xss=np.数组(x)#包含起始值和(很快)结束值的向量
yss=np.数组(y)#同上
phiK=math.sqrt(2*DR*dt)#迭代中使用的常数
xyK=数学sqrt(2*DT*DT)
Odt=ω*dt
而nn-1
phi=phi+Odt+phiK*np.随机正态(0,1)#等式(9)
x=x+v*数学cos(φ)*dt+xyK*np.随机正态(0,1)#等式(10)
y=y+v*math.sin(phi)*dt+xyK*np.random.normal(0,1)#eq(11)
如果(x**2+y**2)>R**2:#如果粒子在边界外
如果abs(x)>R:#需要确保arccos(x/R)是有意义的
xn=np.符号(x)*R
θ=np.符号(y)*np.角((xn/R))#与粒子的角度
其他:
θ=np.符号(y)*np.角((x/R))#与粒子的角度
rp=np.粒子的数组([x,y])#r
rr=np.数组([np.cos(θ)*R,np.sin(θ)*R])#R,用于最接近粒子的边界
#d=rp-rr#颗粒到边界的最小距离
q=(2*np.linalg.norm(rr)/np.linalg.norm(rp))-1
x=q*np.数组(rp[0])#强制在边界内的x和y值
y=q*np.数组(rp[1])
phiv=np.append(phiv,phi)#将所有phi值添加到向量
xv=np.附加(xv,x)#将所有x值添加到向量
yv=np.append(yv,y)#将所有y值添加到向量的
rv=np.append(rv,(np.sqrt(x**2+y**2)))
n=n+1#迭代
返回(rv)
#打印(rv)
对于范围(2)内的i:#多次运行程序
datavector=np.array(0)
圆(1E5,1E-3,0*np.随机均匀(-1E-5,1E-5),0*np.随机均匀(-1E-5,1E-5),np.随机均匀(-2*np.pi,2*np.pi),1E-6300,1E-3,5*1E-6,0,2E-5)
datavector=np.append(datavector,rv)
np.savetxt('testet.txt',datavector)

未定义名称“rv”
表示在对变量执行操作之前未定义变量

根据您提供的信息,
rv
从未定义。最重要的是,您在每次迭代时都要重新初始化结果向量
datavector
,而它只应该在主循环之前初始化

我假设
rv
circle
的返回值

因此,对代码的更正应该如下所示:

datavector = []
for i in range(1000):
    rv = circle(N,dt,x0,y0,phi0,r,T,nu,v,Omega,R)
    datavector.append(rv)

您在循环之前定义过rv吗?第三行的
没有问题吗?您的变量
rv
没有在给定代码中的某个地方声明。只有
r
v
r
。您可能希望使用as
datavector=np进行平均。append(datavector,mean(r,v))
Yes,从圆(N,dt,x0,y0,phi0,r,T,nu,v,Omega,r):我得到了rv(我已经试着打印出来了)。但我无法将其中的1000个收集到一个数组中。我在函数循环中定义了rv,但不在范围(1000)中的for I循环中。我想让我的函数给我rv谢谢,我没有把rv=circle(N,dt,x0,y0,phi0,r,t,nu,v,Omega,r)作为问题所在!最后,我使用了范围(1000)内I的datav=np.ndarray(shape=(1000,1E5)):#运行程序多次rv=circle(1E5,1E-3,0*np.random.uniform(-1E-5,1E-5),0*np.random.uniform(-1E-5,1E-5),np.random.uniform(-2*np.pi,2*np.pi),1E-6300,1E-3,5*1E-5*1E-6,0)datav[I]=(rv)#打印(datav=datav.savev)转置('testet.txt',datav)