Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一维输运方程(python)_Python_Differential Equations - Fatal编程技术网

一维输运方程(python)

一维输运方程(python),python,differential-equations,Python,Differential Equations,我正试图编写一个python程序,用有限差分法(迎风格式)求解一维对流方程。问题如下: 这是我所尝试的 from numpy import * from numpy.linalg import * from matplotlib.pyplot import * def u0(x): if (0.4 <= x <= 0.5): y = 10*(x - 0.4) elif (0.5 <= x <= 0.6): y = 10*(

我正试图编写一个python程序,用有限差分法(迎风格式)求解一维对流方程。问题如下:

这是我所尝试的

from numpy import *
from numpy.linalg import *
from matplotlib.pyplot import *

def u0(x):
    if (0.4 <= x <= 0.5):
        y = 10*(x - 0.4)
    elif (0.5 <= x <= 0.6):
        y = 10*(0.6 - x)
    else:
        y = 0
    return y

print('Choix de la vitesse de transport c : ')
c = float(input('c = '))

def solex(x, t):
    return u0(x - c*t)

print('Choix de pas h : ')
h = float(input('h = '))

print('Choix du pas dt et du temps final T : ')
dt = float(input('dt = '))
T = float(input('T = '))

# Maillage

N = int((1/h) - 1)
x = linspace(0, 1, N + 2)
M = int((T/dt) - 1)
t = linspace(0, T, M + 2)

# Itération

U1 = zeros(N)
U2 = zeros(N)
sol = zeros((N, M + 2))

for i in range(1, N + 1):
    U1[i - 1] = u0(x[i])

sol[:, 0] = U1

for j in range(1, size(t)):
    for i in range(1, N-1):
        U2[i] = U1[i] - c*(dt/h)*(U1[i] - U1[i - 1])
    sol[:, j] = U2
    U1 = U2
从numpy导入*
从numpy.linalg进口*
从matplotlib.pyplot导入*
def u0(x):

如果(0.4尽管你说你已经解决了你的问题,我仍然想建议一些一般性的改进:

  • 从numpy import*
  • 导入的通配符导入(如
    )被视为不好的做法,最好使用
    将numpy导入为np
    ,并将必要的函数引用为
    np.linspace
  • numpy
    的功能来自矢量化,因此请尝试用矢量化操作尽可能多地替换
    for
    -循环
  • 至少从您向我们展示的情况来看,变量
    U1
    U2
    实际上是不必要的
  • 对每个参数使用
    input
    ,可能有点过头了
  • 下面的代码包括我建议的改进。请注意,我是如何使用
    np将
    u0
    替换为矢量化版本的。分段
    ,并为
    -循环替换了几个
    。我还添加了一个可视化

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    def u0(x):
        y= np.piecewise(
            x,
            [(0.4 <= x)&(x <= 0.5),  (0.5 <= x)&(x<= 0.6)     ],
            [lambda x: 10*(x - 0.4), lambda x: 10*(0.6 - x), 0])
        return y
    
    c = 0.9
    h = 0.01
    dt = 0.01
    T = 2
    
    N = int(np.ceil(1/h))
    x = np.linspace(0, 1, N)
    M = int(np.ceil(T/dt))
    t = np.linspace(0, T, M)
    
    #solve with upwind scheme
    sol = np.zeros((N, M))
    sol[:,0] = u0(x)
    #you could add boundary values here by setting
    #sol[0,:] = <your_boundary_data>
    for i in range(1,len(t)):
        sol[1:,i] = sol[1:,i-1] - c*(dt/h)*(sol[1:,i-1] - sol[:-1,i-1])
    
    #Visualization
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    ax.set_xlabel('x')
    ax.set_ylabel('t')
    
    T, X = np.meshgrid(t, x)
    surf = ax.plot_surface(X, T, sol)
    
    将numpy导入为np
    将matplotlib.pyplot作为plt导入
    从mpl_toolkits.mplot3d导入Axes3D
    def u0(x):
    y=np.分段(
    x,,
    
    [(0.4你能告诉我们你得到了什么吗?你想要什么吗?我得到了一个满是零的向量,我知道我必须在步骤0,1中得到一个从0到1的向量。无论如何,我想我已经解决了它。我想问题在于I for循环中j for循环中的缩进。