是否可以在每次调用时更新函数变量?



我正试图用solve_ivp求解ODE系统,每次解算器调用函数时,我都想更改函数的局部变量。特别是,我想更新拉格朗日乘子(lambdas_I(,以便solve_ivp的下一个时间步长使用上一个的值。("重构"函数来自python模块,该模块使用一种方法从给定时刻重构大小分布(有办法做到这一点吗?我会发布以下代码:

import time 
import numpy as np
import scipy.integrate as integrate
from numpy import sqrt, sin, cos, pi
import math 
import pylab as pp
from pymaxent import reconstruct

start = time.time()

'''Initialize variables'''
t=np.linspace(0, 60,31)
tspan=(0,60)
initial_m=[]
for i in range(4):
def distr(L,i=i):
return (L**i)*0.0399*np.exp(-((L-50)**2)/200)

m, err=integrate.quad(distr, 0, np.inf)
print('m(',i,')=',m)
initial_m.append(m)

''' Solving ode system using Maximum Entropy, G(L)=1+0.002*L'''
def moments(t,y):
m0 = y[0]
m1 = y[1]
m2 = y[2]
m3 = y[3]
Lmean=m1
σ=(m2-Lmean**2)**(1/2)
Lmin=Lmean-3*σ
Lmax=Lmean+4*σ
bnds=[Lmin,Lmax]
L=np.linspace(Lmin,Lmax)

sol, lambdas_i= reconstruct(mu=y ,bnds=bnds)
print(lambdas_i)

dm0dt=0

def moment1(L):
return(sol(L)+0.002*sol(L)*L)                
dm1dt, err1=integrate.quad(moment1,Lmin,Lmax)


def moment2(L):
return(2*L*(sol(L)+0.002*sol(L)*L))

dm2dt, err2=integrate.quad(moment2,Lmin,Lmax)

def moment3(L):
return(3*L**2*(sol(L)+0.002*sol(L)*L))

dm3dt, err3=integrate.quad(moment3,Lmin,Lmax)

return(dm0dt,dm1dt,dm2dt,dm3dt)
'''Χρήση της BDF, step by step'''
r=integrate.solve_ivp(moments,tspan,initial_m,method='BDF',jac=None,t_eval=t,rtol=10**(-3))
end = time.time()
print('Total time =',{end-start})

这里有一种实现您想要的东西的方法。我不会使用您的实际代码,而是使用一个更简单的示例问题,您可以使用相同的策略来解决您的问题。

def seq():
l = [1, 0]
while True:
p = l[1]
n = l[0] + p
l = [p, n]
print(n)
input()

上面是一个示例函数,它将打印斐波那契序列的下一个(或第一个(项。(其中每个项是前两个项的总和。(在这种情况下,input仅用于在每次迭代之间暂停(因为它是无限的(。现在,为了将其转换为生成器,以允许更大的灵活性,您可以将函数重写为:

def seq():
l = [1, 0]
while True:
p = l[1]
n = l[0] + p
l = [p, n]
yield n

现在,如果你想得到同样的结果,你可以:

for item in seq():
print(item)
input()

然而,这在很大程度上是无用的。当您想要收集序列的下一个数字时,生成器的点就出现了,但在代码的任何点。不一定在循环中重复,直到你完成为止。你可以做到这一点:

gen = seq()
next(gen) # returns 1
next(gen) # returns 1
next(gen) # returns 2
next(gen) # returns 3
next(gen) # returns 5

等等…


解决这个问题的另一种方法是使用全局变量而不是局部变量。

l = [1, 0]
def seq():
p = l[1]
n = l[0] + p
l[0] = p
l[1] = n
return n

变量l是在函数外部定义的,而不是在函数内部定义的,因此在函数退出时不会丢弃它。(要以与以前相同的方式运行代码:(

while True:
print(seq())
input()

这两者都应该可以在代码中实现。

相关内容

  • 没有找到相关文章

最新更新