Численное решение системы 1-D уравнений в частных производных в python (py-pde lib или любой другой)

#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 проблема в том, что все это просто псевдокод. Я понятия не имею, как определить эти уравнения в коде.