From 2bf7ff7ef1910d476c981b18b920a25277d63db3 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 11:53:51 +0300 Subject: [PATCH] =?UTF-8?q?feat(phys7=20lab):=20Phase=207=20=E2=80=94=20?= =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D1=83?= =?UTF-8?q?=D0=BC,=206=20=D0=B2=D0=B8=D1=80=D1=82=D1=83=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=9B=D0=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Все 6 ЛР физики 7 закрыты. Файл phys7_lab_widgets.js (726 строк, 6 экспортов: lr1..lr6). Палитра cyan. Подключение через обновлённый gen_phys7_lab.js: script-тег + hook в goTo (удаление placeholder + вызов widgets). Каждая ЛР содержит: - Цель (goal card, голубая) - Оборудование (equip card, оранжевая) - Ход работы (steps card, фиолетовая) — пронумерованный список - СИМ-виджет (интерактивная симуляция прибора) - ТБЛ-виджет (таблица измерений) - ВОПР-виджет (3 контрольных вопроса с авто-проверкой) - Вывод (concl card, зелёная) - Кнопка «Сдать ЛР» (+30 XP, localStorage-фиксация) ЛР-1 «Цена деления» (§7): - 4 виртуальных прибора (линейка/термометр/мензурка/динамометр) с SVG-шкалами - Таблица C для всех 4 - 3 контрольных вопроса ЛР-2 «Измерение длины» (§4, §7): - 3 предмета на выбор (карандаш/тетрадь/брусок), SVG с линейкой ниже, риска на длине + запись (l ± 0,5) мм - Таблица 3 измерений ЛР-3 «Объём вытеснением» (§4): - 3 тела (камень/гайка/болт), 2 SVG-мензурки рядом (V1=100 и V2=100+V), стрелка «опускаем» между ними, авто-расчёт V = V2 − V1 - Таблица 3 измерений ЛР-4 «Неравномерное движение» (§18): - Шарик на наклонной плоскости, slider угла 10..60°, кнопка «Запустить», анимация скатывания (квадратичная по времени, эмпирически быстрее на больших углах) - Таблица 3 углов с разной средней скоростью ЛР-5 «Плотность» (§20): - 3 образца на выбор (54г/156г/272г, V=20 см³ каждый), SVG-весы+мензурка, расчёт ρ = m/V и автоопределение материала (алюминий/железо/золото) - Таблица плотностей 9 веществ ЛР-6 «Сила трения» (§27): - SVG: брусок с грузами, динамометр, разные поверхности из ' + + '
' + + '' + + '' + + '
'); + + h += wgWrap('lr4-tbl', 'ТБЛ', 'Таблица измерений', '', + '' + + '' + + [['15°','1,0','1,7','0,59'],['30°','1,0','1,1','0,91'],['45°','1,0','0,8','1,25']].map(r => + '').join('') + + '
Угол $\\alpha$$s$, м$t$, с$\\langle v\\rangle$, м/с
' + r[0] + '' + r[1] + '' + r[2] + '' + r[3] + '
'); + + h += wgWrap('lr4-q', 'ВОПР', 'Контрольные вопросы', '', + '
' + + quizQuestion('lr4-q', 0, 'Каков физический смысл $\\langle v\\rangle$?', ['Скорость в средней точке','Скорость, при которой за то же время прошёл бы тот же путь','Полусумма начальной и конечной','Скорость покоя'], 1) + + quizQuestion('lr4-q', 1, 'Что изменится, если увеличить угол?', ['Время больше, скорость меньше','Время меньше, $\\langle v\\rangle$ больше','Ничего не изменится','Скорость станет нулевой'], 1, 'Чем круче — тем быстрее скатывается.') + + quizQuestion('lr4-q', 2, 'Шарик прошёл $s = 2$ м за $t = 4$ с. $\\langle v\\rangle$?', ['0,2 м/с','0,5 м/с','1 м/с','2 м/с'], 1, '$\\langle v\\rangle = 2/4 = 0{,}5$ м/с.') + + '
'); + + h += makeCard('concl', 'Вывод', + 'Чем больше угол наклона, тем сильнее ускорение шарика и тем выше его средняя скорость. ' + + 'Движение шарика — неравномерное: его мгновенная скорость растёт от нуля в начале до максимума в конце. ' + + 'Формула $\\langle v\\rangle = s/t$ даёт усреднённую характеристику, удобную для сравнения.'); + + h += submitBtn('lr4'); + body.innerHTML = h; + + let lr4Anim = { raf: 0, t: 0, running: false, totalT: 0, ang: 15 }; + function drawTrack(){ + const ang = +document.getElementById('lr4-a-r').value; + document.getElementById('lr4-a').textContent = ang; + lr4Anim.ang = ang; + const W = 360, H = 200, baseY = 170; + const len = 220; + const a = ang * Math.PI / 180; + const x1 = 40, y1 = baseY; + const x2 = x1 + len * Math.cos(a); + const y2 = baseY - len * Math.sin(a); + let s = ''; + s += ''; + s += ''; + // Шарик в начальной позиции (на верху) + const t = lr4Anim.t; + const totalT = Math.max(0.5, 2.0 - ang * 0.025); // эмпирическая формула: больше угол — меньше время + lr4Anim.totalT = totalT; + let progress = t / totalT; + if(progress > 1) progress = 1; + // Шарик ускоряется (квадратичная зависимость пути от времени) + const sFrac = progress * progress; + const bx = x2 + (x1 - x2) * sFrac; + const by = y2 + (y1 - y2) * sFrac; + s += ''; + // Подпись + s += 'α = ' + ang + '°'; + s += 's = 1,0 м'; + s += 't = ' + t.toFixed(2) + ' с'; + document.getElementById('lr4-svg').innerHTML = s; + const vavg = progress >= 1 ? (1.0 / totalT) : 0; + document.getElementById('lr4-info').innerHTML = progress >= 1 + ? 'Шарик скатился! $t = ' + totalT.toFixed(2) + '$ с · $s = 1{,}0$ м · $\\langle v\\rangle = s/t = ' + vavg.toFixed(2) + '$ м/с' + : 'В движении... $t = ' + t.toFixed(2) + '$ с'; + renderMath(document.getElementById('lr4-info')); + } + function lr4Loop(){ + if(!lr4Anim.running) return; + lr4Anim.t += 0.02; + if(lr4Anim.t >= lr4Anim.totalT){ + lr4Anim.t = lr4Anim.totalT; + lr4Anim.running = false; + drawTrack(); + return; + } + drawTrack(); + lr4Anim.raf = requestAnimationFrame(lr4Loop); + } + document.getElementById('lr4-a-r').addEventListener('input', () => { lr4Anim.t = 0; lr4Anim.running = false; drawTrack(); }); + document.getElementById('lr4-go').addEventListener('click', () => { + lr4Anim.t = 0; lr4Anim.running = true; + if(lr4Anim.raf) cancelAnimationFrame(lr4Anim.raf); + lr4Loop(); + }); + drawTrack(); + + wireQuiz('lr4-q-host'); + wireSubmit('lr4'); + renderMath(body); +} + +/* ========================================================== */ +/* ЛР-5 — Измерение плотности вещества */ +/* ========================================================== */ +function build_lr5(){ + const body = document.getElementById('lr5-body'); + if(!body) return; + let h = ''; + + h += makeCard('goal', 'Цель', + 'Измерить плотности трёх веществ и определить, что это за материалы, по таблице плотностей.'); + + h += makeCard('equip', 'Оборудование', + '
  • Весы (электронные или рычажные)
  • Мензурка
  • 3 образца разных материалов
  • Нитка для опускания
