首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumPy odeint输出额外变量

NumPy odeint输出额外变量
EN

Stack Overflow用户
提问于 2013-06-04 03:18:56
回答 1查看 1.5K关注 0票数 3

在Numpy中使用odeint进行模拟时,保存中间变量的最简单方法是什么?

例如:

代码语言:javascript
复制
def dy(y,t)
    x = np.rand(3,1)
    return y + x.sum()

sim = odeint(dy,0,np.arange(0,1,0.1))

在模拟过程中保存存储在x中的数据的最简单方法是什么?理想情况下,位于传递给odeintt参数中指定的点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-04 23:38:01

破解odeint的一个简便方法是将对odeint的调用包装在一个类的方法中,将dy作为另一个方法,并将self作为参数传递给您的dy函数。例如,

代码语言:javascript
复制
class WrapODE(object):
    def __init__(self):
        self.y_0 = 0.
        self.L_x = []
        self.timestep = 0
        self.times = np.arange(0., 1., 0.1)

    def run(self):
        self.L_y = odeint(
            self.dy,
            self.y_0, self.times,
            args=(self,))

    @staticmethod
    def dy(y, t, self):
        """"
        Discretized application of dudt

        Watch out! Because this is a staticmethod, as required by odeint, self
        is the third argument
        """
        x = np.random.rand(3,1)
        if t >= self.times[self.timestep]:
            self.timestep += 1
            self.L_x.append(x)
        else:
            self.L_x[-1] = x
        return y + x.sum()

需要明确的是,这是一个容易陷入陷阱的黑客攻击。例如,除非odeint正在执行Euler单步执行,否则dy的调用次数将超过您指定的时间步数。为了确保每个y都有一个xif t >= self.times[self.timestep]:块中的猴子业务在一个数组中挑选一个点,用于存储times向量中每个时间值的数据。您的特定应用程序可能会导致其他疯狂的问题。请确保为您的应用程序彻底验证此方法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16904202

复制
相关文章

相似问题

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