一维输运方程(python)
我正试图编写一个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*(
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循环中的缩进。