Трехмерный движок в коде… ДНК
В предыдущих выпусках:
1. Трехмерный движок на формулах Excel для чайников
2. Трехмерный движок внутри запроса SQL
Эта статья началась с шуточного ответа коллеги на мой вопрос о том, на какой популярный язык разметки портировать трехмерный движок в очередной раз.
Вообще, меня всегда интересовало, на что может быть похоже программирование внутриклеточных процессов. Как выглядят переменные, условия и циклы? Как вообще можно управлять молекулами, которые просто свободно перемещаются в цитоплазме?
Ответ довольно неожиданный — lingua franca для моделирования сложных процессов в клетках является реакции вида
Эти реакции моделируются при помощи закона действующих масс, который одинаково работает и в химии, и в молекулярной биологии.
— Неужели при помощи этих примитивных реакций можно что-то программировать?
— Да, а то, что написано выше, вычисляет .
В этом пошаговом туториале мы вместе взорвем себе мозг, чтобы получить 14 таких реакций, которые производят рендер трехмерного куба.
Потом я расскажу, как полученные реакции скомпилировать в код ДНК, который можно синтезировать в лаборатории и (если очень повезет) получить трехмерный куб из двумерного массива пробирок.
Как обычно, я сделал веб-приложение с эмулятором таких реакций, в котором можно поупражняться в «реактивном» программировании. Вы сможете удивлять химиков способностью вычисления конечных концентраций в сложных системах реакций методом пристального взгляда.
Для понимания статьи никаких предварительных знаний не требуется, необходимые сведения из школьной программы по биологии мы повторим в начале статьи. Также мы разберем типичные паттерны, которые использует эволюция для достижения сложного поведения в живых клетках.
Дисклеймеры
- Я никак не связан с биологией. Это просто пятничная статья программиста для программистов о малознакомом предмете.
- В этой статье точно есть куча фактических ошибок и терминологических косяков. Например, я только недавно узнал, что молекулярная биология и биохимия — не одно и то же. Если вы нашли что-то подобное — буду безумно рад комментариям в личку.
- Весь материал был непозволительно упрощен, чтобы не грузить читателя лишними подробностями. Я старался избегать специфических терминов, где это возможно (например, «шагающие белки» вместо «кинезины»). Многие примеры взяты вперемешку от бактерий и многоклеточных организмов и могут никогда не встречаться вместе.
- У любого утверждения обязательно будет множество исключений. Любое перечисление неполное. Примеры нерепрезентативные.
Статья будет состоять из трех частей, как если бы биологу, математику и программному инженеру дали исследовать одну и ту же задачу.
Эта часть посвящена краткому обзору примеров механизмов, которые позволяют клеткам управлять своими процессами подобно скриптам bash у системных администраторов.
Содержимое этой части не требуется для понимания последующих. Ее цель — дать примерное представление о том, что может скрываться за буками и т.д. в реакциях, которые будут рассматриваться далее, а также заинтересовать читателя, чтобы он захотел прочесть статьи в википедии про описываемые сюжеты.
Сразу предупрежу, что обзор не полный и не самый корректный. Если я пишу что-то про то, почему эволюция выбрала конкретное решение — воспринимайте это как полную спекуляцию.
1.1 Вспоминаем основы
Из чего состоит клетка:
- ДНК — двухцепочечная спираль, состоящая из последовательности 4 нуклеотидов: A, C, G, T.
- РНК — одноцепочечная спираль, которая может переносить копии участков ДНК (но не только, об этом подробнее в соответствующей главе).
- Белки
- Являются цепочками, которые составлены из 20 аминокислот.
- Удивительной особенностью является то, что эти цепочки самопроизвольно складываются в сложные стабильные структуры.
- Способны выполнять практически любые функции в клетке: строительный материал, катализаторы реакций, транспортировка веществ, передача сигналов и т. д.
- Остальные молекулы — например, глюкоза или клетчатка.
Белки и ДНК созданы друг для друга как Paint и BMP.
- В ДНК может кодироваться только информация о белках.
- Принцип кодирования простой: тройки нуклеотидов кодируют одну аминокислоту.
- Участок ДНК, кодирующий белок, называется ген.
- Начало и конец гена обозначены специальными «метками»: промотор, терминатор, старт-кодон, стоп-кодон. Это довольно большая тема, в котору мы не будем углубляться в этой статье.
- Между этими участками располагается некодирующая ДНК, которую некоторые пренебрежительно называют «мусорной».
Белки получаются из ДНК в два этапа:
- Транскрипция: РНК-полимераза прикрепляется к ДНК и делает копию одного из её генов в виде РНК.
- Трансляция: РНК попадает в рибосому, которая синтезирует последовательность аминокислот. После синтеза эта цепочка под действием химических связей сворачивается в белок нужной формы.
1.2 Белки — объекты первого класса в клетках
Подобно конструктору Лего, белки:
- состоят из небольшого числа стандартных элементов (аминокислот),
- легко собираются и разбираются,
- не такие прочные, как обычные объекты, хотя если грамотно продумать их структуру, могут быть достаточно прочными,
- идеально совместимы между собой,
- при этом без проблем способны взаимодействовать и с объектами внешнего мира.
В бытовом понимании, белки представляются таким «строительным материалом» для мышц, в котором не ожидаешь найти сложного поведения. В биологии же они имеют репутацию нано-роботов, которые способны выполнять нетривиальные задачи в клетке.
Приведем несколько примеров белков со сложным поведением:
- Пожалуй, самый крутой белок в клетке и один из самых сложных — рибосома. По сути это принтер, в который на вход подается РНК, а на выходе печатается белок, который в ней закодирован.
- Если мы можем синтезировать белки, то нужно их и утилизировать, точнее разбирать обратно на аминокислоты. Для этого есть «сборщик мусора» из мира белков ― протеасома.
- Как протеасома понимает, какие белки разбирать? Достаточно пометить любой белок специальной белковой меткой ― убиквитином.
- По какому принципу ставятся эти метки? Этим занимаются белки, называемые убиквитинлигазами.
- Для меня было неожиданно узнать, что для получения энергии важную роль играет белок АТФ-синтазы, который содержит вращающиеся части и работает подобно ветряной мельнице: ссылка на видео.
1.3 Паттерны проектирования белков
Белки, подобные перечисленным в предыдущей главе, являются достижением длительной эволюции и используются только для задач сопоставимой сложности и важности. Если же нужно быстро добавить новую функциональность, эволюция предпочитает декомпозировать задачу на несколько белков, составленных по стандартным паттернам.
Рассмотрим несколько примеров паттернов.
- Allosteric regulation ― способность белков распознавать молекулы определенного вида и захватывать их.
- DNA-binding domain ― часть белка, которая позволяет белку проверить участок ДНК на соответствие короткому регулярному выражению и закрепиться на нем. В отличие от CRISPR, этот механизм не подразумевает возможность редактировать этот участок.
- Фосфорилирование ― возможность пометить белок «флагом общего назначения» в виде остатка фосфорной кислоты. Чаще всего этот флаг имеет семантику временного отключения активности белка.
Хорошая новость: паттерны могут комбинироваться. Например:
- «Если удалось захватить молекулу триптофана, то активировать поиск ДНК по регулярному выражению и закрепиться на нем»
Это настоящий белок, называемый «триптофановый репрессор».
Источник: www.rcsb.org/3d-view/1TRO/1
На картинке выше он показан закрепленным на молекуле ДНК. Красным показаны молекулы триптофана.
Точное значение регулярного выражения в привычном для программистов смысле я не нашел (это где-то в этой работе), но судя по комментариям к 3d-модели, последовательность TGTACTAGTTAACTAGTAC
под него должна подходить.
Также белки позволяют производить внутри себя операцию логического отрицания:
- «Если молекулы аллолактозы НЕТ, то активировать поиск ДНК по регулярному выражению и закрепиться на нем»
Это настоящий белок, называемый «лактозный репрессор».
Хочу пояснить, что эти оба белка встречаются только у бактерий кишечной палочки, однако их механизм был открыт одним из первых, поэтому их часто приводят в пример в учебниках биологии.
1.4 Плохие новости
Трагедия с белками состоит в том, что ученые могут всех подробностях изучать механизмы взаимодействия белков и знать исходные последовательности аминокислот, но с невероятным трудом могут создавать новые белки с заданными свойствами.
Более того, даже «элементарная» на первый взгляд задача определения структуры белка является недостижимой по сложности на данном этапе развития вычислительной техники. Только вдумайтесь: известно, что цепочка из аминокислот единственным образом сворачивается в некоторую пространственную структуру из любого своего начального положения и мы практически бессильны в том, чтобы повторить этот процесс.
Порядок цифр такой: год работы суперкомпьютера позволяет моделировать первые 3 наносекунды процесса сворачивания белка. Есть замечательная игра Foldit, где люди могут соревноваться в способности сворачивать белки и иногда они получают решения не хуже полученных другими методами.
Таким образом мы можем сколько угодно фантазировать на тему, как мы могли бы добавить в наши клетки белки с определенными свойствами, чтобы «пофиксить» какой-нибудь процесс, но будем бесконечно далеки от того, чтобы получить заветную последовательность ДНК.
Как же мы тогда собираемся портировать трехмерный движок в код ДНК? Для этого мы воспользуемся читом и будем использовать ДНК не совсем по прямому назначению. Но не будем забегать вперед.
1.5 Как белки узнают, куда им нужно двигаться?
При изучении процессов в клетке может сложиться впечатление о белках как о таких «юнитах» из компьютерных игр, которые знают, куда им нужно двигаться и с чем взаимодействовать. Или клетка может представляться как завод с конвеерными лентами, которые доставляют сторительные материалы туда, где они нужны.
На самом деле аналогия с конвеерными лентами действительно имеет место быть — это называется микротрубочками. По ним перемещаются удивительные «шагающие белки», которые потребляют АТФ в качестве топлива (вы наверняка видели эти видео).
Но большинство процессов в клетке происходит без участия микротрубочек. Белки (как любые молекулы) просто перемещаются в цитоплазме случайным образом. Таким образом триптофановый репрессор будет пытаться присоединиться абсолютно ко всему, что есть в клетке, пока не наткнется на последовательность TGTACTAGTTAACTAGTAC
. К счастью, геном кишечной палочки состоит всего лишь из 4 млн. пар нуклеотидов — в 1000 раз меньше, чем у людей.
По степени безумия для программиста эта идея сравнима с сортировкой массива случайными перестановками, пока массив не будет отсортирован целиком. Это даже хуже, чем полный перебор!
Эта идея покажется не такой плохой, если учесть факторы, которые нам трудно представить в макромире:
- Даже в простых клетках находится много белков: >40 млн.
- При этом различных видов белков не так много, например 1800 у кишечной палочки.
- Эти белки двигаются хоть и случайно, но очень и очень быстро в масштабах клетки.
- К тому же это движение происходит в трехмерном пространстве, про которое наша интуиция случайных блужданий работает хуже.
1.6 Сферическая клетка в вакууме
Если рассматривать клетку бактерии, у которой нет ядра и эндоплазматического ретикулума, а также не учитывать микротрубочки, получается следующая картина.
Внутри клетки находится равномерно распределенный суп из разнообразных белков, молекул, ДНК и РНК, которые случайным образом друг с другом сталкиваются и иногда взаимодействуют.
Где-то внутри этого супа происходит процесс биосинтеза белков: РНК-полимераза присоединяется к случайным участкам ДНК, пока не найдет метку начала гена. Она делает копию этого гена в виде РНК, которая спустя какое-то время попадает в рибосому. Рибосома синтезирует закодированный белок.
Каким-то магическим образом (мы это рассмотрим чуть позже) белки точно с такой же скоростью уничтожаются, чтобы клетка не «лопнула».
Тут необходимо сделать важное пояснение, что если взять любую не бактериальную клетку, то в ней будет множество «отсеков» (органелл), которые более-менее изолированы друг от друга. Это довольно существенная деталь, которая позволяет значительно усложнить поведение клетки. В частности, вероятно, бактерии не способы образовывать многоклеточные организмы в том числе потому, что у них органеллы практически отсутствуют. Но чтобы не усложнять повествование, мы далее везде будем рассуждать про клетку без органелл, хотя будем обсуждать и механизмы типа альтернативного сплайсинга, которых нет у бактерий.
Если рассмотреть клетку, которая ничего не делает и которой не нужно делиться, то ее основную функцию можно сформулировать как поддержание постоянства концентраций белков в своем составе.
Даже поддержание постоянства своего состава не такой элементарный процесс.
- Белки непрерывно самопроизвольно деградируют и их нужно постоянно пополнять с правильной скоростью.
- Для синтеза необходимо обеспечивать достаточное количество строительных материалов.
- Также нужно учитывать, что какие-то вещества из тех, которые синтезируются в клетке, могут уходить вовне или приходить извне.
- Поэтому клетке нужно иметь какую-то обратную связь, чтобы переставать или начинать их синтезировать в зависимости от ситуации.
Мы пришли к тому, что даже самой простой клетке жизненно необходимо контролировать скорость синтеза своих белков в зависимости от внешних факторов. Но если внимательно посмотреть на процесс синтеза, то мы увидим, что хоть он и случайный, но на него пока не влияют никакие внешние факторы.
1.7 Как одни белки могут влиять на синтез других белков
Итак, нам нужен какой-нибудь способ влиять на активность синтеза определенных белков. Правильно это называется «регуляция экспрессии генов».
Я бы провел аналогию с ядерным реактором, в котором управление происходит путем опускания и поднимания стержней. Так же и для управления процессами в клетке достаточно контролировать уровни экспрессии отдельных генов.
Идея состоит в том, чтобы вставить «костыль» в какое-нибудь место механизма синтеза белков, чтобы мешать ему это сделать. Если их нет ― уровень экспрессии максимальный.
Один из типичных примеров ― это знакомый нам триптофановый репрессор.
- Он способен крепиться к ДНК, мешая РНК-полимеразе делать копию соответствующих генов, тем самым подавляя их экспрессию.
- При этом его механизм крепления к ДНК активируется только если обнаруживается молекула триптофана.
- Получается, что если триптофан есть, то гены «включены», если нет ― выключены.
Обратите внимание, что этот механизм может использоваться для получения логических конструкций: если перед каким-то геном есть несколько способов вставить «костыль», то ген будет экспрессироваться только если ни один костыль не сработал. Таким образом мы получаем возможность реализации отрицания ИЛИ.
1.8 РНК ― когда данные имеют структуру в прямом смысле
Рибонуклеиновая кислота, вероятно, является самой важной технологией в истории жизни на Земле. Потому что без РНК невозможен синтез белков и репликация ДНК, при этом РНК способна выполнять и функции белков, и ДНК. Собственно, в этом и состоит идея гипотезы мира РНК.
На первый взгляд, в РНК нет ничего интересного — это та же ДНК, только без дублирования информации.
Еще хуже, в РНК во всей своей красе проявляется принцип комплементарности. То есть нуклеотиды A и U, а также G и C постоянно стремятся соединиться в пару. Единичные такие связи не очень прочные, однако если нашлись два длинных комплементарных участка, то они склеятся почти намертво. С учетом теории вероятностей, практически невозможно придумать такую длинную цепочку РНК, которая не могла бы сама с собой как-нибудь склеиться.
После такой склейки, РНК вполне может стать нечитаемым. При попадании такой «петли» (биологи их называют «шпильками») в рибосому, она либо застрянет, либо отвалится, не закончив задание печати.
Казалось бы, это просто катастрофа с точки зрения передачи информации. Однако это открывает и новые возможности:
- Мы можем делать разные прочные конструкции из РНК и использовать их для тех же целей, что и белки. Нередко белки имеют внутри себя каркасные вставки из РНК.
- Эти петли можно использовать как еще один механизм вставки «костылей» в процесс биосинтеза белков.
Наверное, это уникальный случай, когда физический носитель, на котором записан код, взаимодействует с объектами, которыми этот код манипулирует.
1.9 Это просто шедевр применения плохих практик
Сейчас мы рассмотрим второй механизм контроля экспрессии группы генов, связанных с синтезом триптофана (первый мехинизм испольузет триптофановый репрессор, чтобы помешать РНК-полимеразе сделать копию соответствующей группы генов).
Итак, задача состоит в том, чтобы при недостатке триптофана включить экспрессию группы генов, связанных с его синтезом. При этом триптофан это не случайная молекула, это — аминокислота, то есть она используется рибосомой для синтеза белков.
То есть нам нужно как-то помешать рибосоме синтезировать участок РНК, если триптофан есть в достаточном количестве.
- Первая идея: давайте попробуем поставить много кодонов, кодирующих триптофан подряд. Если триптофана мало, то рибосома приостановится т.к. рядом не будет необходимых «строительных материалов». Но таким образом мы получили обратное поведение: при отсутствии триптофана последующие гены будут экспрессироваться меньше.
- Вторая идея: оказывается, можно сделать такой набор «шпилек» из РНК, который будет работать по принципу «лежачего полицейского». То есть если рибосома движется медленно, то она спокойно проходит сквозь шпильки, если двигается быстро — то застряет и отваливается.
Комбинируя эти две идеи мы получаем желаемое поведение.
Попытаюсь перефразировать в офисных терминах. Представьте, что вам нужно заставить принтер печатать заявку на закупку красного тонера, если он подходит к концу. Для этого вы разрабатываете такую бумагу, которая вызывает замятие, если много страниц печатаются подряд. Затем вы посылаете на принтер много заданий по принципу: пять страниц красных рисунков и одно черно-белое заявление на покупку красного тонера.
- Если красной краски достаточно, то принтер будет печатать красные страницы подряд, что вызовет замятие. Заявление напечатано не будет.
- Если краски мало, то он будет печатать медленно и без замятия в конце концов дойдет до последней страницы и распечатает заявление.
1.10 Don’t repeat yourself в коде ДНК
Эта глава и вставка в следующей частично основаны на лекции Михаила Гельфанда, которую он читал для студентов факультета компьютерных наук ВШЭ. Рекомендую посмотреть ее целиком.
Удивительно, что эволюция способна приходить и к хорошим практикам там, где это критично для выживания. Например:
- В иммунной системе необходимо вырабатывать пары антител и B-лимфоцитов с одинаковыми рецепторами.
- Если лимфоцит распознает какой-то антиген, то начинают вырабатываться антитела, которые распознают и нейтрализуют этот же антиген.
- То есть два разных гена должны содержать два абсолютно одинаковых участка, иначе будут большие проблемы с имунной системой.
- При этом мутации поощряются, главное — чтобы они происходили одновременно в двух белках.
Для решения подобных задач у эукариот имеется альтернативный сплайсинг — это полноценные директивы препроцессора в коде ДНК. Его обеспечивает еще один супер-наноробот из белков и РНК, называемый сплайсосомой.
Сплайсосома работает с РНК и ищет в ней специальные маркеры начала и конца на любом расстоянии друг от друга, после чего удаляет все, что находится между ними.
Этот механизм позволяет решать разнообразный спектр задач:
- Можно просто закомментировать любой участок ДНК. Предполагается, что альтернативный сплайсинг появился, чтобы как-то спастись от вирусов, которые научились повсюду встраивать копии своего кода.
- Обеспечить одинаковые копии одного участка ДНК в разных белках.
- Условная конструкция, в которой в белок попадает один из двух альтернативных участков.
- Можно компактно закодировать большое разнообразие белков, которые состоят из множества альтернативных частей и избежать комбинаторного взрыва длины кода.
Вы только представьте, какой потенциал для сложного поведения открывает альтернативный сплайсинг в комбинации с РНК-шпильками! И это мы только затронули малую часть из изученных механизмов.
1.11 Почему клетки отличаются друг от друга
Я плохо учил биологию в школе, поэтому мне до недавнего времени не давал покоя следующий вопрос: если все клетки содержат одинаковую ДНК, почему тогда клетки отличаются друг от друга?
Если начать над ним думать, то попутно возникает второй вопрос: зачем вообще клеткам иметь одинаковый ДНК? Почему нельзя, например, аккуратно закомментировать какой-нибудь участок, который нужно отключить у данной конкретной клетки, а потом перед копированием его аккуратно раскомментировать?
- Если обнаруживается проблема в коде ДНК, клетка пытается исправить ее всеми имеющимися способами, например:
- если произошла вставка лишнего нуклеотида, либо потеря существующего, это определяется по комплементарной паре и исправляется,
- если произошел разрыв, попытаться «сшить» его на месте,
- найти резервную копию этого участка в парной хромосоме от второго родителя и скопировать ее оттуда.
- Если неконсистентность не удается устранить, то с клеткой могут начать происходить самые нехорошие вещи, которые в лучшем случае в какой-то момент будут замечены и клетка самоликвидируется.
- По этим причинам чаще всего эволюционные эксперименты с редактированием ДНК длятся недолго.
Эволюция нашла элегантное с точки зрения архитектуры решение проблемы иммутабельности ДНК: метилирование. Это дополнительный битовый слой метаданных, который позволяет отключать участки ДНК, не меняя их. Чаще всего метилирование используется для постоянного отключения ненужных клетке участков генома, в момент, когда она приобретает специализацию.
Хорошо, с персистентностью настроек разобрались, а как клетка определяет свою специализацию? Для этого необходимо затронуть тему межклеточного взаимодействия.
Клеточная мембрана подобно фаерволлу позволяет определять довольно сложные политики того, какие белки и молекулы могут поступать извне или уходить вовне. В частности, клетки постоянно обмениваются сигналами (белки и другие молекулы), которые координируют поведение клеток.
Отдельная большая тема, выходящая за рамки данной статьи — как организовать правила обмена сигналами между клетками, чтобы они могли скоординироваться и определить, какая из них будет головой, руками и т.д. Уверен, те, кто имел дело с распределенными системами или клеточными автоматами, без проблем смогут придумать такой протокол.
1.12 Итог: откуда берется сложность в живых клетках?
На первый взгляд, клетке для поддержания жизнедеятельности не требуется особо сложной логики. Она должна просто следить за постоянным уровнем элементов, участвующих в метаболизме, контролировать получение и расход энергии, а также обеспечивать вывод токсинов.
С другой стороны, чтобы доставить человека на Луну тоже не требуется сложной логики. Нужно просто следить чтобы реактивный двигатель работал с нужной интенсивностью, уровень кислорода в кабине был постоянным, а углекислый газ не накапливался.
Это мы еще не затронули процесс копирования клетки, на который приходится большая часть сложности клеточных механизмов.
Если провести не очень корректное сравнение с обычным софтом (например, для управления заводом), то я бы осторожно предположил, что один белок соответствует одной строке кода из нескольких арифметических и логических операций.
Поэтому тот факт, что в клетке человека насчитывается порядка нескольких десятков тысяч видов белков, даже немного удивляет — как-то мало для управления такой сложной системой.
Если пофантазировать, что когда-то будут «программисты» клеточных процессов, то они скорее будут вести проектирование в масштабе графов взаимодействий абстрактных частиц («сигнальных путей»), чем на уровне структуры отдельных белков.
А это значит, что если мы хотим реализовать трехмерный движок, то нужно перейти к математике!
В первой части мы поняли, что многие процессы в клетке можно представить в виде модели системы частиц, которые равномерно перемешаны в некотором ограниченном пространстве и взаимодействуют друг с другом при «столкновении».
Безусловно, современные биологические модели опираются на гораздо более сложную математику. Однако многие их части можно приблизить законом действующих масс и, если мы разберемся с ним, то у нас появится базовая интуиция для понимания многих процессов в клетке.
Вероятно, системы реакций на законе действующих масс — одна из самых минималистичных архитектур, на которых можно реализовывать более-менее сложные вычисления. При этом это не какая-то абстрактная вычислительная машина, а модель, которая в некотором приближении работает во всех живых клетках.
Например, вот полное описание алгоритма рендера трехмрного куба в виде системы реакций, от начала и до конца:
$$display$$ \begin{align} B + A &\rightarrow B + N\\ C + A &\rightarrow C + O\\ D + A &\rightarrow D + P\\ N &\rightarrow T + H\\ Q &\rightarrow U + H\\ T + U &\rightarrow K + K\\ O &\rightarrow V + I\\ Ω &\rightarrow W + I\\ V + W &\rightarrow L + L\\ P &\rightarrow Φ + J\\ S &\rightarrow Γ + J\\ Φ + Γ &\rightarrow M + M\\ K + L &\rightarrow E\\ H &\rightarrow L + Z\\ I &\rightarrow K + Z\\ E + M &\rightarrow F\\ Z &\rightarrow M + G\\ J &\rightarrow E + G\\ G + F &\rightarrow 0\\ G &\xrightarrow{0.01} G + A + R \end{align} $$display$$
Вы можете проверить эту систему в симуляторе, она обозначена там как «minimalist 3d engine».
2.1 Чему равно A + B
Чтобы понять закон действующих масс, достаточно разобраться, как работает следующая реакция:
У нас есть абстрактные частицы , и одинакового размера. Когда и сталкиваются, получается .
Допустим, в пространстве объёма 1 равномерно размешано , и штук этих молекул. Как будет меняться их количество со временем?
Если молекулы являются точками, то вероятность их столкновения всегда равна нулю независимо от количества. Поэтому модель должна учитывать их размер. К тому же, если частицы двигаются быстро, то столкновения будут происходить чаще. То есть скорость также надо учитывать. Но вместо того, чтобы учитывать все эти параметры по отдельности, в законе действующих масс есть одна константа — частота столкновения двух частиц в объеме 1. Если она не равна единице, то записывается над стрелкой:
Таким образом, если , , то частота столкновений и будет равна . Заметим, при увеличении с сохранением частота будет увеличиваться линейно (это вредно строго при условии, что молекулы не взаимодействует друг с другом и не сталкиваются, а проходят насквозь). Из аналогичных соображений частота столкновений пропорциональна , поэтому для нашей реакции будет следущий ответ: столкновений и в единицу времени.
Но мы пока не учитывали, что и превращаются в и числа постоянно изменяются. Давайте возьмём маленький отрезок времени и посчитаем изменение этих переменных. Всего произойдёт столкновений. Тогда и уменьшатся на , а — увеличится на .
Вот и все описание реакции. Далее эту частоту столкновений в единицу времени мы будем называть скоростью реакции.
Реакции с несколькими видами частиц справа (они называются продуктами реакции)
моделируются точно так же, просто тогда концентрации всех молекул в правой части уменьшаются на .
В принципе вот и вся модель, на которую бы собираемся портировать трехмерный движок!
Такие модели применяют в химии, физике и биологии. В принципе ей можно моделировать и распределение вирусов в толпе людей или динамику популяций животных.
2.2 Моделирование реакций
Вы можете моделировать реакции при помощи интерактивного ObservableHQ-ноутбука.
Самая важная вещь, которую нужно понимать, что есть два вида графиков, которые показывают, что происходит с реакцией. Верхний показывает изменение концентраций частиц во времени, а нижний — предельные концентрации в зависимости от разных начальных значений одной из частиц.
То есть, если попытаться изобразить связь между ними, получится как-то так:
2.3 Примеры простых реакций
На первый взгляд, все реакции выглядят одинаково. Однако спустя некоторые время вы научитесь различать множество их видов.
3.10 Как это будет реализовано в коде ДНК?
3.1 Алгоритм трехмерного движка
Итак, перед нами стоит задача придумать самый простой из возможных алгоритмов, который производит рендер чего-то трехмерного. Сначала нужно определиться с объектом:
- Сфера — это просто круг с пятном, который можно нарисовать и без реализации движка.
- Куб гораздо лучше подходит для этой роли. В принципе и куб можно нарисовать без движка как 3 четырехугольника с фиксированными координатами, но я считаю это не спортивным. Мы будем писать простой, но настоящий трехмерный движок!
- В идеале хотелось бы что-то посложнее, например, куб с вырезанной сферой. Но с учетом того, что используемый нами компилятор ДНК еще в альфа-версии, лучше начать с чего-то простого.
В качестве алгоритма будем использовать уже знакомый из прошлых статей ray marching. Я подробно описал принцип его работы в статье про Excel. В кратком изложении он выглядит так:
- Вход: координаты пикселя, выход: яркость пикселя.
- По координатам текущего пикселя определить соответствующий трехмерный луч, выходя