求解时,我使用了显式方案
N = 10 # максимальное число шагов по х
K = 10 # максимальное число шагов по t
l = 1 # значение х на правой границе
h = l / N # шаг сетки по х
T = 1 # максимальное значение времени t на правой границе
t = T / K # шаг сетки по времени
# зададим сетку
x_i = np.arange(0, N, h) # значения в узлах по х
t_j = np.arange(0, K, t) # значение в узлах по t
r_j = len(t_j) # количество узлов по t
r_i = len(x_i) # количество узлов по x
w_h_t = np.zeros([r_i, r_j]) # итоговая сетка размером x_i*t_j
# зададим значение функции входящей в начальное уравнение
x = 0
def f(x):
return np.sin(x)
# граничные условия
ux_0 = 1 # граничное условие на левом конце при x=0
ut_0 = np.cos(x_i) # граничное условие при t=0
# найдем значения на нулевом слое при t=0 ut_0 = np.cos(x_i)
w_h_t[0] = np.cos(x_i)
# найдем значения w_h_t на первом и последующих слоях
const = t / (h**2)
for j in range(1, len(x_i)-1):
for i in range(len(w_h_t[j])-1):
w_h_t[j+1, i] = w_h_t[j, i] + const * (w_h_t[j,i] - 2*w_h_t[j,i] + w_h_t[j, i-1]) + t*f(x_i[j])
w_h_t[j+1, 0] = 1
w_h_t[j+1, len(w_h_t[i])-1] = w_h_t[j+1, len(w_h_t[i])-2] + h * t_j[j+1]
plot_ = np.arange(0,len(w_h_t)-1,1)
for y in plot_:
plt.plot(x_i, w_h_t[y])
结果,我收到了这样一张关于 X 对网格节点处函数计算值的依赖性的图表
我不明白我的解决方案有多么错误。寻找私人解决方案时遇到问题,wolframu(x) = 1.54x+1+sinx
表示在我看来这不是真的,但我自己无法解决。菲利波夫的教科书中没有类似的例子;我在网上没有找到足够详细的东西来理解解决方案。告诉我在哪里可以找到如何解析地求解这样一个方程以及我的解法有多错误?错误在哪里?除了与解析解进行比较之外,他们通常如何检查此类问题的解的正确性?
总的来说,我明白了。我决定用经过编辑的解决方案来补充我的问题,也许它对某人有用。无法正确找到数值解,但可以通过傅里叶方法(变量分离)找到。最终图表:
工作代码:
N = 10 # максимальное число шагов по х
K = 500 # максимальное число шагов по t
l = 1 # значение х на правой границе
h = l / N # шаг сетки по х
T = 1 # максимальное значение времени t на правой границе
t = T / K # шаг сетки по времени
# зададим сетку
x_i = np.arange(0, 1, h) # значения в узлах по х
t_j = np.arange(0, 1, t) # значение в узлах по t
r_j = len(t_j) # количество узлов по t
r_i = len(x_i) # количество узлов по x
w_h_t = np.zeros([r_j, r_i]) # итоговая сетка размером x_i*t_j
# зададим значение функции входящей в начальное уравнение
x = 0
def f(x):
return np.sin(x)
# граничные условия
ux_0 = 1 # граничное условие на левом конце при x=0
ut_0 = np.cos(x_i) # граничное условие при t=0
# найдем значения на нулевом слое при t=0 ut_0 = np.cos(x_i)
w_h_t[0] = np.cos(x_i)
# найдем значения w_h_t на первом и последующих слоях
const = t / (h**2)
for j in range(len(w_h_t) - 1):
for i in range(len(w_h_t[j]) - 1):
w_h_t[j + 1, i] = w_h_t[j, i] + const* (w_h_t[j, i+1] - 2 * w_h_t[j, i] + w_h_t[j, i - 1]) + t*f(x_i[i])
w_h_t[j + 1, 0] = 1
w_h_t[j + 1, len(w_h_t[i])-1] = w_h_t[j + 1, len(w_h_t[i])-1] + h