首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python numpy ` `array of function (lambda函数)

python numpy ` `array of function (lambda函数)
EN

Stack Overflow用户
提问于 2018-07-09 01:32:32
回答 2查看 1.7K关注 0票数 3

我定义了一个python类来计算微分方程组的解。为此,我定义了一个名为Rhs (right and side)的类,它应该表示dy/dt(i-th)的右边和右边。这个类包含一个浮点值(初始时间,初始值,最终时间)和一个函数(函数数组)为了定义这个数组,我简单地定义了3个λ函数,表示方程(I),并创建了这个函数的np.array

func1 = 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类调用函数f

class 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])


      Explicit.solved = True 

      print('here')

      if self._print:
          with open(filename) as f:
              print('here')
              for i in range(len(self.u)):      
                f.write('%.4f %4f %4f %4f' %(self.time ,self.u[0,i], self.u[1], self.u[2]))


      if self.save:
         return self.time,self.u

这里的问题是:将形状= 1000,3的向量u传递给函数的正确方法是什么(以便在lambda函数系统中使用应用于3向量索引的3函数。)我不明白的是为什么在C++中我没有得到这个问题,看看这里:,all the class hierarchy,我不知道用哪种方法计算这个东西

这是错误:

Traceback (most recent call last):
  File "drive.py", line 94, in <module>
    main()
  File "drive.py", line 63, in main
    fet,feu = fwdeuler_p1.solve()
  File "/home/marco/Programming/Python/Numeric/OdeSystem/euler.py", line 77, in solve
    self.u[i+1] = self.u[i] + self.dt*self.dydt.f(self.time[i],self.u[i])
  File "/home/marco/Programming/Python/Numeric/OdeSystem/rhs.py", line 44, in f
    return self.func(ti,ui)     
TypeError: 'numpy.ndarray' object is not callable

编辑感谢回复..但不幸的是没有:(这是错误消息:

drive.py:31: RuntimeWarning: overflow encountered in double_scalars
  func2 = lambda t,u : 28   * u[0] - u[1] - u[0] * u[2]
drive.py:32: RuntimeWarning: overflow encountered in double_scalars
  func3 = lambda t,u : -8/3 * u[2] + u[0]*u[1]
drive.py:31: RuntimeWarning: invalid value encountered in double_scalars
  func2 = lambda t,u : 28   * u[0] - u[1] - u[0] * u[2]
/home/marco/Programming/Python/Numeric/OdeSystem/euler.py:77: RuntimeWarning: invalid value encountered in add
  self.u[i+1] = self.u[i] + self.dt*self.dydt.f(self.time[i],self.u[i])

非常感谢你的帮助!你有其他的解决方案吗?

@LutzL我不需要复制u0,self.u0是shape=3,self.u应该是1000,3 (1000行)这3列分别表示等式(函数数组)中的u[0],u[1],u[2],顺便说一下,如果我增加步数(减少增量)

EN

回答 2

Stack Overflow用户

发布于 2018-07-09 02:16:57

这应该是可行的

def f(self,ti,ui):
    return  np.array([function(ti,ui) for function in self.func])
票数 1
EN

Stack Overflow用户

发布于 2018-07-10 19:52:06

  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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51234469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档