Глава 12: Промпты для научных вычислений
9 апреля 2026 г.
Принцип
Научные задачи требуют точности, воспроизводимости и корректной интерпретации. Промпты должны учитывать методологические требования.
Статистический анализ
Выбор теста
Пример 1: Сравнение двух групп
"ДАННЫЕ:
- Группа A: n=30, измерения до лечения
- Группа B: n=30, измерения после лечения
- Переменная: непрерывная (концентрация, мг/л)
- Группы: зависимые (те же пациенты)
ЗАДАЧА:
1. Проверить нормальность (Shapiro-Wilk)
2. Выбрать тест сравнения
3. Рассчитать effect size
4. Интерпретировать результаты
ФОРМАТ:
\`\`\`python
import scipy.stats as stats
import numpy as np
\# Данные
before = np.array($...$)
after = np.array($...$)
\# 1. Нормальность
\# 2. Тест
\# 3. Effect size
\# 4. Интерпретация
\`\`\`"
Пример 2: Множественные сравнения
"ДАННЫЕ:
- 4 группы (контроль + 3 дозы препарата)
- n=25 в каждой группе
- Измерение: время реакции (мс)
ЗАДАЧА:
1. ANOVA или Kruskal-Wallis (проверить условия)
2. Post-hoc тесты с коррекцией
3. Визуализация
ФОРМАТ:
\`\`\`python
from scipy import stats
import scikit\_posthocs as sp
import matplotlib.pyplot as plt
\# Код анализа
\# Коррекция: Bonferroni или FDR
\`\`\`"
Пример 3: Корреляционный анализ
"ДАННЫЕ:
- Две переменные: X (возраст), Y (показатель)
- n=100
- Предполагается нелинейная связь
ЗАДАЧА:
1. Scatter plot с оценкой
2. Pearson и Spearman корреляции
3. Проверка значимости
4. Confidence interval для коэффициента
Формула CI для r:
$r \\pm z\_\{\\alpha/2\} \\cdot SE\_r$
где $SE\_r = \\sqrt\{\\frac\{1-r^2\}\{n-2\}\}$"
Power analysis
"ПЛАНИРОВАНИЕ ЭКСПЕРИМЕНТА:
Параметры:
- Ожидаемый effect size: Cohen's d = 0.5 (medium)
- Уровень значимости: α = 0.05
- Мощность: 1 - β = 0.8
ЗАДАЧА:
Рассчитать минимальный размер выборки для:
1. Независимый t-test (две группы)
2. Парный t-test
3. ANOVA (3 группы)
ФОРМАТ:
\`\`\`python
from statsmodels.stats.power import TTestPower, TTestIndPower, FTestAnovaPower
\# Расчёты
Формула для t-test: "
\#\# Численные методы
\#\#\# Дифференциальные уравнения
Пример 1: ODE "ЗАДАЧА: Решить систему Лоренца:
ПАРАМЕТРЫ: σ = 10, ρ = 28, β = 8/3
НАЧАЛЬНЫЕ УСЛОВИЯ: x(0) = 1, y(0) = 1, z(0) = 1
ТРЕБОВАНИЯ:
-
Решение на t ∈
-
3D визуализация траектории
-
Временные ряды x(t), y(t), z(t)
from scipy.integrate import solve\_ivp
import matplotlib.pyplot as plt
from mpl\_toolkits.mplot3d import Axes3D
\`\`\`"
Пример 2: PDE (метод конечных разностей)
"ЗАДАЧА:
Уравнение теплопроводности:
$\\frac\{\\partial u\}\{\\partial t\} = \\alpha \\frac\{\\partial^2 u\}\{\\partial x^2\}$
ГРАНИЧНЫЕ УСЛОВИЯ:
u(0, t) = 0, u(L, t) = 0
u(x, 0) = sin(πx/L)
ПАРАМЕТРЫ:
α = 0.01, L = 1, T = 1
ТРЕБОВАНИЯ:
1. Явная схема
2. Проверка условия устойчивости: $\\frac\{\\alpha \\Delta t\}\{\\Delta x^2\} \\leq 0.5$
3. Анимация эволюции
\`\`\`python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
\`\`\`"
Пример 3: Оптимизация
"ЗАДАЧА:
Минимизировать функцию Розенброка:
$f(x, y) = (1-x)^2 + 100(y-x^2)^2$
МЕТОДЫ:
1. Градиентный спуск
2. scipy.optimize.minimize (BFGS)
3. scipy.optimize.differential\_evolution
ТРЕБОВАНИЯ:
1. Сравнение сходимости
2. Визуализация траекторий на контурном графике
3. Таблица: метод | итерации | точность | время
\`\`\`python
from scipy.optimize import minimize, differential\_evolution
import numpy as np
\`\`\`"
Интегрирование
"ЗАДАЧА:
Вычислить интеграл:
$I = \\int\_0^\{\\infty\} e^\{-x^2\} \\cos(x) dx$
МЕТОДЫ:
1. scipy.integrate.quad
2. Монте-Карло
3. Квадратура Гаусса-Эрмита (для веса $e^\{-x^2\}$)
ТРЕБОВАНИЯ:
1. Оценка погрешности каждого метода
2. Сравнение времени выполнения
3. Аналитическое значение (если существует)
\`\`\`python
from scipy import integrate
import numpy as np
\`\`\`"
Обработка экспериментальных данных
Фильтрация и сглаживание
"ДАННЫЕ:
- Временной ряд: 10000 точек, sampling rate 1000 Hz
- Полезный сигнал: 1-50 Hz
- Шум: высокочастотный + 50 Hz помеха
ЗАДАЧА:
1. Bandpass фильтр (1-50 Hz)
2. Notch фильтр (50 Hz)
3. Сравнение: до и после (временной ряд + спектр)
\`\`\`python
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
\# Генерация тестового сигнала
fs = 1000 \# Hz
t = np.linspace(0, 10, 10000)
clean = np.sin(2 \* np.pi \* 5 \* t) \# 5 Hz сигнал
noise = 0.5 \* np.sin(2 \* np.pi \* 50 \* t) \# 50 Hz помеха
hf\_noise = 0.3 \* np.random.randn(len(t)) \# высокочастотный шум
data = clean + noise + hf\_noise
\# Фильтрация
\`\`\`"
Fitting
"ДАННЫЕ:
x, y — экспериментальные точки (50 измерений)
Предполагаемая модель: $y = a \\cdot e^\{-bx\} + c$
ЗАДАЧА:
1. Нелинейный fit (scipy.optimize.curve\_fit)
2. Оценка параметров с доверительными интервалами
3. Коэффициент детерминации R²
4. Residual analysis
\`\`\`python
from scipy.optimize import curve\_fit
import numpy as np
import matplotlib.pyplot as plt
def model(x, a, b, c):
return a \* np.exp(-b \* x) + c
\# Fit
popt, pcov = curve\_fit(model, x, y)
\# Доверительные интервалы
perr = np.sqrt(np.diag(pcov))
\# R²
residuals = y - model(x, \*popt)
ss\_res = np.sum(residuals\*\*2)
ss\_tot = np.sum((y - np.mean(y))\*\*2)
r\_squared = 1 - (ss\_res / ss\_tot)
\`\`\`"
Визуализация для публикаций
"ТРЕБОВАНИЯ:
- Журнал: Nature style
- Размер: single column (89 mm) или double column (183 mm)
- DPI: 300 для растровых элементов
- Шрифт: Arial или Helvetica, 7-8 pt
- Чёрно-белая совместимость
ЗАДАЧА:
График scatter plot с регрессией
\`\`\`python
import matplotlib.pyplot as plt
import numpy as np
\# Настройка для публикации
plt.rcParams.update(\{
'font.family': 'Arial',
'font.size': 8,
'axes.linewidth': 0.5,
'xtick.major.width': 0.5,
'ytick.major.width': 0.5,
'lines.linewidth': 1,
'figure.dpi': 300
\})
\# Размер для single column
fig, ax = plt.subplots(figsize=(89/25.4, 70/25.4)) \# мм в дюймы
\# Данные
ax.scatter(x, y, s=20, c='black', alpha=0.7, edgecolors='none')
ax.plot(x\_fit, y\_fit, 'k-', linewidth=1)
\# Оформление
ax.set\_xlabel('Variable X (units)')
ax.set\_ylabel('Variable Y (units)')
ax.spines$'top'$.set\_visible(False)
ax.spines$'right'$.set\_visible(False)
plt.tight\_layout()
plt.savefig('figure.pdf', dpi=300, bbox\_inches='tight')
\`\`\`"
Воспроизводимость
"ТРЕБОВАНИЯ К КОДУ:
1. Random seeds:
\`\`\`python
import numpy as np
import random
import torch \# если используется
SEED = 42
np.random.seed(SEED)
random.seed(SEED)
torch.manual\_seed(SEED)
- Версии пакетов:
numpy==1.24.0
scipy==1.11.0
matplotlib==3.7.0
- Логирование:
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=$logging.FileHandler('experiment.log'),
logging.StreamHandler()$
)
logger = logging.getLogger(\_\_name\_\_)
logger.info(f'Starting experiment with seed=\{SEED\}')
- Сохранение результатов:
import json
results = \{
'parameters': \{...\},
'metrics': \{...\},
'timestamp': datetime.now().isoformat()
\}
with open('results.json', 'w') as f:
json.dump(results, f, indent=2)
\`\`\`"