'); + + h += makeCard('steps', 'Ход работы', + '
    ' + + '
  1. Измерь массу $m$ образца на весах.
  2. ' + + '
  3. Измерь его объём $V$ методом вытеснения (как в ЛР-3).
  4. ' + + '
  5. Вычисли $\\rho = m/V$.
  6. ' + + '
  7. Найди в таблице вещество с такой плотностью.
  8. ' + + '
'); + + /* Виджет */ + h += wgWrap('lr5-w', 'СИМ', '3 образца — определи вещество', 'Выбери образец — увидь массу и объём, вычисли плотность.', + '
' + + [['s1','Образец 1',54,20],['s2','Образец 2',156,20],['s3','Образец 3',272,20]].map((o, i) => + '').join('') + + '
' + + '
' + + '
' + + '
Весы
' + + '
54 г
' + + '
' + + '
' + + '
Мензурка
' + + '
20 см³
' + + '
' + + '
' + + '
'); + + /* Таблица */ + h += wgWrap('lr5-tbl', 'ТБЛ', 'Таблица плотностей (для сравнения)', '', + '' + + '' + + [['Сосна',0.5],['Лёд',0.9],['Вода',1.0],['Алюминий',2.7],['Железо',7.8],['Медь',8.9],['Свинец',11.3],['Ртуть',13.6],['Золото',19.3]].map(r => + '').join('') + + '
Вещество$\\rho$, г/см³
' + r[0] + '' + r[1] + '
'); + + h += wgWrap('lr5-q', 'ВОПР', 'Контрольные вопросы', '', + '
' + + quizQuestion('lr5-q', 0, 'Образец 1 имеет $m = 54$ г, $V = 20$ см³. $\\rho$?', ['1,7 г/см³','2,7 г/см³','3,7 г/см³','5,4 г/см³'], 1, '$54/20 = 2{,}7$ г/см³ — алюминий.') + + quizQuestion('lr5-q', 1, 'Образец 2: $m = 156$ г, $V = 20$ см³. Что это?', ['Лёд','Алюминий','Железо','Свинец'], 2, '$156/20 = 7{,}8$ г/см³ — железо.') + + quizQuestion('lr5-q', 2, 'Какое измерение здесь косвенное?', ['Массы','Объёма','Плотности','Времени'], 2, 'Плотность вычисляется через прямые $m$ и $V$.') + + '
'); + + h += makeCard('concl', 'Вывод', + 'Зная массу и объём тела, можно вычислить плотность вещества и определить, что это за материал. ' + + 'Измерение плотности — пример косвенного измерения через два прямых ($m$ и $V$). ' + + 'Таблицы плотностей позволяют идентифицировать неизвестные вещества.'); + + h += submitBtn('lr5'); + body.innerHTML = h; + + function matName(rho){ + if(rho < 0.6) return 'дерево (сосна)'; + if(rho < 0.95) return 'лёд'; + if(rho < 1.1) return 'вода'; + if(rho < 3) return 'алюминий'; + if(rho < 9) return 'железо / медь'; + if(rho < 14) return 'свинец / ртуть'; + return 'золото / платина'; + } + function upd5(m, V, nm){ + document.getElementById('lr5-m').textContent = m + ' г'; + document.getElementById('lr5-V').textContent = V + ' см³'; + const rho = m / V; + document.getElementById('lr5-info').innerHTML = '' + nm + ': $\\rho = m/V = ' + m + '/' + V + ' = $ ' + rho.toFixed(2) + ' г/см³.
' + + 'Похоже на: ' + matName(rho) + ''; + renderMath(document.getElementById('lr5-info')); + } + body.querySelectorAll('.lr5-obj').forEach(btn => btn.addEventListener('click', () => { + body.querySelectorAll('.lr5-obj').forEach(b => { b.style.background = '#fff'; b.style.color = ACCENT; }); + btn.style.background = ACCENT; btn.style.color = '#fff'; + upd5(+btn.dataset.m, +btn.dataset.v, btn.dataset.nm); + })); + upd5(54, 20, 'Образец 1'); + + wireQuiz('lr5-q-host'); + wireSubmit('lr5'); + renderMath(body); +} + +/* ========================================================== */ +/* ЛР-6 — Изучение силы трения */ +/* ========================================================== */ +function build_lr6(){ + const body = document.getElementById('lr6-body'); + if(!body) return; + let h = ''; + + h += makeCard('goal', 'Цель', + 'Измерить силу трения скольжения для разных поверхностей и убедиться, что $F_{тр} \\sim N$ (зависит от нормальной реакции).'); + + h += makeCard('equip', 'Оборудование', + '
  • Деревянный брусок
  • Грузы по 100 г
  • Динамометр
  • Разные поверхности (дерево, пластик, резина)
'); + + h += makeCard('steps', 'Ход работы', + '
    ' + + '
  1. Положи брусок на поверхность. Прицепи к нему динамометр.
  2. ' + + '
  3. Тяни равномерно и измерь $F_{тр}$ — это сила, которую показал динамометр (=сила тяги при равномерном движении).
  4. ' + + '
  5. Добавляй грузы по 100 г и снова измеряй $F_{тр}$.
  6. ' + + '
  7. Поменяй поверхность — повтори.
  8. ' + + '
'); + + /* Виджет */ + h += wgWrap('lr6-w', 'СИМ', 'Брусок с динамометром', 'Меняй массу и поверхность — увидь силу трения.', + '
' + + '' + + '' + + '
' + + '' + + '
'); + + h += wgWrap('lr6-tbl', 'ТБЛ', 'Таблица измерений (μ=0,3, дерево по дереву)', + '', + '' + + '' + + [['0 (брусок)',0.1,1.0,0.3],['+1 груз',0.2,2.0,0.6],['+2 груза',0.3,3.0,0.9],['+3 груза',0.4,4.0,1.2],['+4 груза',0.5,5.0,1.5]].map(r => + '').join('') + + '
Грузы$m$, кг$N = mg$, Н$F_{тр}$, Н
' + r[0] + '' + r[1] + '' + r[2] + '' + r[3] + '
' + + '

