gpt4 book ai didi

python numpy`函数数组(lambda函数)

转载 作者:行者123 更新时间:2023-11-28 18:10:05 24 4
gpt4 key购买 nike

我定义了一个 python 类来计算微分方程组的解。这样做我定义了一个名为 Rhs(右侧和侧面)的类,它应该代表 dy/dt(i-th) 的右侧和侧面此类包含一个浮点值(初始时间、初始值、最终时间)和一个函数(函数数组)为了定义这个数组,我简单地定义了 3 个 lambda 函数,它表示方程(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

这里的问题是当欧拉类调用函数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

这里的问题是:将 shape = 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] 在等式(函数数组)中,顺便说一句,如果我增加步数(减少增量)

最佳答案

这应该可行

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

关于python numpy`函数数组(lambda函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com