Необходимо решить задачу теплопроводности на отрезке
При решении использовала явную схему
N = 10 # максимальное число шагов по хK = 10 # максимальное число шагов по tl = 1 # значение х на правой границеh = l / N # шаг сетки по хT = 1 # максимальное значение времени t на правой границеt = T / K # шаг сетки по времени# зададим сетку x_i = np.arange(0, N, h) # значения в узлах по хt_j = np.arange(0, K, t) # значение в узлах по tr_j = len(t_j) # количество узлов по tr_i = len(x_i) # количество узлов по xw_h_t = np.zeros([r_i, r_j]) # итоговая сетка размером x_i*t_j# зададим значение функции входящей в начальное уравнениеx = 0def f(x): retu np.sin(x)# граничные условияux_0 = 1 # граничное условие на левом конце при x=0ut_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])В результате получила вот такой график зависимости Х от рассчитанного значения функции в узлах сетки
Мне не понятно насколько неверно мое решение. Возникли проблемы с поиском частного решения, wolfram выдал u(x) = 1.54x+1+sinx, что мне кажется не верным, а самой решить не получилось. В учебнике Филиппова похожих примеров не нашлось, в сети ничего достаточно подробного, чтобы разобраться в решении не нашла. Подскажите где можно найти как решать аналитически такое уравнение и насколько неверно мое решение? В чем ошибка? И как вообще проверяют на корректность решения таких задач, кроме как сравнения с аналитическим решением?
В общем и целом разобралась. Решила дополнить свой вопрос отредактированным решением, возможно, кому-то пригодится. Численное решение правильно найти так и не удалось, но находится оно методом Фурье(разделение переменных). Итоговый график:
Рабочий код:
N = 10 # максимальное число шагов по хK = 500 # максимальное число шагов по tl = 1 # значение х на правой границеh = l / N # шаг сетки по хT = 1 # максимальное значение времени t на правой границеt = T / K # шаг сетки по времени# зададим сетку x_i = np.arange(0, 1, h) # значения в узлах по хt_j = np.arange(0, 1, t) # значение в узлах по tr_j = len(t_j) # количество узлов по tr_i = len(x_i) # количество узлов по xw_h_t = np.zeros([r_j, r_i]) # итоговая сетка размером x_i*t_j# зададим значение функции входящей в начальное уравнениеx = 0def f(x): retu np.sin(x)# граничные условияux_0 = 1 # граничное условие на левом конце при x=0ut_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
question@mail.ru
·