python - 不需要列表理解乘法

标签 python python-3.x math list-comprehension

from math import sin

def euler(f, x0, t0, h, N):
   t = t0
   x = x0
   while t <= N:
      t += h
      x += [h * x  for x in f(t, x)]
      print(x)

def f(t, x):
   vv = [-x[0]**3 - x[0] + sin(t)]
   return vv

这是我的代码。 f 是一个函数,x0t0 时刻的初始条件,t0 是初始时间, >h是步长,N是步数。当我输入 >>>euler(f, [0.], 0., 1., 10) 我得到 [0.0, 0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.279415498 19892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893698] 这是不正确的。

我知道我的列表理解语句缺少一些东西,但我无法真正确定我缺少什么,因为我不知道它如何返回这些值。前 2 个值是正确的,之后,它会错误地计算剩余的值。

当我应该得到

0.0
0.8414709848078965
0.313474190234726
0.11031613198378529
-0.758145003910546
-0.5231547727660838
-0.1362327890906342
0.6595149938422956
0.7024955870270317
0.06543687806493725

使用此代码:

from math import sin
def euler(f, x0, t0, h, N):
   t = t0
   x = x0
   while t <= N:
       t += h
       x += h * f(t,x)
       print(t,x)

def f(t, x):
    vv = -x**3 - x + sin(t)
    return vv

最佳答案

试试这个:

from math import sin

def euler(f, x0list, t0, h, N):
    t = t0
    xlist = x0list
    while t < N*h:
        klist = f(t,xlist)
        xlist = [x+h * k  for x,k in zip(xlist,klist)]
        t += h
        print t,xlist

def f(t, xlist):
    return [ -x**3 - x + sin(t) for x in xlist ]

euler(f, [0.,-0.1,0.1], 0., 1., 10)

这假设您想要并行评估多个轨迹。

  • 请注意,下一步取决于 x 和斜率 k,后者又取决于 x。因此,您还需要在 f 中进行列表评估。
  • 通过 zip 对构建迭代器,关联的状态和斜率会配对在一起以计算下一个状态。
  • 另一种避免 zip 的方法是让函数 f 返回 (x,k) 对列表。
<小时/>

您当然也可以避免所有这些,并迭代 euler 的评估,其中仅计算一个轨迹。

关于python - 不需要列表理解乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40544852/

相关文章:

python - 在 Python 的多处理库中获取队列的长度

algorithm - 是否可以使用 32 位平方根的函数来帮助计算 64 位平方根?

java - 如何正确计算 Delta 机器人的直接运动学?

Python排列列表并将其写回文件

python - Tensorflow 对象检测 API,具有不同结果的教程

python - 在 for 循环中从字典中插入和删除——最佳方法?

math - 与旋转盒碰撞对象的线相交

python - 训练逻辑分类器

python - 如何设置 x 标签以在 Bokeh 图中显示日期时间?

python - 双星号错误: Invalid Syntax