Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Python – калькулятор – 2. Sympy

leave a comment »

Намагаюсь тут вивчити матан для функцій багатьох змінних щоб зрозуміти як працюють штучні мережі. Для цього використовую Brilliant.org, такий собі гейміфікований сайт для вивчення математики. І враховуючи те що я там вже за 1200 задач зробив, гейміфікація таки працює.

Задачі там варіюються від “знайди x – ось він”, які можна розв’язувати однією рукою, поки іншою штовхаєш коляску парком. Наприклад:

Капітан Кортевеґ причалив біля пірсу, і його човен здійняв одиночну хвилю. Капітану стало цікаво, погнав за хвилею і на ходу виявив що висота води в залежності від часу і позиції в просторі h(x, t) описується рівнянням:

\frac{\partial h}{\partial t} + \frac{\partial^3 h}{\partial x^3} + 6h\frac{\partial h}{\partial x} = 0

Який найбільший порядок похідної в цьому рівнянні?

І ти такий думаєш: “Та ось він!”. Вписуєш відповідь на одну цифру, і переходиш до наступного завдання.

А потім капітан думає як розв’язувати те рівняння. І дають підказку, що розв’язок – це

h(x, t) = \frac{2}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)^2}

Знайдіть значення c, яке задовольняє вищенаведене рівняння Кортевега – де Фріза.

І ти собі такий, ок, треба знайти кожну похідну, додати і прирівняти до нуля. Добре що дали розв’язок і треба знайти лише константу, бо дифрівняння я все ще не вмію розв’язувати, для того треба вміти інтегрувати. Але все одно без паперу не обійтись. Вдома списую пару листочків:

\frac{\partial h}{\partial t} = \frac{2 c \left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)^{3}}

\frac{\partial h}{\partial x} = \frac{2 \left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)^{3}}

З вищими степенями з’являється проблема, бо \left({u \over v}\right)' = {{u'v-uv'} \over {v^2}}, експоненти від диференціювання не спрощуються, а навпаки з них вилазять ще множнки і кількість всяких знаків у виразі зростає. Я десь плутаю знак, і починаю все спочатку.

Далі ще думаю що можна виразити похідну через h, а так як ми вже знаємо формулу для диференціювання h, то використати її кілька разів:

\frac{\partial h}{\partial x} = h \frac{\left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)}

\frac{\partial^3 h}{\partial x^2} = \frac{\partial h}{\partial x} \frac{\left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)} + h \frac{\partial}{\partial x} \frac{\left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)}

\frac{\partial h}{\partial x} можна підставити з попередньої і уникнути зайвої роботи:

\frac{\partial^2 h}{\partial x^2} = h \frac{\left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)^2}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)^2} + h \frac{\partial}{\partial x} \frac{\left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)} =

= \frac{h}{\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)^2} \left( \left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)^2 + \frac{1}{2} \left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)^2 - \left(e^{\frac{1}{2}(x - ct)} - e^{-\frac{1}{2}(x - ct)}\right)\left(e^{\frac{1}{2}(x - ct)} + e^{-\frac{1}{2}(x - ct)}\right)  \right)

Що далі можна було б якось спростити, але в цьому місці я реально замахався. Може б спробував продовжити, якби оце не треба було продиференціювати ще раз.

Тому подумав про важку артилерію – систему комп’ютерної алгебри. В тому курсі навіть радили – не вчіть на пам’ять всю табличку інтегралів (вона все одно неосяжна), краще навчіться використовувати Wolfram Alpha. Мені синтаксис Wolfram ліньки освоювати, тому я вирішив подивитись що може Python.

pip install sympy
from sympy import *
x, c, t = symbols('x c t') # оголосити змінні 
half = 
h = 2 / (exp(0.5 * (x - c*t)) + exp(-0.5 * (x - c * t)))**2 # наша функція 
eq = diff(h, t) + diff(h, x, x, x) + 6 * h * diff(h, x) # ліва частина рівняння
print(latex(eq)) # Надрукувати Latex цього виразу

Отож, треба всього лише знайти c для якого наступний вираз дорівнює нулю:

- \frac{2 \left(-2 + \frac{3 \left(- e^{- \frac{c t}{2} + \frac{x}{2}} + e^{\frac{c t - x}{2}}\right)^{2}}{\left(e^{\frac{- c t + x}{2}} + e^{\frac{c t - x}{2}}\right)^{2}}\right) \left(e^{\frac{- c t + x}{2}} - e^{\frac{c t}{2} - \frac{x}{2}}\right)}{\left(e^{\frac{- c t + x}{2}} + e^{\frac{c t - x}{2}}\right)^{3}} + \frac{2 \left(c e^{- \frac{c t}{2} + \frac{x}{2}} - c e^{\frac{c t}{2} - \frac{x}{2}}\right)}{\left(e^{- \frac{c t}{2} + \frac{x}{2}} + e^{\frac{c t}{2} - \frac{x}{2}}\right)^{3}} + \frac{24 \left(- e^{- \frac{c t}{2} + \frac{x}{2}} + e^{\frac{c t}{2} - \frac{x}{2}}\right)}{\left(e^{- \frac{c t}{2} + \frac{x}{2}} + e^{\frac{c t}{2} - \frac{x}{2}}\right)^{5}}

Виявляється sympy і таке вміє. Наприклад:

simplify(eq) # спросити вираз

Дає таке:

\frac{2 \left(c e^{x} - c e^{c t} - e^{x} + e^{c t}\right) e^{c t + x}}{e^{3 x} + e^{3 c t} + 3 e^{c t + 2 x} + 3 e^{2 c t + x}}

Це вже дуже легко розв’язати. Але й це можна доручити комп’ютеру:

solve(eq) # розв'язує рівняння в якому вираз eq = 0
# дає: [{c: 1}, {c: log(exp(x))/t}]

І так, виявляється 1 – правильна відповідь. (Другу відповідь можна ігнорувати, бо то не константа)

Після такого починаєш поважати людей які це все обчислили руками. Я навіть при спробі відтворити результати для цього поста помилився в формулі, через що спрощення зациклилось а потім перевищило допустимий рівень рекурсії, а solve взагалі відмовилось розв’язувати.

І це звичайно чітерство, бо так я повільніше вчитимусь диференціювати. Але з іншого боку, за ті 10 років що пройшли відколи мене навчили диференціювати, я диференціював на може разів 2. І в той час як хтось опановує навики які роботи скоро вмітимуть краще, чи варто вчити щось що роботи вже вміють краще? 🙂 Краще вчитися з роботами співпрацювати.

Advertisements

Written by bunyk

Березень 3, 2019 at 11:10

Опубліковано в Інструменти, Конспекти

Tagged with ,

Напишіть відгук

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out /  Змінити )

Google photo

Ви коментуєте, використовуючи свій обліковий запис Google. Log Out /  Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out /  Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out /  Змінити )

З’єднання з %s

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.

%d блогерам подобається це: