我定义了一个python类,以计算差分方程系统的解。为此,我定义了一个名为Rhs(右侧和右侧)的类,该类应表示dy / dt(i-th)的右侧和右侧,该类包含单个浮点值(初始时间,初始值,最终时间)和一个函数(函数数组)以定义此数组,我仅定义了3个lambda函数,该函数表示等式(i)并创建此函数的np.arrayfunc1 = lambda t,u : 10 * (u[1] - u[0])func2 = lambda t,u : 28 * u[0] - u[1] - u[0] * u[2] func3 = lambda t,u : -8/3 * u[2] + u[0]*u[1]然后以这种方式传递给rhs类:func = np.array([func1,func2,func3])y0 = np.array([1.,0.,0.])problem3 = rhs.Rhs(func,0.0,100.0,y0,1000) Rhs类是这样的: class Rhs: def __init__(self, fnum : np.ndarray , t0: np.float, tf: np.float, y0 : np.array, n: int , fanal = None ): self.func = fnum Rhs.solution = fanal self.t0 = t0 self.tf = tf self.n = n self.u0 = y0 def createArray(self): ''' Create the Array time and f(time) - the time array can be create now - the solution array can be just initialize with the IV ''' self.t = np.linspace(self.t0, self.tf, self.n ) self.u = np.array([self.u0 for i in range(self.n) ]) return self.t,self.u def f(self,ti,ui): return self.func(ti,ui) def Df(self,ti,ui): eps = 10e-6 return ((self.func(ti,ui)+eps) - self.f(ti,ui))/eps这里的问题是当euler类调用该函数时 fclass Explicit: def __init__(self, dydt: rhs.Rhs, save : bool=True, _print: bool=False, filename : str=None): self.dydt = dydt self.dt = (dydt.tf-dydt.t0)/dydt.n self._print = _print def solve(self): self.time, self.u = self.dydt.createArray() for i in range(len(self.time)-1): self.u[i+1] = self.u[i] + self.dt*self.dydt.f(self.time[i],self.u[i])这里的问题是:这是将shape = 1000,3的向量u传递给函数的正确方法(以便使用在lambda函数系统中应用于3向量索引的3函数..)不明白的是为什么在C ++中我没有遇到这个问题,请看这里:我不知道的所有类层次结构都以哪种方式计算出这个东西
2 回答
largeQ
TA贡献2039条经验 获得超7个赞
这应该工作
def f(self,ti,ui):
return np.array([function(ti,ui) for function in self.func])
宝慕林4294392
TA贡献2021条经验 获得超8个赞
self.u = np.array([self.u0 for i in range(self.n) ])
还应该给您带来问题,因为这会产生带有u0
行的矩阵或2d数组,而不是预期的副本。你可能想要
self.u = np.array([self.u0[i] for i in range(self.n) ])
或更容易
self.u = self.u0.copy()
添加回答
举报
0/150
提交
取消