【问题标题】:Python Iterative Loop Plot valuesPython 迭代循环图值
【发布时间】:2013-05-30 13:37:58
【问题描述】:

我正在尝试使用有限差分法在 python 中进行迭代计算。我从中找到了有限差分法:

http://depa.fquim.unam.mx/amyd/archivero/DiferenciasFinitas3_25332.pdf

代码计算的值是正确的。问题是它只显示最终值。我想要的是提取 x 方向上任何点的值,以便我可以绘制它们,以及提取任何时间点的值,例如计算中途点的值。这是进行迭代计算的正确方法吗?代码如下:

import numpy as np
import scipy as sp
import time
import matplotlib as p
L=0.005
Nx=3
T=5
N1=5
k=0.5
rho=1200
c=1000
a=(k/(rho*c))
x = np.linspace(0, L, Nx+1)   # mesh points in space
dx = x[1] - x[0]
t = np.linspace(0, T, N1)    # time
dt = t[1] - t[0]
toutside=5
Coefficient = a*dt/dx**2
bi=0.5
ui = sp.zeros(Nx+1)
u = sp.zeros(Nx+1)
for i in range(Nx+1):
  ui[i] = 50 # initial values

for n in range(0, N1):

   for i in range(0,1):
      u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i]
   for i in range(1,Nx):
      u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i]
   for i in range(Nx,Nx+1):
      u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i]
      ui[:]= u #updates matrix for next loop
 print ui

我已经根据 danodonovan 的回答修改了我的代码:

for n in range(0, N1):

for i in range(0,1):
    u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i]
for i in range(1,Nx):
    u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i]
for i in range(Nx,Nx+1):
    u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i]
    ui=u
    a=list(ui)

print a

当我尝试将整个列表从循环中取出时,只会产生最终值。如何提取整个列表?这是使用前一行的值进行迭代计算以计算新行的值的正确方法吗?

【问题讨论】:

    标签: python for-loop pde iteration


    【解决方案1】:

    首先,缩进print ui 以查看所有N1ui 的值。然后将结果附加到列表中:

    res = []
    for n in range(0, N1):
    
       for i in range(0,1):
          u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i]
       for i in range(1,Nx):
          u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i]
       for i in range(Nx,Nx+1):
          u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i]
          ui[:]= u #updates matrix for next loop
       print ui
       res.append(ui.copy())
    
    print res
    

    产生这个结果:

    [array([ 41.5625,  50.    ,  50.    ,  50.    ]),
     array([ 37.87109375,  48.41796875,  50.        ,  50.        ]),
     array([ 35.6628418 ,  46.73706055,  49.70336914,  50.        ]),
     array([ 34.06639099,  45.21682739,  49.20280457,  49.88876343]),
     array([ 32.79785633,  43.87349129,  48.58405113,  49.63152885])]
    

    【讨论】:

    • 我试过你的建议,但它只产生了迭代的最后一行。
    • 当然,您在每个时间步都覆盖了数组。添加.copy() 就可以了。提示:你真的应该看看 NumPy 教程并学习如何使用整个数组操作。您的代码可以大大改进。
    【解决方案2】:

    (如果我正确理解您的问题)使用matplotlib 您可以这样做

     import matplotlib as p
    
     # and after your loop has completed
    
     p.pyplot.plot(range(0, N1), ui, 'o-')
     p.pyplot.show()
    

    获取您的数据urange(0, N1) 的简单图。

    我不知道您希望 ui 变成 ui[:]= u 是一件奇怪的事情 - 它将 ui 的副本设置为 u 但您不会保留 @987654329 的副本@ui[:] 正在生产。

    提示:认为ui[:]list(ui) 相同

    【讨论】:

    • 我也不确定这是否是您想要的,每次迭代最后一个循环时,您都在重写 a
    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 2023-03-05
    • 1970-01-01
    • 2022-07-11
    • 2017-11-15
    • 2016-01-18
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多