#python #scipy #numerical-methods #differential-equations #pde
Вопрос:
У меня есть следующая система уравнений в частных производных:
Где С0 — константа, Р — независимые пространственные переменные, T и — время с переменной, Ф(Р, Т) — 1-й неизвестной функцией, f_t(Р, Т) — 2-й неизвестная функция (на самом деле он просто является первой производной от Ф по т: фт(р, т)), фр(р, т) — первой производной от Ф по Р, Фор(р, т) — второй производной от F В над Р
Неизвестные f(r, t) и f_t(r, t) должны быть найдены в диапазонах переменных r0..r1, t0..t1 (r0 = 5*10-4, r1 = 1, t0 = 0, t1 = 5*10-5)
Также существуют следующие начальные условия:
f(r, t0) = 0
f_t(r, t0) = 0
И граничное условие:
f_t(r0, t) = ...<a function which is defined by set of points>...
# e.g.: scipy.interpolate.interp1d(array_of_t_values, array_of_F_values, kind='linear')
Как мне определить все это и решить численно с помощью py-pde (или любой другой подходящей библиотеки) в python? А также мне нужно нарисовать результирующие поверхности f(r, t) и f_t(r, t)
Здесь ниже я попытался изменить существующий пример (py-pde), но я понятия не имею, как определить производные:
from pde import FieldCollection, PDEBase, UnitGrid
class MyPDE(PDEBase):
def __init__(self, c0=1500):
self.c0 = c0
def evolution_rate(self, state, t=0):
f, f_t = state
f = f_t
f_t = (f.diff(r, 2) 1/r * f.diff(r)) / self.c0
return FieldCollection([f, f_t])
grid = UnitGrid([32, 32])
state = FieldCollection.scalar_random_uniform(2, grid)
eq = MyPDE()
result = eq.solve(state, t_range=100, dt=0.01)
result.plot()
Комментарии:
1. Вы не должны быть слишком жадными с именами переменных (для производных), особенно строка
f = f_t
проблематична, так как вы хотите использоватьf
ее с исходным содержимым в следующей строке. ИспользуйтеDf, Df_t
для производных иDf = f_t
т. Д. /// Также разрешите квадратc0
, который находится в уравнении, но не в коде.2. @LutzLehmann проблема в том, что все это просто псевдокод. Я понятия не имею, как определить эти уравнения в коде.