From 8c3e7ce7aaf0cd0fc2a0cc1686902edb73073626 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 18:18:29 +0300 Subject: [PATCH] =?UTF-8?q?feat(phys10=20ch5=20wave3):=20=C2=A731=20=C2=AB?= =?UTF-8?q?=D0=9C=D0=B0=D0=B3=D0=BD=D0=B8=D1=82=D0=BD=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=BA=20+=20=D0=AD=D0=9C=D0=98=C2=BB=20+=20?= =?UTF-8?q?=C2=A732=20=C2=AB=D0=9B=D0=B5=D0=BD=D1=86=20+=20=D0=A4=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=B4=D0=B5=D0=B9=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/textbooks/physics_10_ch5.html | 742 ++++++++++++++++++++++++- 1 file changed, 730 insertions(+), 12 deletions(-) diff --git a/frontend/textbooks/physics_10_ch5.html b/frontend/textbooks/physics_10_ch5.html index fae6c8d..6b9ce94 100644 --- a/frontend/textbooks/physics_10_ch5.html +++ b/frontend/textbooks/physics_10_ch5.html @@ -2122,34 +2122,752 @@ function build_p30(){ function build_p31(){ const box = document.getElementById('p31-body'); let html = ''; - html += makeCard('theory', "Магнитный поток. Электромагнитная индукция", "§31", ` -

Магнитный поток. Электромагнитная индукция — этот параграф в разработке (Phase 1+).

-

Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.

-

- Phase 0: создан скелет учебника. Phase 5+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019). -

+ + /* THEORY 1 — Магнитный поток */ + html += makeCard('theory', "Магнитный поток", "§31", ` +

Магнитный поток $\\Phi$ через плоскую площадку площадью $S$ в однородном магнитном поле $\\vec{B}$:

+

$$\\Phi = B\\,S\\,\\cos\\alpha$$

+

где $\\alpha$ — угол между $\\vec{B}$ и нормалью $\\vec{n}$ к площадке.

+

Единица: Вебер (Вб) = Тл·м².

+

Особые случаи:

+ +

Наглядно. Можно представлять $\\Phi$ как «количество силовых линий, пронизывающих площадку».

`); + + /* THEORY 2 — Явление электромагнитной индукции */ + html += makeCard('rule', "Явление электромагнитной индукции", "§31", ` +

Электромагнитная индукция — возникновение электрического тока в замкнутом проводящем контуре при изменении магнитного потока через него.

+

Открыта Майклом Фарадеем в 1831 году.

+

Главный принцип: ток в контуре возникает только при изменении $\\Phi$, а не от самого $\\Phi$. Если магнит неподвижен в катушке — тока нет.

+

Возникший ток называется индукционным. ЭДС, которая его вызывает — ЭДС индукции $\\mathcal{E}_i$.

+

Ключ. Чем быстрее меняется $\\Phi$ — тем больше индукционный ток.

+ `); + + /* THEORY 3 — Опыты Фарадея и способы изменения Ф */ + html += makeCard('example', "Опыты Фарадея и способы изменения Ф", "§31", ` +

Классические опыты Фарадея:

+
    +
  1. Магнит вдвигают в катушку → возникает индукционный ток (одного знака).
  2. +
  3. Магнит выдвигают → ток противоположного знака.
  4. +
  5. Магнит ближе к катушке = больше скорость изменения $\\Phi$ → больше ток.
  6. +
  7. Без движения — тока нет.
  8. +
+

Способы изменения $\\Phi$:

+ +

Применение:

+ + `); + + /* INTERACTIVE 1 — Магнитный поток через рамку */ + html += `
+
ИНТЕРАКТИВ 1
Магнитный поток через рамку
+
Меняй $B$, $S$ и угол $\\alpha$ между $\\vec{B}$ и нормалью $\\vec{n}$ к рамке. Смотри, как меняется поток $\\Phi = BS\\cos\\alpha$.
+
+ + + +
+
+ +
+
+
`; + + /* INTERACTIVE 2 — Опыт Фарадея */ + html += `
+
ИНТЕРАКТИВ 2
Симуляция опыта Фарадея
+
Двигай магнит к катушке и от неё. Когда поток меняется — в катушке возникает индукционный ток. Когда магнит неподвижен — тока нет.
+
+ +
+
+ +
+
+
`; + + /* INTERACTIVE 3 — Возникает ли индукционный ток? */ + html += `
+
ИНТЕРАКТИВ 3
Возникает ли индукционный ток?
+
6 ситуаций. Ток возникает только если меняется магнитный поток $\\Phi$ через контур.
+
Задача 1 / 6Очки: 0 / 6
+
+
+ +
+
`; + + /* INTERACTIVE 4 — Тренажёр */ + html += `
+
ИНТЕРАКТИВ 4
Тренажёр магнитного потока
+
5 числовых задач. Допуск ±5%. Используй $\\Phi = BS\\cos\\alpha$.
+
Задача 1 / 5Очки: 0 / 5
+
+
+ + +
+ +
+
`; + html += secNav('p30', 'p32'); html += readButton('p31'); + box.innerHTML = html; renderMath(box); + + /* IV1 — Магнитный поток через рамку */ + (function(){ + const svg = document.getElementById('p31-iv1-svg'); + const out = document.getElementById('p31-iv1-out'); + const bS = document.getElementById('p31-iv1-B'); + const sS = document.getElementById('p31-iv1-S'); + const aS = document.getElementById('p31-iv1-a'); + const bL = document.getElementById('p31-iv1-BL'); + const sL = document.getElementById('p31-iv1-SL'); + const aL = document.getElementById('p31-iv1-aL'); + const seen = new Set(); + let _done = false; + + function draw(){ + const W = 480, H = 280; + const B = +bS.value, S = +sS.value, aDeg = +aS.value; + bL.textContent = B.toFixed(2); + sL.textContent = S.toFixed(2); + aL.textContent = aDeg.toFixed(0); + const alpha = aDeg * Math.PI / 180; + const Phi = B * S * Math.cos(alpha); + + let g = ''; + g += ''; + g += 'B вправо →. Угол между B и нормалью n = '+aDeg+'°'; + + // Силовые линии поля B (горизонтальные стрелки слева → направо) + for(let i=0;i<5;i++){ + const yL = 60 + i*40; + g += PHYS.drawArrow(40, yL, 440, yL, '#7c3aed', 1.3, 8); + } + // подпись B + g += 'B'; + + // Рамка (вид сверху, поворот вокруг вертикальной оси на угол alpha) + // Ширина проекции рамки = w0 * |sin(alpha)| — это «как мы видим её сбоку». Но удобнее + // показывать рамку с нормалью под углом alpha к B. Изобразим рамку как ромб (3D-проекция). + const cx = 240, cy = 150; + const halfW = 60; // полуширина рамки в плоскости поля + const halfH = 50; // высота рамки (не меняется) + // При alpha=0 рамка видна как горизонтальная линия (поток max); при alpha=90 рамка перпенд. → видна как прямоугольник + const projW = Math.max(2, halfW * Math.abs(Math.sin(alpha))); + // верхний и нижний край рамки — горизонтальные линии длиной 2*projW + // боковые стороны — наклонные (для эффекта 3D) + const xL = cx - projW, xR = cx + projW; + // Заполнение рамки + g += ''; + // Нормаль n + const nLen = 60; + // Направление нормали — повёрнуто на alpha от B (B вдоль +x). Тогда n = (cos(alpha), sin(alpha)). + const nx = cx + nLen * Math.cos(alpha); + const ny = cy - nLen * Math.sin(alpha); + g += PHYS.drawArrow(cx, cy, nx, ny, '#dc2626', 2.4, 11); + g += 'n'; + // Дуга угла между n и B (B = +x) + const arcR = 28; + const a1 = 0, a2 = -alpha; // угол в SVG-координатах (y вниз) + const aStart = Math.min(a1, a2), aEnd = Math.max(a1, a2); + g += ''; + g += 'α'; + + // Подпись параметров рамки + g += 'B = '+B.toFixed(2)+' Тл, S = '+S.toFixed(2)+' м², α = '+aDeg+'°'; + g += 'Φ = '+(Phi*1000).toFixed(2)+' мВб'; + + svg.innerHTML = g; + + let note = ''; + if(aDeg === 0) note = 'α = 0°: $\\vec{B} \\parallel \\vec{n}$ — поток максимален: $\\Phi_{max} = BS = '+(B*S*1000).toFixed(2)+'$ мВб.'; + else if(aDeg === 90) note = 'α = 90°: $\\vec{B} \\perp \\vec{n}$ — линии поля скользят вдоль рамки. $\\Phi = 0$.'; + else if(aDeg === 180) note = 'α = 180°: $\\vec{B}$ и $\\vec{n}$ направлены противоположно. $\\Phi = -BS = '+(-B*S*1000).toFixed(2)+'$ мВб.'; + else note = 'α = '+aDeg+'°: $\\Phi = BS\\cos\\alpha = '+B.toFixed(2)+'\\cdot '+S.toFixed(2)+'\\cdot \\cos '+aDeg+'° = '+(Phi*1000).toFixed(2)+'$ мВб.'; + out.innerHTML = note; + renderMath(out); + + const key = (B>0.5?'B+':'B-') + ':' + (S>0.3?'S+':'S-') + ':' + Math.round(aDeg/30); + seen.add(key); + if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p31-iv1'); bumpProgress('p31', 15); } + } + bS.addEventListener('input', draw); + sS.addEventListener('input', draw); + aS.addEventListener('input', draw); + draw(); + })(); + + /* IV2 — Опыт Фарадея */ + (function(){ + const svg = document.getElementById('p31-iv2-svg'); + const out = document.getElementById('p31-iv2-out'); + const xS = document.getElementById('p31-iv2-x'); + const xL = document.getElementById('p31-iv2-xL'); + let lastX = +xS.value, lastT = performance.now(); + let movesPos = 0, movesNeg = 0, _done = false; + + function draw(){ + const W = 480, H = 280; + const x = +xS.value; + xL.textContent = x.toFixed(2); + const now = performance.now(); + const dt = Math.max(0.01, (now - lastT) / 1000); + const dx = x - lastX; + const vel = dx / dt; // м/с (условно) + lastX = x; lastT = now; + + // Катушка справа: центр около (340, 140), длина 130 + const coilCx = 340, coilCy = 140, coilL = 130, coilR = 40; + // Магнит — прямоугольник; позиция: магнит-середина по x + // Сопоставим x ∈ [-0.5 .. 0.3] м со SVG-координатой от 70 (далеко слева) до 320 (входит в катушку) + const magW = 90, magH = 40; + const magCx = 70 + (x + 0.5) * (320 - 70) / 0.8; + const magCy = coilCy; + + let g = ''; + g += ''; + g += 'Опыт Фарадея: магнит и катушка с амперметром'; + + // Катушка — серия дуг (имитация витков) + const turns = 10; + for(let i=0;i'; + } + // Боковые «проводки» катушки к амперметру + g += PHYS.wire(coilCx - coilL/2 - 4, coilCy + coilR, coilCx - coilL/2 - 4, coilCy + coilR + 30); + g += PHYS.wire(coilCx + coilL/2 + 4, coilCy + coilR, coilCx + coilL/2 + 4, coilCy + coilR + 30); + g += PHYS.wire(coilCx - coilL/2 - 4, coilCy + coilR + 30, 405, coilCy + coilR + 30); + g += PHYS.wire(coilCx + coilL/2 + 4, coilCy + coilR + 30, 435, coilCy + coilR + 30); + // Амперметр + g += PHYS.ammeterSymbol(420, coilCy + coilR + 30, 14); + + // Магнит: N (красный) | S (синий) + g += ''; + g += ''; + g += 'N'; + g += 'S'; + + // Поле магнита (стрелка из N) — направление движения магнита + if(Math.abs(vel) > 0.02){ + const dir = vel > 0 ? 1 : -1; + const arrFromX = magCx + dir * (magW/2 + 6); + const arrToX = arrFromX + dir * 40; + g += PHYS.drawArrow(arrFromX, magCy - 30, arrToX, magCy - 30, '#0f172a', 2, 9); + g += 'движение'; + } + + // Стрелка амперметра + ток в катушке + let curSign = 0; // -1, 0, +1 + let curMag = 0; + if(Math.abs(vel) > 0.02){ + // приближение N-полюса справа → поток через катушку растёт. Индукционный ток создаёт поле S к магниту, + // то есть ток виден против часовой стрелки (со стороны магнита). Возьмём знак произвольно. + curSign = vel > 0 ? +1 : -1; + curMag = Math.min(1, Math.abs(vel) * 8); + } + // Стрелка на амперметре + const ndlAng = curSign * curMag * 0.7; // рад от вертикали + const ax = 420, ay = coilCy + coilR + 30; + const ndlEx = ax + 11 * Math.sin(ndlAng); + const ndlEy = ay - 11 * Math.cos(ndlAng); + g += ''; + + // Стрелочки тока в первом витке катушки + if(curMag > 0){ + const dirColor = curSign > 0 ? '#dc2626' : '#0891b2'; + const ccx = coilCx, ccy = coilCy; + const r = coilR + 4; + // Верх витка — стрелка вправо/влево + const dxArr = curSign > 0 ? +14 : -14; + g += PHYS.drawArrow(ccx - dxArr/2, ccy - r, ccx + dxArr/2, ccy - r, dirColor, 2, 8); + g += PHYS.drawArrow(ccx + dxArr/2, ccy + r, ccx - dxArr/2, ccy + r, dirColor, 2, 8); + g += 'Индукционный ток '+(curSign>0?'→':'←')+''; + } else { + g += 'Тока нет — магнит покоится'; + } + + svg.innerHTML = g; + + let note = ''; + if(curMag < 0.05) note = 'Магнит покоится. Поток $\\Phi$ через катушку не меняется → индукционного тока нет.'; + else if(curSign > 0) note = 'Магнит приближается к катушке. Поток $\\Phi$ растёт → возникает индукционный ток (одного знака).'; + else note = 'Магнит удаляется от катушки. Поток $\\Phi$ убывает → возникает индукционный ток противоположного знака.'; + out.innerHTML = note; + renderMath(out); + + if(curSign > 0) movesPos = 1; + if(curSign < 0) movesNeg = 1; + if(!_done && movesPos && movesNeg){ _done = true; addXp(10, 'p31-iv2'); bumpProgress('p31', 15); } + } + xS.addEventListener('input', draw); + // Тикать чаще, чтобы дать стрелке амперметра «остыть» + setInterval(draw, 250); + draw(); + })(); + + /* IV3 — Возникает ли индукционный ток? */ + (function(){ + const OPTS = ['Возникает', 'Не возникает']; + const Q = [ + { q:'Магнит вдвигают в катушку.', ans:0, why:'$\\Phi$ через катушку меняется → ток есть.' }, + { q:'Магнит покоится в катушке.', ans:1, why:'$\\Phi$ не меняется → тока нет.' }, + { q:'Катушка вращается в постоянном магнитном поле.', ans:0, why:'Меняется угол $\\alpha$ → меняется $\\Phi$ → ток есть. (Принцип генератора.)' }, + { q:'Ток в соседней катушке плавно растёт.', ans:0, why:'$B$ растёт → $\\Phi$ меняется → ток в нашей катушке есть.' }, + { q:'В соседней катушке течёт постоянный ток.', ans:1, why:'$B$ постоянно → $\\Phi$ не меняется → тока нет.' }, + { q:'Площадь контура в постоянном поле плавно уменьшается.', ans:0, why:'$S$ меняется → $\\Phi = BS\\cos\\alpha$ меняется → ток есть.' } + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p31-iv3-q'); + const oEl = document.getElementById('p31-iv3-opts'); + const fb = document.getElementById('p31-iv3-fb'); + const iEl = document.getElementById('p31-iv3-i'); + const sEl = document.getElementById('p31-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p31-iv3'); bumpProgress('p31', 25); } + else if(score >= 4){ addXp(8, 'p31-iv3'); bumpProgress('p31', 15); } + return; + } + iEl.textContent = (i+1); + sEl.textContent = score; + qEl.innerHTML = Q[i].q; + oEl.innerHTML = OPTS.map((t, k) => '').join(''); + fb.style.display = 'none'; + renderMath(qEl); + oEl.querySelectorAll('button').forEach(b => { + b.addEventListener('click', () => { + const v = +b.dataset.v; + if(v === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); } + else feedback(fb, false, '✗ Верно: ' + OPTS[Q[i].ans] + '. ' + Q[i].why + ' Дальше ▶'); + sEl.textContent = score; + oEl.querySelectorAll('button').forEach(x => x.disabled = true); + i++; + setTimeout(show, 1800); + }); + }); + } + document.getElementById('p31-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV4 — Тренажёр */ + (function(){ + const Q = [ + { q:'$B = 0{,}5$ Тл, $S = 0{,}04$ м², $\\alpha = 0°$. Найди $\\Phi$ (в мВб).', ans:20, tol:1, why:'$\\Phi = BS\\cos 0° = 0{,}5\\cdot 0{,}04 = 0{,}02$ Вб = 20 мВб.' }, + { q:'То же поле и площадь, но $\\alpha = 60°$. Найди $\\Phi$ (в мВб).', ans:10, tol:0.6, why:'$\\Phi = 20\\cdot \\cos 60° = 20\\cdot 0{,}5 = 10$ мВб.' }, + { q:'$\\alpha = 90°$. Чему равен $\\Phi$ (в мВб)?', ans:0, tol:0.01, why:'$\\cos 90° = 0$ → $\\Phi = 0$. Линии поля скользят вдоль рамки.' }, + { q:'При $B = 0$ Тл — каким будет $\\Phi$ (в Вб)?', ans:0, tol:0.01, why:'Нет поля → нет потока. $\\Phi = 0$.' }, + { q:'Если площадь $S$ удвоить (при тех же $B$ и $\\alpha$), во сколько раз изменится $\\Phi$?', ans:2, tol:0.1, why:'$\\Phi \\propto S$ → удвоится.' } + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p31-iv4-q'); + const fb = document.getElementById('p31-iv4-fb'); + const iEl = document.getElementById('p31-iv4-i'); + const sEl = document.getElementById('p31-iv4-s'); + const inp = document.getElementById('p31-iv4-inp'); + const bGo = document.getElementById('p31-iv4-go'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + inp.disabled = true; bGo.disabled = true; + if(score === Q.length){ addXp(15, 'p31-iv4'); bumpProgress('p31', 25); } + else if(score >= 3){ addXp(8, 'p31-iv4'); bumpProgress('p31', 15); } + return; + } + iEl.textContent = (i+1); + sEl.textContent = score; + qEl.innerHTML = Q[i].q; + fb.style.display = 'none'; + inp.value = ''; inp.disabled = false; bGo.disabled = false; inp.focus(); + renderMath(qEl); + } + function check(){ + if(inp.disabled) return; + const v = parseFloat(inp.value.replace(',','.')); + if(!isFinite(v)){ feedback(fb, false, 'Введи число.'); return; } + const tol = Math.max(Q[i].tol, Math.abs(Q[i].ans)*0.05); + const ok = Math.abs(v - Q[i].ans) <= tol; + if(ok){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); } + else feedback(fb, false, '✗ Верно: ' + Q[i].ans + '. ' + Q[i].why + ' Дальше ▶'); + sEl.textContent = score; + inp.disabled = true; bGo.disabled = true; + i++; + setTimeout(show, 1900); + } + bGo.addEventListener('click', check); + inp.addEventListener('keydown', e => { if(e.key==='Enter') check(); }); + document.getElementById('p31-iv4-restart').addEventListener('click', () => { i = 0; score = 0; inp.disabled=false; bGo.disabled=false; show(); }); + show(); + })(); + wireReadBtn('p31'); } function build_p32(){ const box = document.getElementById('p32-body'); let html = ''; - html += makeCard('theory', "Правило Ленца. Закон Фарадея", "§32", ` -

Правило Ленца. Закон Фарадея — этот параграф в разработке (Phase 1+).

-

Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.

-

- Phase 0: создан скелет учебника. Phase 5+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019). -

+ + /* THEORY 1 — Правило Ленца */ + html += makeCard('theory', "Правило Ленца", "§32", ` +

Правило Ленца (1834): индукционный ток направлен так, чтобы своим магнитным полем препятствовать изменению магнитного потока, его вызвавшему.

+

Это правило отражает закон сохранения энергии: если бы ток усиливал изменение, можно было бы получать неограниченную энергию из ничего.

+

Пример 1: магнит N-полюсом приближается к катушке.

+
    +
  • Поток $\\Phi$ через катушку растёт.
  • +
  • Индукционный ток создаёт встречное магнитное поле (его «N-полюс» обращён к магниту).
  • +
  • Магнит отталкивается — приходится приложить силу, чтобы продолжать движение.
  • +
  • Эта работа преобразуется в энергию индукционного тока.
  • +
+

Пример 2: магнит удаляется. Поток убывает. Индукционный ток создаёт поле, поддерживающее убывающий поток — катушка притягивает магнит.

+

Короткая мнемоника. «Природа сопротивляется изменению»: ток всегда против того, кто его вызвал.

`); + + /* THEORY 2 — Закон Фарадея */ + html += makeCard('rule', "Закон электромагнитной индукции (Фарадея)", "§32", ` +

Величина ЭДС индукции в контуре равна скорости изменения магнитного потока:

+

$$\\mathcal{E}_i = -\\dfrac{\\Delta\\Phi}{\\Delta t}$$

+

Знак «минус» — математическая запись правила Ленца: ЭДС противодействует изменению потока.

+

Для катушки из $N$ витков:

+

$$\\mathcal{E}_i = -N\\,\\dfrac{\\Delta\\Phi}{\\Delta t}$$

+

Сила индукционного тока: $I_i = \\mathcal{E}_i / R$, где $R$ — сопротивление катушки.

+

Единица: вольт (В).

+

Большая ЭДС возникает при:

+
    +
  • быстром изменении $\\Phi$ (резкое движение, быстрое вращение);
  • +
  • большом числе витков $N$.
  • +
+ `); + + /* THEORY 3 — Применение и пример */ + html += makeCard('example', "Применение и пример", "§32", ` +

Генератор переменного тока. Рамка вращается в магнитном поле, угол $\\alpha$ непрерывно меняется: $\\Phi = BS\\cos(\\omega t)$. Тогда ЭДС:

+

$$\\mathcal{E}_i = -\\dfrac{d\\Phi}{dt} = BS\\omega\\sin(\\omega t)$$

+

Это переменная синусоидальная ЭДС. Так работают электростанции.

+

Трансформатор. Переменный ток в первичной катушке создаёт переменный $\\Phi$ через сердечник → во вторичной катушке возникает ЭДС. Отношение напряжений равно отношению чисел витков:

+

$$\\dfrac{U_2}{U_1} = \\dfrac{N_2}{N_1}$$

+

Пример расчёта. За $\\Delta t = 0{,}1$ с магнитный поток через катушку из $N = 50$ витков изменился с $0$ до $0{,}4$ Вб. Найди модуль ЭДС индукции.

+

$$|\\mathcal{E}_i| = N\\,\\dfrac{|\\Delta\\Phi|}{\\Delta t} = 50\\cdot \\dfrac{0{,}4}{0{,}1} = 200 \\text{ В}$$

+

Вывод. Индукция позволяет получать высокие напряжения «из ничего» — но не нарушая закона сохранения энергии: работу совершает тот, кто меняет $\\Phi$.

+ `); + + /* INTERACTIVE 1 — Правило Ленца */ + html += `
+
ИНТЕРАКТИВ 1
Правило Ленца в действии
+
Двигай магнит к катушке и от неё. Индукционный ток создаёт поле, препятствующее изменению потока — магнит чувствует силу отталкивания (приближается) или притяжения (удаляется).
+
+ +
+
+ +
+
+
`; + + /* INTERACTIVE 2 — Калькулятор ЭДС */ + html += `
+
ИНТЕРАКТИВ 2
Калькулятор ЭДС индукции
+
$|\\mathcal{E}_i| = N\\,|\\Delta\\Phi|/\\Delta t$. Введи число витков, изменение потока и время.
+
+ + + +
+
+
+
`; + + /* INTERACTIVE 3 — Куда направлен ток? */ + html += `
+
ИНТЕРАКТИВ 3
Куда направлен индукционный ток?
+
По правилу Ленца ток своим полем противодействует изменению потока (рост → встречное поле; убывание → поддерживающее).
+
Задача 1 / 6Очки: 0 / 6
+
+
+ +
+
`; + + /* INTERACTIVE 4 — Тренажёр */ + html += `
+
ИНТЕРАКТИВ 4
Тренажёр: закон Фарадея
+
5 задач. Допуск ±5%. Используй $|\\mathcal{E}_i| = N\\,|\\Delta\\Phi|/\\Delta t$.
+
Задача 1 / 5Очки: 0 / 5
+
+
+ + +
+ +
+
`; + html += secNav('p31', 'p33'); html += readButton('p32'); + box.innerHTML = html; renderMath(box); + + /* IV1 — Правило Ленца */ + (function(){ + const svg = document.getElementById('p32-iv1-svg'); + const out = document.getElementById('p32-iv1-out'); + const xS = document.getElementById('p32-iv1-x'); + const xL = document.getElementById('p32-iv1-xL'); + let lastX = +xS.value, lastT = performance.now(); + let movesPos = 0, movesNeg = 0, _done = false; + + function draw(){ + const W = 480, H = 280; + const x = +xS.value; + xL.textContent = x.toFixed(2); + const now = performance.now(); + const dt = Math.max(0.01, (now - lastT) / 1000); + const dx = x - lastX; + const vel = dx / dt; + lastX = x; lastT = now; + + // Катушка слева, магнит справа подъезжает влево (или удаляется вправо) + const coilCx = 160, coilCy = 140, coilL = 120, coilR = 40; + const magW = 90, magH = 40; + // x: -0.5..0.3, отображаем магнит между 430 (далеко справа) и 240 (внутри катушки правой стороной) + const magCx = 430 - (x + 0.5) * (430 - 240) / 0.8; + const magCy = coilCy; + + let g = ''; + g += ''; + g += 'Правило Ленца: индукционный ток противодействует движению магнита'; + + // Катушка + const turns = 9; + for(let i=0;i'; + } + + // Магнит: левая сторона = N (красный, обращён к катушке), правая = S (синий) + g += ''; + g += ''; + g += 'N'; + g += 'S'; + + // Направление движения магнита (стрелка над магнитом) + const moving = Math.abs(vel) > 0.02; + // приближение: vel > 0 (x растёт) → магнит едет влево к катушке + const approaching = vel > 0.02; + const receding = vel < -0.02; + if(moving){ + const dir = approaching ? -1 : +1; // экранно: влево или вправо + const arrFromX = magCx + dir * (magW/2 + 6); + const arrToX = arrFromX + dir * 40; + g += PHYS.drawArrow(arrFromX, magCy - 32, arrToX, magCy - 32, '#0f172a', 2, 9); + g += 'движение'; + } + + // Сила Ленца на магнит (отталкивание при приближ., притяжение при удалении) + // отталкивание: вправо (от катушки); притяжение: влево (к катушке) + if(moving){ + const forceDir = approaching ? +1 : -1; + const fLabel = approaching ? 'отталкивание' : 'притяжение'; + const fColor = approaching ? '#dc2626' : '#0891b2'; + const fFromX = magCx + (forceDir > 0 ? +magW/2 + 6 : -magW/2 - 6); + const fToX = fFromX + forceDir * 36; + g += PHYS.drawArrow(fFromX, magCy + 36, fToX, magCy + 36, fColor, 2.4, 10); + g += 'F ('+fLabel+')'; + } + + // Индукционный ток в витках катушки (стрелочки) + let curSign = 0; + if(approaching) curSign = +1; + else if(receding) curSign = -1; + if(curSign !== 0){ + const dirColor = '#0891b2'; + const ccx = coilCx, ccy = coilCy; + const r = coilR + 4; + const dxArr = curSign > 0 ? +14 : -14; + g += PHYS.drawArrow(ccx - dxArr/2, ccy - r, ccx + dxArr/2, ccy - r, dirColor, 2, 8); + g += PHYS.drawArrow(ccx + dxArr/2, ccy + r, ccx - dxArr/2, ccy + r, dirColor, 2, 8); + g += 'индукц. ток'; + } + + // Эквивалентный «магнит-катушка» — какой полюс смотрит на магнит + if(curSign !== 0){ + // приближение: на магнит смотрит N (отталкивает) → правая сторона катушки = N + // удаление: на магнит смотрит S (притягивает) → правая сторона катушки = S + const eqPole = approaching ? 'N' : 'S'; + const eqColor = approaching ? '#dc2626' : '#2563eb'; + g += '↔ '+eqPole+''; + } + + svg.innerHTML = g; + + let note = ''; + if(!moving) note = 'Магнит покоится. $\\Phi$ не меняется — индукционного тока и силы нет.'; + else if(approaching) note = 'Магнит приближается N-полюсом. $\\Phi$ растёт → индукционный ток создаёт встречное поле (N навстречу N). Катушка отталкивает магнит.'; + else note = 'Магнит удаляется. $\\Phi$ убывает → индукционный ток создаёт поддерживающее поле (S к N). Катушка притягивает магнит.'; + out.innerHTML = note; + renderMath(out); + + if(approaching) movesPos = 1; + if(receding) movesNeg = 1; + if(!_done && movesPos && movesNeg){ _done = true; addXp(10, 'p32-iv1'); bumpProgress('p32', 15); } + } + xS.addEventListener('input', draw); + setInterval(draw, 250); + draw(); + })(); + + /* IV2 — Калькулятор ЭДС индукции */ + (function(){ + const out = document.getElementById('p32-iv2-out'); + const bGo = document.getElementById('p32-iv2-calc'); + const inN = document.getElementById('p32-iv2-N'); + const inP = document.getElementById('p32-iv2-dP'); + const inT = document.getElementById('p32-iv2-dt'); + let count = 0, _done = false; + + function calc(){ + const N = +inN.value, dP = +inP.value, dt = +inT.value; + if(![N,dP,dt].every(isFinite) || dt <= 0 || N < 1){ + out.innerHTML = 'Проверь ввод: $N \\ge 1$, $\\Delta t > 0$.'; + renderMath(out); + return; + } + const E = N * Math.abs(dP) / dt; + let html = '$|\\mathcal{E}_i| = N\\,\\dfrac{|\\Delta\\Phi|}{\\Delta t} = '+N+'\\cdot \\dfrac{'+Math.abs(dP)+'}{'+dt+'} = $ '+E.toFixed(3)+' В'; + // Скорость изменения + html += '
Скорость изменения потока: $\\Delta\\Phi/\\Delta t = '+(Math.abs(dP)/dt).toFixed(4)+'$ Вб/с.'; + out.innerHTML = html; + renderMath(out); + count++; + if(!_done && count >= 3){ _done = true; addXp(10, 'p32-iv2'); bumpProgress('p32', 15); } + } + bGo.addEventListener('click', calc); + [inN,inP,inT].forEach(x => x.addEventListener('keydown', e => { if(e.key==='Enter') calc(); })); + })(); + + /* IV3 — Куда направлен индукционный ток? */ + (function(){ + const OPTS = ['Противодействует (встречное поле)', 'Усиливает (поддерживающее поле)']; + const Q = [ + { q:'Магнит N-полюсом приближается к катушке.', ans:0, why:'$\\Phi$ растёт → ток создаёт встречное поле, навстречу N-полюсу. Магнит отталкивается.' }, + { q:'Магнит S-полюсом приближается к катушке.', ans:0, why:'$\\Phi$ растёт (с другим знаком) → ток создаёт встречное поле. Магнит отталкивается.' }, + { q:'Магнит N-полюсом удаляется от катушки.', ans:1, why:'$\\Phi$ убывает → ток создаёт поле, поддерживающее убывающий поток. Магнит притягивается.' }, + { q:'Магнит S-полюсом удаляется от катушки.', ans:1, why:'$\\Phi$ убывает → ток создаёт поддерживающее поле. Магнит притягивается.' }, + { q:'Ток в соседней катушке растёт.', ans:0, why:'$B$ через нашу катушку растёт → $\\Phi$ растёт → ток противодействует.' }, + { q:'Ток в соседней катушке убывает.', ans:1, why:'$B$ убывает → $\\Phi$ убывает → ток поддерживает (усиливает) поле.' } + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p32-iv3-q'); + const oEl = document.getElementById('p32-iv3-opts'); + const fb = document.getElementById('p32-iv3-fb'); + const iEl = document.getElementById('p32-iv3-i'); + const sEl = document.getElementById('p32-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p32-iv3'); bumpProgress('p32', 25); } + else if(score >= 4){ addXp(8, 'p32-iv3'); bumpProgress('p32', 15); } + return; + } + iEl.textContent = (i+1); + sEl.textContent = score; + qEl.innerHTML = Q[i].q; + oEl.innerHTML = OPTS.map((t, k) => '').join(''); + fb.style.display = 'none'; + renderMath(qEl); + oEl.querySelectorAll('button').forEach(b => { + b.addEventListener('click', () => { + const v = +b.dataset.v; + if(v === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); } + else feedback(fb, false, '✗ Верно: ' + OPTS[Q[i].ans] + '. ' + Q[i].why + ' Дальше ▶'); + sEl.textContent = score; + oEl.querySelectorAll('button').forEach(x => x.disabled = true); + i++; + setTimeout(show, 1900); + }); + }); + } + document.getElementById('p32-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV4 — Тренажёр Фарадея */ + (function(){ + const Q = [ + { q:'$N = 100$, $\\Delta\\Phi = 0{,}01$ Вб, $\\Delta t = 0{,}1$ с. Найди $|\\mathcal{E}_i|$ (в В).', ans:10, tol:0.6, why:'$|\\mathcal{E}| = 100\\cdot 0{,}01/0{,}1 = 10$ В.' }, + { q:'$N = 50$, $\\Delta\\Phi = 0{,}4$ Вб, $\\Delta t = 0{,}1$ с. Найди $|\\mathcal{E}_i|$ (в В).', ans:200, tol:10, why:'$|\\mathcal{E}| = 50\\cdot 0{,}4/0{,}1 = 200$ В.' }, + { q:'$N = 200$. За 0,5 с поток изменился от 0,2 Вб до 0,6 Вб. Найди $|\\mathcal{E}_i|$ (в В).', ans:160, tol:8, why:'$|\\Delta\\Phi| = 0{,}4$ Вб → $|\\mathcal{E}| = 200\\cdot 0{,}4/0{,}5 = 160$ В.' }, + { q:'Знак «−» в формуле $\\mathcal{E}_i = -\\Delta\\Phi/\\Delta t$ означает:
1 = правило Ленца, 2 = отрицательный заряд, 3 = ничего. Введи номер.', ans:1, tol:0.1, why:'Минус — математическая форма правила Ленца: ЭДС противодействует изменению потока.' }, + { q:'Если скорость изменения потока удвоить, во сколько раз изменится $|\\mathcal{E}_i|$?', ans:2, tol:0.1, why:'$|\\mathcal{E}| \\propto |\\Delta\\Phi|/\\Delta t$ — удвоится.' } + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p32-iv4-q'); + const fb = document.getElementById('p32-iv4-fb'); + const iEl = document.getElementById('p32-iv4-i'); + const sEl = document.getElementById('p32-iv4-s'); + const inp = document.getElementById('p32-iv4-inp'); + const bGo = document.getElementById('p32-iv4-go'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + inp.disabled = true; bGo.disabled = true; + if(score === Q.length){ addXp(15, 'p32-iv4'); bumpProgress('p32', 25); } + else if(score >= 3){ addXp(8, 'p32-iv4'); bumpProgress('p32', 15); } + return; + } + iEl.textContent = (i+1); + sEl.textContent = score; + qEl.innerHTML = Q[i].q; + fb.style.display = 'none'; + inp.value = ''; inp.disabled = false; bGo.disabled = false; inp.focus(); + renderMath(qEl); + } + function check(){ + if(inp.disabled) return; + const v = parseFloat(inp.value.replace(',','.')); + if(!isFinite(v)){ feedback(fb, false, 'Введи число.'); return; } + const tol = Math.max(Q[i].tol, Math.abs(Q[i].ans)*0.05); + const ok = Math.abs(v - Q[i].ans) <= tol; + if(ok){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); } + else feedback(fb, false, '✗ Верно: ' + Q[i].ans + '. ' + Q[i].why + ' Дальше ▶'); + sEl.textContent = score; + inp.disabled = true; bGo.disabled = true; + i++; + setTimeout(show, 1900); + } + bGo.addEventListener('click', check); + inp.addEventListener('keydown', e => { if(e.key==='Enter') check(); }); + document.getElementById('p32-iv4-restart').addEventListener('click', () => { i = 0; score = 0; inp.disabled=false; bGo.disabled=false; show(); }); + show(); + })(); + wireReadBtn('p32'); }