【问题标题】:Each looping return a result每个循环返回一个结果
【发布时间】:2009-11-14 15:51:01
【问题描述】:

我是初学者,遇到了问题,现在真的要解决了。

代码如下:

n=3   #time step
#f, v and r are arrays,eg [3,4,5]
#r,v,f all have initial array which is when n=0
def force():
    r=position()
    f=r*2
    return f

def position(n):
    v=velocity(n)
    for i in range(n):    #This part may wrong...
        r=v*i             #How can I return results when i=0,1...5?
    return r

def velocity(n):
    f=force
    for i in range(n):
        v=f*i              #Same problem here.....
    return v

另一个问题是力量。它是位置的函数,它是速度的函数,而速度是力的函数。所以,这是一种逻辑循环。我什至不能 开始。从物理上讲,它最初应该在 time=0 时从 force 开始,然后进行循环。但我只是不知道如何在 Python 中做到这一点。 还有如何让r,v的行随着时间的演变而成为结果?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    你可以使用yield。

    
    def velocity(n):
      f=force
      for i in range(n):
        v=f*i
        yield(v)
    
    

    for vel in velocity(n): //do something

    一个工作示例。一旦产生,它将打印功能测试的输出。所以你不需要等待循环的下一次迭代。

    
    import time
    def test():
      for i in range(10):
        time.sleep(i)
        yield(i)
    
    

    for k in test(): print k

    【讨论】:

    • 感谢重播,但我不太明白 yield 有什么作用?
    • +1 用于使用生成器。在我看来,这是一个被低估/使用过的功能。
    • 我已更改为 yield,但是当我调用该函数时它给出了 '''' ..似乎是一个错误..我怎样才能让这三个函数运行?他们搞砸了,如何开始?谢谢
    • 您到底想要达到什么目标,您的初始输入是什么?
    • 对我造成的混乱感到抱歉。初始输入只是n(时间步长),我想要的是代码给出两个数组,一个用于r,一个用于v,它们的行对应于i = 0,1,2,3...n,这个代码正在尝试模拟 2 星之间的重力。感谢您的帮助
    【解决方案2】:

    看起来您正在尝试执行欧拉算法并且在循环中有点混淆。这是我认为它应该看起来的样子(我假设这是为了游戏而不是家庭作业......如果是为了家庭作业,你应该清楚地说明这一点,所以我们不会给出完整的答案,就像我在这里做的那样.)

    这个例子是一个弹簧上的球,我认为你的目标是。我就是这个例子,我的初始条件是沿 x-z 轴对角抛出,并且我还包括重力(如果您不打算使用向量,则可以将所有向量替换为标量,例如 t, x , v = 0., 0., 2.; 等等)。

    from numpy import *
    
    # set the start conditions, etc.
    n_timesteps = 100
    dt, m, k = .1, 1., 2. # timestep, mass, spring-const (I'll write the equations correctly so the units make sense)
    t, x, v = 0., array([0.,0.,0.]), array([2., 0., 2.])  # initial values
    gravity = array([0., 0., -9.8])  # to make the problem a little more interesting
    result = zeros((4, n_timesteps))
    
    # run the simulation, looping through the timesteps
    for n in range(n_timesteps):
        # do the calculation
        f = -k*x + gravity
        a = f/m
        v += a*dt
        x += v*dt
        # store the results
        t += dt  # just for easy record keeping
        result[0,n] = t
        result[1:4, n] = x
    

    请注意,for 循环在时间步上循环(并且向量上的所有循环都是由 numpy 广播处理的,例如 f = -k*x+gravity,还有什么更容易的?)。另请注意,首先设置力,然后我们沿着导数积分链向下工作,然后回到顶部并再次从力开始。 (你说得对,这有点不对称,实际上我们应该同时更新它们,或者类似的东西,这是欧拉方法的缺陷,但它对于小时间步长来说足够好。)

    这就是情节的样子......球按预期摆动

    编辑:澄清您的问题:基本上,您的代码问题不是您暗示的“启动功能”的问题;相反,您的代码以错误的方式解决了问题,因此您需要修复该方法。看起来您正在尝试迭代每个函数的时间步。 这是不正确的!相反,您需要通过时间步进行包络迭代,并且对于每个时间步,更新所使用的每个变量的当前状态在计算中在那个时间步。您可以将此更新编写为单独的函数,或者例如,您可以像我一样内联执行它。但是在每个变量计算函数中迭代时间步是没有意义的。相反,为了让您的示例有意义,forcevelocity 和其他函数应该在当前时间步具有输入内容,并返回对该变量状态的更新以在下一个时间步中使用。看看我的例子是如何做到的:它只是循环遍历时间步和 within 每个时间步循环它按顺序更新所有变量,将每个更新的变量基于在它之前更新的变量 当前时间步长

    【讨论】:

    • 感谢重播,但是,我的问题中真正的问题是如何启动这些功能,(我有初始条件),谢谢
    【解决方案3】:

    您需要使用 append 来添加到列表中。

    def position(n):
        v=velocity(n)
        r = array()
        for i in range(n):    #this part may wrong...
            r.append(v*i)             #how can I return results when i=0,1...5?
        return r
    

    【讨论】:

    • 感谢重播,是的,我将使用 append,但它似乎并不能真正解决问题..
    【解决方案4】:

    你可以使用列表推导:

    def position(n):
        v=velocity(n)
        return [v*i for i in range(n)]
    

    或者,因为您使用的是 numpy:

    v=np.array([1,2,3])
    # array([1, 2, 3])
    

    您可以使用 numpy 广播一击表达整个计算:

    i=np.arange(5)
    # array([0, 1, 2, 3, 4])
    
    v[:]*i[:,np.newaxis]
    # array([[ 0,  0,  0],
    #        [ 1,  2,  3],
    #        [ 2,  4,  6],
    #        [ 3,  6,  9],
    #        [ 4,  8, 12]])
    

    在上述计算中,i 中的标量值(例如 0,1,2,3,4)分别与数组 v 相乘。结果被收集在一个二维 numpy 数组中。每行对应一个不同的值i。 有关 numpy 广播的介绍,请参阅 http://www.scipy.org/EricsBroadcastingDoc

    @OP:解决您关于“逻辑循环”的问题: 通常,您所做的是定义系统的“状态”。也许在您的情况下,状态将由一个元组(时间、位置、速度)组成。然后,您将定义一个函数,该函数将状态元组作为输入并返回一个新的状态元组作为输出。

    给定一个(时间,位置,速度),可以计算力(主要从旧位置)。然后根据力计算新的速度。根据速度,您可以计算出一个新位置。

    不要先写代码。

    在这种情况下,请用纸和铅笔坐下来,用一个具体的例子手工进行计算。做足够的迭代,直到你清楚地看到计算是如何完成的模式。步骤的顺序是什么?哪些部分会重复? 亲手看懂怎么写,python代码怎么写就清楚了。

    【讨论】:

    • 非常感谢,它有帮助!但是还是有一点问题,看看我的函数关系..真的很乱,我该如何解决?再次感谢
    • 我添加了一些关于如何解决“逻辑循环”的建议。
    • 非常感谢,你说的和我导师说的完全一样,这很重要,我想我已经对物理学有清楚的了解,只是不知道如何翻译成python代码,再加一点:有起始位置,v,r,f都有初始数组(当n = 0时)。那么它应该计算f(n = 1)然后用它来更新v(n = 0)到v( n=1),然后用 v(n=1) 更新 r(n=0) 到 r(n=1),然后用 r(n=1) 更新 f(n=1) 到 f(n=2) ....依此类推,直到完成 n。
    猜你喜欢
    • 2018-06-05
    • 2014-10-26
    • 2021-09-24
    • 2013-12-18
    • 2020-05-06
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多