сукцессия 16. Общий обзор, в основном что бы другие ии поняли
Запись от anaschu размещена 29.06.2026 в 23:34
Показов 1101
Комментарии 0
|
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в истории и без риска повторить уже закрытые вопросы или принять черновики за финальные решения. --- ## 0. Кто что хочет и в каком стиле работать Пользователь — научный сотрудник, разрабатывает экосистемную модель микоризной сукцессии (переход растительных сообществ луг → кустарники → широколиственный лес → хвойный лес, опосредованный сменой типа микоризы AM → EcM → возможно ErM). Не имеет опыта программирования на Python и прямо просил двигаться через тестирование, без угадывания параметров. **Важно для тона работы:** пользователь — соавтор реальных научных статей по моделированию роста мицелия (клеточные автоматы, кинетика Михаэлиса-Ментен, см. раздел 4). Это не любитель, а профессионал в своей области, который учится конкретно Python и конкретно TDD-практикам. Относиться к его гипотезам нужно с тем же уровнем критической проверки, что и к любым научным гипотезам — не отбрасывать с порога, но и не принимать без проверки на внутреннюю непротиворечивость и согласие с литературой. **Важно про риторический стиль некоторых материалов:** часть текстов пользователя (см. раздел 5) написана в нарративном, антропоморфизирующем стиле ("грибной эгоизм", "фосфорные войны", "предательство", "сейф полифосфатов"). Пользователь явно подтвердил, что это **мнемонический приём**, а не претензия на буквальную агентность гриба. Не нужно повторно поднимать этот вопрос как этическую проблему — он закрыт. Но при переносе этих идей в код или формулы стоит по умолчанию использовать нейтральные термины (избирательная передача ресурса, истощение пула, переключение партнёра), оставляя цветистые названия только как пояснительные синонимы. --- ## 1. Структура файлов и где что искать В разговоре фигурировали следующие исходники (если они не приложены к новому чату, нужно явно попросить пользователя прислать их снова): - **`a.alp`** (`integralModel_base9_mycoryzae/integralModel_base9.alp`) — САМЫЙ ПЕРВЫЙ AnyLogic-проект, на основе которого делался Python-перевод. Содержит классическую кинетику Чантера-Торнли/Топажа с явным потолком биомассы. См. раздел 3 — оттуда извлечены все параметры роста. - **`b.alp`** — более новая версия той же AnyLogic-модели, ближе к текущему Python-коду по структуре синтеза фермента (зависимость от `W_Fung` напрямую, не от `dWm`, как в `a`). - **`params.py`, `sd_core.py`, `agents.py`, `cycle.py`, `main.py`** — ОСНОВНОЙ Python-перевод EcM-ядра (пятиагентная модель: гриб, MHB-помощник, сапротроф-конкурент, фауна, растение). Это то, что подвергалось рефакторингу в разделе 2. **Статус: рефакторинг начат, но НЕ завершён** (см. раздел 2.4 — критическая находка про calibration-баг). - **`fungus_core.py`** (из архива `fungal-succession.zip`, вместе с параллельными `agents.py`, `cycle.py`, `main.py`, `params.py`) — ОТДЕЛЬНОЕ, более новое черновое **AM-ядро** (арбускулярная микориза), написанное пользователем как намеренный "шаг 1" перед добавлением перехода AM→EcM. Использует `solve_ivp(method='Radau')` — неявную схему, уже без явного Эйлера. **Статус: черновик, по признанию пользователя нуждается в той же проверке, что EcM-ядро** (см. раздел 3.4). - **Список инвариантов и проверок** — зафиксирован в артефакте `checks_list.md` (создан в ходе разговора, есть приоритетный раздел 0 про clipping и явную схему — см. раздел 2 ниже, там же текст целиком воспроизведён по смыслу). Если у пользователя сохранились другие материалы (упоминались "записи", возможно в экспорте старых чатов) — стоит спросить прямо, не предполагая, что они релевантны без проверки (был случай, когда присланный архив оказался экспортом личных данных другого аккаунта, не относящимся к делу — такие файлы открывать не нужно, только если пользователь явно укажет конкретный нужный фрагмент текстом). --- ## 2. EcM-ядро (`sd_core.py` и связанные файлы): статус рефакторинга ### 2.1. Что было найдено изначально (баги, подтверждённые экспериментально) 1. **4-кратная зависимость результата от шага интегрирования.** При dt=1.0ч модель давала W_Fungus≈130г за 500ч, при dt=0.1ч — ≈488г за тот же интервал. Причина — явный метод Эйлера на жёсткой системе (резкие пороговые события + насыщающая кинетика Михаэлиса-Ментен). 2. **Накопитель `W_lyg_pol` застревал на нижнем ограничителе (50г)** практически весь 500-часовой прогон — clipping-защита от ухода в минус маскировала то, что реальный поток разложения был равен нулю необоснованно долго. 3. **Разрыв связи:** `SaprotrophAgent.step()` принимает параметр `W_lyg_pol_total`, но `cycle.py` никогда его не передаёт (всегда `None`) — сапротроф изолирован от общего пула лигнина, конкуренции с грибом нет. 4. **pH статичен:** `H_plus_out` от гриба копится в `f.H_plus_total`, но pH среды — фиксированный параметр, не накопитель. Закисление считается, но не влияет обратно на систему. ### 2.2. Принятые решения по рефакторингу (зафиксированы, не отменены) - **Приоритет 0 (выше всех остальных правок):** - Не использовать произвольный clipping (`max(0, x)` с порогом вроде `70.0`) как защиту от минуса. Заменить проверкой по машинной точности (`~1e-9` относительно масштаба величины) — ловит только погрешность округления, не маскирует ошибки величиной в десятки грамм. - Перейти с явного метода Эйлера на неявную схему через `scipy.integrate.solve_ivp` с методом `'Radau'` или `'BDF'`. - Балансовый тест (conservation check): сумма потоков должна совпадать с дельтой накопителей на каждом шаге. - Полный список из 23 пунктов проверок + раздел "Приоритет 0" зафиксирован в артефакте `checks_list.md` — стоит запросить у пользователя этот файл или восстановить по смыслу из этого документа, если файл недоступен. ### 2.3. Что было РЕАЛЬНО переписано в `sd_core.py` Код был переписан на `solve_ivp(method='Radau')`, с явным разделением накопителей (`STATE_VARS`) и правой частью `_rhs()`. Clipping заменён на проверку машинной точности с явным исключением (`ValueError`) при нарушении баланса за её пределами. `k_lag` сделан функцией абсолютного времени, а не накопителем-событием. ### 2.4. КРИТИЧЕСКАЯ НАХОДКА — рефакторинг вскрыл, что число 109.6г было артефактом После устранения clipping модель **перестала воспроизводить эксперимент Анненкова** (целевое 109.6г за 500ч). Без читерского скачка `W_lyg_mon` к 70г на первом шаге, гриб в честной версии практически не растёт — теряет массу на опад, рост близок к нулю. **Причина, установленная диагностически (не предположение):** old-версия (явный Эйлер + clipping) на первом шаге материализовала 70г мономерного лигнина "из ниоткуда" через `max(70.0, ...)`, и именно этот фиктивный резервуар кормил весь дальнейший рост гриба через формулу `growth`. Без этого артефакта реальная скорость диффузии фермента (`Z_flac_mc`) и синтеза (`MF_flacc_m`) в текущей параметризации недостаточны для значимого роста за 500 часов. Проверено и исключено: увеличение `Z_flac_mc` на 3 порядка не помогает — бутылочное горлышко не в скорости диффузии, а в том, что сам источник фермента (`W_flac_m`, пропорциональный текущей `W_Fung`) истощается синхронно с падающей биомассой гриба — система входит в самоусиливающуюся спираль убывания с первого шага. **Вывод: верификация против эксперимента Анненкова в исходной модели держалась на баге, а не на физике.** Это означает, что простая починка clipping недостаточна — нужна **повторная калибровка** нескольких параметров вместе, или (что выяснилось позже, см. раздел 3) — нужно вернуть в формулу роста структуру с логистическим потолком по Топажу (`Am`), которой не было в текущем Python-переводе вовсе. **СТАТУС НА МОМЕНТ ПЕРЕДАЧИ: рефакторинг `sd_core.py` приостановлен на этом месте.** Следующий шаг — не "доделать", а пересмотреть структуру формулы роста с учётом раздела 3 ниже, прежде чем калибровать заново. --- ## 3. Параметры из `a.alp` (первоисточник) — извлечены, но не перенесены в код При сравнении текущего Python-кода с исходным AnyLogic-проектом `a.alp` обнаружено, что Python-перевод структурно ближе к **`b.alp`** (более позднему упрощению), а не к `a.alp`. В `a.alp` использовалась полная структура роста Чантера-Торнли/Топажа с явным потолком, которая при упрощении в `b` и далее в Python была утрачена. ### 3.1. Извлечённые формулы и параметры из `a.alp` (формула роста мицелия) ``` dWm = (Um - Wm*Mm) * YGm Um[гриб] = ( (Wm*q*Sm*(Am-Wm)/Am) / YGm + Mm*Wm/(1+alpha/Sm) ) * TFunct_Ucc * error_Vmax_ph_Ucc * Um_K_err ``` Где: - `Wm` — текущая биомасса мицелия - `Am = Wc/200` — **динамический потолок биомассы**, пропорциональный текущему запасу субстрата в среде (`Wc`). НЕ фиксированная константа. - `YGm = 0.83` — эффективность роста (г мицелия / г сахара) - `Mm = 0.041/24 ≈ 0.00171` ч⁻¹ — базовое дыхание поддержания - `q = 0.000024/24 ≈ 1e-6` м³/(г·ч) — коэффициент субстрат-лимитированного роста - `Sm = Smg/V_m` — концентрация субстрата в мицелии (с защитой от деления на 0 в самом исходнике — хороший прецедент для наших же инвариантов) - `alpha = 2000` — смягчающий делитель в члене поддержания. **ВАЖНО: сам автор оригинальной модели (предположительно пользователь в прошлом) оставил в `a.alp` комментарий: "Нечто странное и непонятное. Присвоим-ка пока это нулю"** — то есть это не доверенная калибровочная константа, а признанная автором слабость модели. НЕ переносить механически без переосмысления. - `TFunct_Ucc`, `error_Vmax_ph_Ucc`, `Um_K_err` — температурная и pH- корректирующие функции, в этом документе формулы не извлечены, нужно искать в `a.alp` дополнительно при необходимости. ### 3.2. Прямое следствие для рефакторинга EcM-ядра Член `(Am-Wm)/Am` — это логистическое торможение роста при приближении к динамическому потолку. Его ОТСУТСТВИЕ в текущем Python-коде — вероятная структурная причина (помимо самого clipping-бага), почему модель без костыля скатывается в нисходящую спираль, а не выходит на устойчивый рост: без верхнего ограничителя система либо взрывообразно растёт, либо (при недостаточном начальном импульсе) затухает, без промежуточного устойчивого режима, который давала бы логистика. **Рекомендация для следующего шага:** при возвращении к EcM-ядру — сначала восстановить структуру `(Am-Wm)/Am` с `Am`, зависящим от доступного субстрата, и только потом заниматься повторной калибровкой `Z_flac_mc`/`MF_flacc_m`. Делать это в обратном порядке (калибровать параметры без структуры потолка) пользователь уже пробовал неявно — именно это и привело к зависимости от clipping-бага. ### 3.3. Трёхзонная структура мицелия (для EcM) — согласована, не реализована в коде В ходе разговора (независимо от находок в `a.alp`) была согласована биологически обоснованная структура EcM-мицелия из трёх зон: 1. **`W_core`** — ядро под чехлом эктомикоризы, наивысший метаболизм, основной продуцент ферментов, питается углеродом (сахаром) от растения-хозяина. 2. **`W_tips`** — кончики гиф, неинкапсулированы, метаболически активны (хотя ниже, чем ядро), добывают минеральные ресурсы из среды. 3. **`W_old`** — старые внечехольные гифы, инкапсулированы, метаболизм на порядки ниже (см. раздел 4 — статья 2017г даёт количественную оценку: внешние/молодые гифы потребляют ресурсы на ПЯТЬ ПОРЯДКОВ быстрее внутренних/старых из-за инкапсуляции). **Потоки между зонами (согласовано):** - `W_core → W_tips`: снабжение периферии (рост), пропорционально притоку сахара и текущей массе. - `W_tips → W_old`: естественное старение/инкапсуляция (характерное время — недели). - `W_old → опад`: физическое удаление старых внечехольных гиф (характерное время — около МЕСЯЦА — это отдельный механизм от инкапсуляции, не то же самое, что переход tips→old). - **`W_tips ↔ W_core`: двунаправленный градиентный перенос** (по аналогии с материнско-дочерним механизмом из статьи автора 2017г, см. раздел 4.1) — направление и скорость зависят от разности концентраций ресурса между зонами, БЕЗ участия порога, работает всегда. - **Поверх градиентного переноса — редкий активный механизм ресорбции**: триггер — относительный (не абсолютный!) дефицит `W_core` ниже фиксированной доли от "нормального" уровня. По договорённости с пользователем, "нормальный уровень" = `Am/10` (десятая часть от динамического потолка Топажа, см. 3.1). Делитель (10) — открытый параметр калибровки, может быть позже изменён на 5 или 20. При срабатывании триггера масса забирается из `W_tips`/`W_old` напрямую в `W_core`, минуя обычный градиентный механизм. - Порог дефицита — **по уровню, не по скорости** (явно подтверждено пользователем, со ссылкой на прецедент из статьи Рахимовой и др. 2018г про Aspergillus, см. раздел 4.2, где авторы тоже выбрали пороговый уровень, а не сравнение скоростей, и явно объяснили почему). **СТАТУС: эта структура согласована словесно и математически (формулы потоков обсуждены), но НЕ реализована в коде ни для одного файла.** Следующий шаг в работе — написать `sd_core_v2.py` (или аналогично названный) с этой трёхзонной архитектурой, объединяющей находки из разделов 3.1–3.3, на неявной схеме `solve_ivp`. ### 3.4. Та же структура для AM-ядра (`fungus_core.py`) — с поправкой пользователя Пользователь подтвердил: AM-микориза тоже должна иметь: - **Потолок роста** (аналог `Am` из Топажа) — это универсальное свойство, не специфичное для типа микоризы. - **Структуру `W_core`/`W_tips`**, НО с явным архитектурным ограничением: у AM нет развитого внешнего мицелия (в отличие от EcM), значит должен быть **дополнительный жёсткий потолок на `W_tips`** (или на отношение `W_tips/W_core`) — у AM эта зона по определению малая, ограниченная по объёму, в отличие от EcM, где `W_tips` может расти намного свободнее (там это основной объём внешнего мицелия). **Признание пользователя:** `fungus_core.py` в текущем виде написан на чистой кинетике Михаэлиса-Ментен БЕЗ ограничения сверху по Топажу — это было намеренное упрощение, которое, по итогам разговора о находках в EcM-ядре, признано недостаточным. **Нужно вернуть структуру по Топажу и в AM-ядро.** **СТАТУС: `fungus_core.py` — черновик шага "1" в плане AM→переход→EcM, нуждается в том же наборе проверок (балансовый тест, граничные сценарии, добавление потолка по Топажу с AM-специфичным ограничением на `W_tips`), что и EcM-ядро.** --- ## 4. Научная литература, использованная как опора (не голословные гипотезы) ### 4.1. Шумилов, Благодатский (2017). "Моделирование роста грибного мицелия с помощью клеточного непрерывного стохастического автомата четвёртого класса..." — Самарский научный вестник. Ключевые находки, использованные в разговоре: - **Материнско-дочерний механизм**: некоторые зрелые гифы становятся "материнскими клетками", куда соседние клетки транспортируют ресурсы при избытке, или откуда забирают при недостатке — двунаправленный, автоматический градиентный перенос, без необходимости "решения" центра. Это прямая опора для механизма `W_tips ↔ W_core` в разделе 3.3. - **Количественная оценка асимметрии зон**: внешние (молодые, неинкапсулированные) гифы потребляют ресурсы на ПЯТЬ ПОРЯДКОВ быстрее внутренних (старых, инкапсулированных). - Активный транспорт описывается кинетикой Михаэлиса-Ментен; пассивное всасывание — отдельно. - Модель верифицирована качественно (паттерны роста: крест в системе агар-ловушки, "ведьмины кольца") но автор сам отмечает: "наиболее детальные [биохимически-ориентированные] модели редки и не верифицированы" — то есть степень количественной обоснованности ограничена, это не повод считать всё точно откалиброванным. ### 4.2. Рахимова, Канин, Скичко (2018). "Анализ и математическое моделирование процесса роста грибов рода Aspergillus" — Успехи в химии и химической технологии. Ключевая находка, использованная в разговоре: - Авторы реализуют переключение режима метаболизма через **кусочно-заданную индикаторную функцию** `m(t)`, привязанную к пороговому **уровню** концентрации субстрата (`s ≤ s_min`), а не к скорости его изменения. Явно объясняют: порог по уровню выбран, чтобы механизм "не оказывал воздействия на фазы роста культуры" до достижения порога — предсказуемая, не скрытая логика. - Также используют относительный, не абсолютный показатель: `β` (скорость отмирания) модулируется нелинейной функцией от `(x/x_max)` — то есть относительно собственного максимума, а не фиксированного числа. Это прямой прецедент для решения в разделе 3.3 про "нормальный уровень = доля от потолка", а не фиксированная константа. - Авторы используют явный метод Эйлера (Excel-реализация) — то есть та же потенциальная проблема жёсткости, что мы нашли в EcM-ядре, может присутствовать и здесь, хотя у них переключение случается один раз за весь эксперимент, что менее катастрофично, чем повторяющиеся пороговые события в нашей модели. ### 4.3. Чертов, Припутина, Шанин, Фролов (2024). "Роль эктомикоризы древесных растений в динамике органического вещества лесных почв" — Вопросы лесной науки. Использовалась в начале разговора как опора для понимания биологии азотного майнинга ЭМ: гриб разлагает устойчивое ПОВ ради азота для СВОЕГО мицелия, не передавая его напрямую растению; передача азота растению происходит только через промежуточный пул экскретов почвенной фауны после поедания опада мицелия фауной ("триада Чертова": растение — микориза — почвенная биота). Опад внешнего мицелия — 62% от всего опада лесных сообществ (количественный факт, не гипотеза). **Важное предостережение, зафиксированное в разговоре:** статья Чертова не утверждает и не подтверждает более сильные тезисы пользователя про "гриб как агент сукцессии, управляющий растением" — это отдельная, не подтверждённая статьёй Чертова гипотеза (подробно разобрана и не закрыта окончательно в начале разговора, см. раздел 6 — там приведены аргументы за и против, баланс склоняется к "асимметрия скорости отбора и монополия на фосфор — правдоподобные механизмы, но не доказанные данными из присланных статей"). --- ## 5. "Фосфорные войны" — содержательный механизм, очищенный от риторики Пользователь подтвердил: антропоморфизирующая терминология ("эгоизм", "предательство", "сейф", "ядерное оружие") — мнемонический приём для удержания сложной системы в голове, не претензия на буквальную агентность. Дальше — механизм на нейтральном языке. **Гипотеза перехода AM → EcM (для будущей реализации, после того как оба ядра по отдельности пройдут проверку):** 1. Растение с "гибкой" стратегией аллокации углерода (привязывает отдачу сахара к текущей доступности фосфора в почве) первоначально поддерживает AM-симбиоз, потому что легкодоступный фосфор есть. 2. По мере истощения легкодоступного (растворимого) пула фосфора в почве, растение с гибкой стратегией не увеличивает отдачу углерода грибу (по своей экономной природе), что не даёт AM-грибу энергетической базы для более затратной добычи фосфора из устойчивых минеральных форм. 3. Альтернативная растительная стратегия — стабильная, негибкая аллокация фиксированной доли углерода грибу независимо от текущей обеспеченности фосфором — даёт партнёрскому грибу (EcM) устойчивый энергетический бюджет, достаточный для запуска более затратного механизма добычи фосфора (растворение первичных минералов органическими кислотами — оксалатный механизм, биологически документированная геомикология, не гипотеза). 4. Гриб с таким устойчивым бюджетом способен избирательно направлять добытый фосфор тому партнёру, который обеспечивает стабильный приток углерода — что создаёт конкурентное преимущество для растений со "стабильной" стратегией (типично — хвойные) в условиях, где легкодоступный фосфор истощён. 5. Параллельно — закисление почвы (побочный продукт активности гриба, количественный механизм у Чертова, см. 4.3) подавляет минерализацию азота бактериями-сапротрофами, создавая дополнительный барьер для растений, не связанных с этим устойчивым типом микоризного партнёра. **Что в этой цепочке — документированная биология, а что — гипотеза пользователя, требующая отдельной проверки:** - Документировано: способность EcM растворять минералы через органические кислоты (геомикология); закисление почвы и его влияние на минерализацию N; разная "цена" разных микоризных партнёров для растения (биологический рынок — реальная область исследований, упоминалась в конце основного разговора как способ проверки). - Гипотеза, требующая проверки: что переключение партнёра происходит именно по сценарию "истощение → переключение → блокада" как целостный, направленный сукцессионный механизм, а не как побочный эффект независимых процессов. Документ из раздела 4.3 (Чертов и др.) явно НЕ подтверждает более сильную версию этого тезиса. --- ## 6. Открытые мировоззренческие вопросы — НЕ требуют повторного обсуждения, если пользователь не поднимет их сам В начале разговора подробно обсуждался вопрос "управляет ли сукцессией растение или гриб" — баланс аргументов: асимметрия скорости эволюционного отбора (мицелий — дни/недели, дерево — десятилетия/века) и монопольный характер доступа к фосфору через гриба на бедных почвах — это правдоподобные механизмы, дающие грибу структурное преимущество в "переговорной позиции", но это не было и не может быть окончательно доказано на основе имеющихся текстовых источников (требует эмпирических данных, которых не было предоставлено). Если новый чат увидит этот вопрос всплывающим снова — стоит относиться к нему как к открытому, не как к решённому в одну или другую сторону. --- ## 7. Рекомендуемый порядок действий для нового чата 1. Уточнить у пользователя, какие из файлов (раздел 1) у него есть под рукой для текущей сессии — не предполагать, что всё будет переслано автоматически. 2. Решить с пользователем: продолжать ли с EcM-ядра (раздел 2.4 — незавершённый рефакторинг, требует структуры по Топажу из раздела 3.1) или с AM-ядра (раздел 3.4 — черновик, тоже требует структуры по Топажу плюс AM-специфичное ограничение на `W_tips`). 3. В любом случае — НЕ калибровать параметры до того, как структура логистического потолка `(Am-W)/Am` встроена в формулу роста. Раздел 2.4 — прямое предупреждение о том, что происходит при калибровке без этой структуры (зависимость от случайного бага). 4. Для трёхзонной структуры (раздел 3.3) — реализовывать на `scipy.integrate.solve_ivp(method='Radau ')` с самого начала, не откладывать переход на неявную схему на потом. 5. Балансовый тест и проверка на машинную точность (раздел 2.2) — должны сопровождать каждое изменение кода, а не быть финальным шагом. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