Видно, что $F_{тр}$ растёт пропорционально массе — то есть пропорционально $N$. Это и есть закон $F_{тр} \\sim N$.

'); + + h += wgWrap('lr6-q', 'ВОПР', 'Контрольные вопросы', '', + '
' + + quizQuestion('lr6-q', 0, 'Если массу удвоить, $F_{тр}$ скольжения…', ['Не изменится','Удвоится','Уменьшится в 2 раза','Останется','Станет 0'], 1) + + quizQuestion('lr6-q', 1, 'Какая поверхность дает наименьшее трение?', ['Дерево','Резина','Лёд','Пластик'], 2, 'У льда $\\mu \\approx 0{,}04$ — поэтому скользко.') + + quizQuestion('lr6-q', 2, 'Брусок $m = 0{,}5$ кг, $\\mu = 0{,}3$, $g = 10$. $F_{тр}$?', ['0,5 Н','1 Н','1,5 Н','3 Н'], 2, '$F_{тр} = \\mu mg = 0{,}3 \\cdot 0{,}5 \\cdot 10 = 1{,}5$ Н.') + + '
'); + + h += makeCard('concl', 'Вывод', + 'Эксперимент подтвердил, что сила трения скольжения прямо пропорциональна нормальной реакции (а значит — массе тела). ' + + 'Коэффициент трения $\\mu$ зависит от пары поверхностей: для дерево-лёд он очень мал ($\\sim 0{,}04$), ' + + 'для дерево-резина — большой ($\\sim 0{,}5$). Поэтому шипованная резина не скользит по асфальту и снегу.'); + + h += submitBtn('lr6'); + body.innerHTML = h; + + function draw6(){ + const m = +document.getElementById('lr6-m-r').value; + const mu = +document.getElementById('lr6-surf').value; + document.getElementById('lr6-m').textContent = m; + const N = m / 1000 * 10; // m в г → кг → N + const Ftr = mu * N; + const W = 380, H = 180, baseY = 130; + let s = ''; + s += ''; + for(let i = 0; i < 18; i++) s += ''; + const bx = 80, bw = 60, bh = 40; + // Грузы наверху + const numGr = Math.max(0, (m - 100) / 100); + for(let i = 0; i < numGr; i++){ + s += ''; + } + // Брусок + s += ''; + s += '' + m + ' г'; + // Динамометр + нить + const dynX = bx + bw + 20; + s += ''; + s += ''; + s += '' + Ftr.toFixed(2) + ' Н'; + s += 'динамометр'; + // Стрелка тяги + s += ''; + s += ''; + // Стрелка трения + s += ''; + s += ''; + s += 'F_тр'; + document.getElementById('lr6-svg').innerHTML = s; + document.getElementById('lr6-info').innerHTML = '$m = ' + (m/1000).toFixed(2) + '$ кг, $N = mg = ' + N.toFixed(1) + '$ Н, $\\mu = ' + mu + '$  →  $F_{тр} = \\mu N = ' + Ftr.toFixed(2) + '$ Н'; + renderMath(document.getElementById('lr6-info')); + } + document.getElementById('lr6-m-r').addEventListener('input', draw6); + document.getElementById('lr6-surf').addEventListener('change', draw6); + draw6(); + + wireQuiz('lr6-q-host'); + wireSubmit('lr6'); + renderMath(body); +} + +window.PHYS7_LAB_WIDGETS = { + lr1: build_lr1, + lr2: build_lr2, + lr3: build_lr3, + lr4: build_lr4, + lr5: build_lr5, + lr6: build_lr6 +}; + +})(); diff --git a/frontend/textbooks/physics_7_lab.html b/frontend/textbooks/physics_7_lab.html index e5e1dd3..73fe65e 100644 --- a/frontend/textbooks/physics_7_lab.html +++ b/frontend/textbooks/physics_7_lab.html @@ -15,6 +15,7 @@ +