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
是一个函数,x0
是 t0
时刻的初始条件,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/