From 774b54afc8ec2428053324b5e229de7a47db6e5b Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 17:41:19 +0300 Subject: [PATCH] =?UTF-8?q?feat(phys10=20ch3=20wave4):=20=C2=A722=20=C2=AB?= =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D1=80=D1=8F=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=C2=BB=20+=20=C2=A723=20=C2=AB=D0=9A=D0=BE=D0=BD=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=81=D0=B0=D1=82=D0=BE=D1=80=D1=8B=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/textbooks/physics_10_ch3.html | 686 ++++++++++++++++++++++++- 1 file changed, 674 insertions(+), 12 deletions(-) diff --git a/frontend/textbooks/physics_10_ch3.html b/frontend/textbooks/physics_10_ch3.html index 76c3f94..c845b30 100644 --- a/frontend/textbooks/physics_10_ch3.html +++ b/frontend/textbooks/physics_10_ch3.html @@ -2798,34 +2798,696 @@ function build_p21(){ function build_p22(){ const box = document.getElementById('p22-body'); let html = ''; - html += makeCard('theory', "Разность потенциалов. Напряжение", "§22", ` -

Разность потенциалов. Напряжение — этот параграф в разработке (Phase 1+).

-

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

-

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

+ + /* THEORY 1 — Разность потенциалов и напряжение */ + html += makeCard('theory', "Разность потенциалов и напряжение", "§22", ` +

Напряжение $U$ между двумя точками 1 и 2 электростатического поля — это разность потенциалов этих точек:

+

$$U_{12} = \\varphi_1 - \\varphi_2$$

+

Единица измерения: Вольт (В) $= 1$ Дж / 1 Кл.

+

$1$ В — это напряжение, при котором поле совершает работу $1$ Дж при переносе заряда $1$ Кл из одной точки в другую.

+

Работа поля при перемещении заряда $q$ из точки 1 в точку 2:

+

$$A_{12} = q U_{12} = q(\\varphi_1 - \\varphi_2)$$

+

Если $A > 0$ — поле помогает перемещению. Если $A < 0$ — поле сопротивляется (нужно работать против поля).

+

Напряжение измеряется вольтметром (подключается между двумя точками).

`); + + /* THEORY 2 — Связь U и E в однородном поле */ + html += makeCard('rule', "Связь напряжения с напряжённостью", "§22", ` +

В однородном поле (например, между обкладок плоского конденсатора) напряжение и напряжённость связаны формулой:

+

$$U = E \\cdot d$$

+

где:

+ +

Если перемещение перпендикулярно $\\vec{E}$ — напряжение между точками равно нулю.

+

Эта формула — главный инструмент для расчётов в однородных полях: конденсаторы, поле над поверхностью, поле между параллельными пластинами.

+

Отсюда удобная форма для напряжённости: $E = U/d$ — поэтому единица $\\vec{E}$ — В/м.

+ `); + + /* THEORY 3 — Эквипотенциальные поверхности */ + html += makeCard('example', "Эквипотенциальные поверхности", "§22", ` +

Эквипотенциальная поверхность — поверхность, на которой потенциал во всех точках одинаков ($\\varphi = $ const).

+

Свойства:

+ +

Пример. Между параллельными пластинами заряженного конденсатора эквипотенциальные поверхности — плоскости, параллельные пластинам. Чем ближе к положительной пластине — тем выше $\\varphi$.

+ `); + + /* INTERACTIVE 1 — Связь U и E в однородном поле */ + html += `
+
ИНТЕРАКТИВ 1
Связь $U$ и $E$ в однородном поле
+
Меняй напряжение $U$ и расстояние $d$ между пластинами. Наблюдай $E = U/d$ — ширина стрелок $\\vec{E}$ пропорциональна напряжённости.
+
+ + +
+
+ +
+
+
`; + + /* INTERACTIVE 2 — Калькулятор работы поля */ + html += `
+
ИНТЕРАКТИВ 2
Калькулятор работы поля
+
Режим A: $A = q(\\varphi_1 - \\varphi_2)$. Режим B: $A = qEd$ в однородном поле.
+
+ + +
+
+ + + +
+ +
+ +
+
+
`; + + /* INTERACTIVE 3 — Знак напряжения */ + html += `
+
ИНТЕРАКТИВ 3
$U$ положительно, отрицательно или ноль?
+
Определи знак напряжения $U_{12} = \\varphi_1 - \\varphi_2$.
+
Задача 1 / 6Очки: 0 / 6
+
+
+ +
+
`; + + /* INTERACTIVE 4 — Тренажёр напряжения */ + html += `
+
ИНТЕРАКТИВ 4
Тренажёр напряжения
+
5 задач. Допуск $\\pm 5\\%$.
+
Задача 1 / 5Очки: 0 / 5
+
+
+ ответ = + + + +
+ +
`; + html += secNav('p21', 'p23'); html += readButton('p22'); + box.innerHTML = html; renderMath(box); + + /* IV1 — Связь U и E в однородном поле */ + (function(){ + const svg = document.getElementById('p22-iv1-svg'); + const US = document.getElementById('p22-iv1-U'); + const dS = document.getElementById('p22-iv1-d'); + const UL = document.getElementById('p22-iv1-UL'); + const dL = document.getElementById('p22-iv1-dL'); + const out = document.getElementById('p22-iv1-out'); + const seen = new Set(); + let _done = false; + + function render(){ + const U = +US.value, d = +dS.value; + UL.textContent = U; dL.textContent = d.toFixed(2); + const E = U / d; + + const W = 480, H = 280; + // Две пластины: верхняя "+", нижняя "−". Расстояние px зависит от d. + const yMid = 140; + const platePx = Math.max(30, Math.min(180, d * 900)); // визуальное расстояние + const yTop = yMid - platePx/2; + const yBot = yMid + platePx/2; + const xL = 80, xR = 400; + + let g = ''; + g += ''; + g += 'Однородное поле: $U = E\\cdot d$'; + + // Верхняя пластина (+) + g += ''; + g += '+'; + // Нижняя пластина (−) + g += ''; + g += ''; + + // Линии E между пластинами — толщина ~ E (от 0.6 до 4) + const Emin = 10/0.20, Emax = 500/0.01; + const wE = 0.6 + 3.4 * (Math.min(E, Emax) - Emin) / (Emax - Emin); + const sw = Math.max(0.8, Math.min(4, wE)); + const arrowCount = 6; + for(let i = 0; i < arrowCount; i++){ + const x = xL + 40 + (xR - xL - 80) * i / (arrowCount-1); + g += PHYS.drawArrow(x, yTop+6, x, yBot-6, '#a78bfa', sw, 7); + } + g += '$\\vec{E}$'; + + // Метка d (вертикальная) + g += ''; + g += ''; + g += ''; + g += 'd'; + + // Эквипотенциали — несколько горизонтальных пунктирных + const equipCount = 3; + for(let i = 1; i <= equipCount; i++){ + const yE = yTop + (yBot-yTop) * i / (equipCount+1); + g += ''; + } + g += 'эквипотенциали ⊥ $\\vec{E}$'; + + svg.innerHTML = g; + + out.innerHTML = '$E = U/d = '+U+'/'+d.toFixed(2)+' = '+E.toFixed(0)+'$ В/м   ' + + '(чем больше $U$ или меньше $d$ — тем сильнее поле)'; + renderMath(out); + + seen.add(U+':'+d.toFixed(2)); + if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p22-iv1'); bumpProgress('p22', 15); } + } + US.addEventListener('input', render); + dS.addEventListener('input', render); + render(); + })(); + + /* IV2 — Калькулятор работы поля */ + (function(){ + let mode = 'A'; + const inA = document.getElementById('p22-iv2-inA'); + const inB = document.getElementById('p22-iv2-inB'); + const mA = document.getElementById('p22-iv2-mA'); + const mB = document.getElementById('p22-iv2-mB'); + const out = document.getElementById('p22-iv2-out'); + const seen = new Set(); + let _done = false; + + function setMode(m){ + mode = m; + if(m === 'A'){ + inA.style.display = 'grid'; inB.style.display = 'none'; + mA.classList.add('primary'); mB.classList.remove('primary'); + } else { + inA.style.display = 'none'; inB.style.display = 'grid'; + mB.classList.add('primary'); mA.classList.remove('primary'); + } + calc(); + } + function calc(){ + let html = ''; + if(mode === 'A'){ + const q = parseFloat(document.getElementById('p22-iv2-q').value) || 0; + const f1 = parseFloat(document.getElementById('p22-iv2-f1').value) || 0; + const f2 = parseFloat(document.getElementById('p22-iv2-f2').value) || 0; + const U = f1 - f2; + const A = (q * 1e-9) * U; + const Annano = A * 1e9; + html += '
$U = \\varphi_1 - \\varphi_2 = '+f1+' - '+f2+' = '+U.toFixed(1)+'$ В
'; + html += '
$A = qU = '+q+'\\cdot 10^{-9} \\cdot '+U.toFixed(1)+' = '+Annano.toFixed(2)+'$ нДж
'; + if(A > 0) html += '
$A > 0$: поле совершает положительную работу.
'; + else if(A < 0) html += '
$A < 0$: поле сопротивляется — нужно работать против поля.
'; + else html += '
$A = 0$: точки на одной эквипотенциали.
'; + seen.add('A:'+q+':'+f1+':'+f2); + } else { + const q = parseFloat(document.getElementById('p22-iv2-qB').value) || 0; + const E = parseFloat(document.getElementById('p22-iv2-E').value) || 0; + const d = parseFloat(document.getElementById('p22-iv2-d').value) || 0; + const U = E * d; + const A = (q * 1e-9) * U; + const Annano = A * 1e9; + html += '
$U = Ed = '+E+'\\cdot '+d+' = '+U.toFixed(2)+'$ В
'; + html += '
$A = qEd = '+q+'\\cdot 10^{-9} \\cdot '+E+' \\cdot '+d+' = '+Annano.toFixed(2)+'$ нДж
'; + seen.add('B:'+q+':'+E+':'+d); + } + out.innerHTML = html; + renderMath(out); + if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p22-iv2'); bumpProgress('p22', 15); } + } + mA.addEventListener('click', () => setMode('A')); + mB.addEventListener('click', () => setMode('B')); + document.getElementById('p22-iv2-go').addEventListener('click', calc); + ['p22-iv2-q','p22-iv2-f1','p22-iv2-f2','p22-iv2-qB','p22-iv2-E','p22-iv2-d'].forEach(id => { + const el = document.getElementById(id); + if(el) el.addEventListener('keydown', e => { if(e.key === 'Enter') calc(); }); + }); + setMode('A'); + })(); + + /* IV3 — Знак напряжения */ + (function(){ + const OPTS = ['$U > 0$', '$U < 0$', '$U = 0$']; + const Q = [ + { q:'$\\varphi_1 = 100$ В, $\\varphi_2 = 50$ В. Чему равно $U_{12}$?', ans:0, why:'$U = 100 - 50 = 50 > 0$.' }, + { q:'$\\varphi_1 = 30$ В, $\\varphi_2 = 80$ В.', ans:1, why:'$U = 30 - 80 = -50 < 0$.' }, + { q:'$\\varphi_1 = 50$ В, $\\varphi_2 = 50$ В.', ans:2, why:'$U = 50 - 50 = 0$ — на одной эквипотенциали.' }, + { q:'Точки 1 и 2 лежат на одной эквипотенциальной поверхности.', ans:2, why:'$\\varphi_1 = \\varphi_2 \\Rightarrow U = 0$.' }, + { q:'В направлении $\\vec{E}$ на расстоянии $d = 0{,}1$ м при $E = 1000$ В/м.', ans:0, why:'$U = Ed = 100$ В $> 0$ (потенциал падает вдоль $\\vec{E}$).' }, + { q:'Перемещение между двумя точками — строго перпендикулярно $\\vec{E}$.', ans:2, why:'Это вдоль эквипотенциали $\\Rightarrow U = 0$.' } + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p22-iv3-q'); + const oEl = document.getElementById('p22-iv3-opts'); + const fb = document.getElementById('p22-iv3-fb'); + const iEl = document.getElementById('p22-iv3-i'); + const sEl = document.getElementById('p22-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p22-iv3'); bumpProgress('p22', 25); } + else if(score >= 4){ addXp(8, 'p22-iv3'); bumpProgress('p22', 15); } + return; + } + iEl.textContent = (i+1); + sEl.textContent = score; + const item = Q[i]; + qEl.innerHTML = item.q; + oEl.innerHTML = OPTS.map((t, k) => '').join(''); + fb.style.display = 'none'; + renderMath(qEl); renderMath(oEl); + oEl.querySelectorAll('button').forEach(b => { + b.addEventListener('click', () => { + const v = +b.dataset.v; + if(v === item.ans){ score++; feedback(fb, true, '✓ Верно! ' + item.why + ' Дальше ▶'); } + else feedback(fb, false, '✗ Неверно. ' + item.why + ' Дальше ▶'); + sEl.textContent = score; + oEl.querySelectorAll('button').forEach(x => x.disabled = true); + i++; + setTimeout(show, 1800); + }); + }); + } + document.getElementById('p22-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV4 — Тренажёр напряжения */ + (function(){ + const Q = [ + { q:'$\\varphi_1 = 100$ В, $\\varphi_2 = 40$ В. Напряжение $U_{12}$ в В?', ans:60, tol:3, hint:'$U = \\varphi_1 - \\varphi_2 = 100 - 40 = 60$ В.' }, + { q:'Однородное поле $E = 500$ В/м между пластинами $d = 0{,}02$ м. Напряжение $U$ в В?', ans:10, tol:0.5, hint:'$U = Ed = 500\\cdot 0{,}02 = 10$ В.' }, + { q:'Заряд $+2$ мкКл перенесли при $U = 50$ В. Работа поля в мкДж?', ans:100, tol:5, hint:'$A = qU = 2\\cdot 10^{-6}\\cdot 50 = 10^{-4}$ Дж $= 100$ мкДж.' }, + { q:'$U = 1000$ В между пластинами на $d = 0{,}05$ м. Напряжённость $E$ в В/м?', ans:20000, tol:500, hint:'$E = U/d = 1000/0{,}05 = 20\\,000$ В/м.' }, + { q:'Какова работа поля при перемещении заряда вдоль эквипотенциальной поверхности? (Дж)', ans:0, tol:0.0001, hint:'$\\Delta\\varphi = 0 \\Rightarrow A = q\\Delta\\varphi = 0$.' } + ]; + let i = 0, score = 0; + function show(){ + if(i >= Q.length){ + document.getElementById('p22-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + if(score === Q.length){ addXp(15, 'p22-iv4'); bumpProgress('p22', 25); } + else if(score >= 3){ addXp(8, 'p22-iv4'); bumpProgress('p22', 15); } + return; + } + document.getElementById('p22-iv4-i').textContent = (i+1); + document.getElementById('p22-iv4-s').textContent = score; + document.getElementById('p22-iv4-q').innerHTML = Q[i].q; + document.getElementById('p22-iv4-ans').value = ''; + renderMath(document.getElementById('p22-iv4-q')); + document.getElementById('p22-iv4-fb').style.display = 'none'; + } + function go(){ + if(i >= Q.length) return; + const fb = document.getElementById('p22-iv4-fb'); + const raw = document.getElementById('p22-iv4-ans').value.replace(',', '.'); + const ans = parseFloat(raw); + if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; } + if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); } + else feedback(fb, false, '✗ Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶'); + document.getElementById('p22-iv4-s').textContent = score; + i++; + setTimeout(show, 1800); + } + document.getElementById('p22-iv4-go').addEventListener('click', go); + document.getElementById('p22-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); }); + document.getElementById('p22-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + wireReadBtn('p22'); } function build_p23(){ const box = document.getElementById('p23-body'); let html = ''; - html += makeCard('theory', "Конденсаторы", "§23", ` -

Конденсаторы — этот параграф в разработке (Phase 1+).

-

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

-

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

+ + /* THEORY 1 — Конденсатор и электроёмкость */ + html += makeCard('theory', "Конденсатор и электроёмкость", "§23", ` +

Конденсатор — устройство из двух проводников (обкладок), разделённых диэлектриком, предназначенное для накопления электрического заряда и энергии.

+

Заряд конденсатора $q$ — это модуль заряда на одной обкладке (на другой обкладке заряд $-q$). Между обкладками возникает напряжение $U$.

+

Электроёмкость $C$ — отношение заряда обкладки к напряжению между обкладками:

+

$$C = \\dfrac{q}{U}$$

+

$C$ — характеристика самого конденсатора (не зависит от $q$ и $U$, только от геометрии и диэлектрика).

+

Единица: Фарад (Ф) $= 1$ Кл / 1 В. Это очень большая ёмкость! На практике:

+
    +
  • мкФ ($\\mu$Ф) $= 10^{-6}$ Ф
  • +
  • нФ $= 10^{-9}$ Ф
  • +
  • пФ $= 10^{-12}$ Ф
  • +
`); + + /* THEORY 2 — Плоский конденсатор */ + html += makeCard('rule', "Плоский конденсатор", "§23", ` +

Плоский конденсатор состоит из двух параллельных пластин площадью $S$, разделённых диэлектриком толщины $d$.

+

$$C = \\dfrac{\\varepsilon \\varepsilon_0 S}{d}$$

+

где:

+
    +
  • $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м — электрическая постоянная
  • +
  • $\\varepsilon$ — относительная диэлектрическая проницаемость диэлектрика (для воздуха $\\approx 1$, для слюды $\\approx 6$, керамики до 1000)
  • +
  • $S$ — площадь пластины в м²
  • +
  • $d$ — расстояние между пластинами в м
  • +
+

Способы увеличить $C$:

+
    +
  • Увеличить площадь $S$.
  • +
  • Уменьшить расстояние $d$.
  • +
  • Использовать диэлектрик с большим $\\varepsilon$.
  • +
+ `); + + /* THEORY 3 — Соединения конденсаторов */ + html += makeCard('example', "Соединения конденсаторов", "§23", ` +

Параллельное соединение:

+
    +
  • Напряжение одинаково: $U = U_1 = U_2 = \\ldots$
  • +
  • Заряды складываются: $q = q_1 + q_2 + \\ldots$
  • +
  • Ёмкости складываются: $C_{общ} = C_1 + C_2 + \\ldots$
  • +
+

Последовательное соединение:

+
    +
  • Заряд одинаков: $q = q_1 = q_2 = \\ldots$
  • +
  • Напряжения складываются: $U = U_1 + U_2 + \\ldots$
  • +
  • Складываются обратные ёмкости:
  • +
+

$$\\dfrac{1}{C_{общ}} = \\dfrac{1}{C_1} + \\dfrac{1}{C_2} + \\ldots$$

+

Для двух последовательно соединённых конденсаторов: $C_{общ} = \\dfrac{C_1 C_2}{C_1 + C_2}$.

+

Применение: в радио и электронике для фильтрации и сглаживания сигналов, в импульсных устройствах (фотовспышка), в фильтрах источников питания, в компьютерной памяти.

+ `); + + /* INTERACTIVE 1 — Конструктор плоского конденсатора */ + html += `
+
ИНТЕРАКТИВ 1
Конструктор плоского конденсатора
+
Меняй площадь пластин $S$, расстояние $d$ и диэлектрик. Наблюдай $C = \\varepsilon\\varepsilon_0 S/d$.
+
+ + +
+
+ + + +
+
+ +
+
+
`; + + /* INTERACTIVE 2 — Калькулятор соединений */ + html += `
+
ИНТЕРАКТИВ 2
Калькулятор соединений конденсаторов
+
Параллельно: $C = C_1 + C_2$. Последовательно: $1/C = 1/C_1 + 1/C_2$.
+
+ + +
+
+ + +
+
+ +
+
+
`; + + /* INTERACTIVE 3 — Что увеличит ёмкость? */ + html += `
+
ИНТЕРАКТИВ 3
Что увеличит ёмкость конденсатора?
+
Опираясь на $C = \\varepsilon\\varepsilon_0 S/d$, выбери: действие увеличит или уменьшит $C$.
+
Задача 1 / 6Очки: 0 / 6
+
+
+ +
+
`; + + /* INTERACTIVE 4 — Тренажёр конденсаторов */ + html += `
+
ИНТЕРАКТИВ 4
Тренажёр конденсаторов
+
5 задач. $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м. Допуск $\\pm 5\\%$.
+
Задача 1 / 5Очки: 0 / 5
+
+
+ ответ = + + + +
+ +
`; + html += secNav('p22', 'p24'); html += readButton('p23'); + box.innerHTML = html; renderMath(box); + + /* IV1 — Конструктор плоского конденсатора */ + (function(){ + const eps0 = PHYS.CONST.eps0; + const svg = document.getElementById('p23-iv1-svg'); + const SS = document.getElementById('p23-iv1-S'); + const dS = document.getElementById('p23-iv1-d'); + const SL = document.getElementById('p23-iv1-SL'); + const dL = document.getElementById('p23-iv1-dL'); + const out = document.getElementById('p23-iv1-out'); + const bA = document.getElementById('p23-iv1-eA'); + const bM = document.getElementById('p23-iv1-eM'); + const bC = document.getElementById('p23-iv1-eC'); + const seen = new Set(); + let _done = false; + let eps = 1, epsName = 'воздух', epsColor = '#f8fafc'; + + function setEps(e, name, color, btn){ + eps = e; epsName = name; epsColor = color; + [bA, bM, bC].forEach(x => x.classList.remove('primary')); + btn.classList.add('primary'); + render(); + } + function render(){ + const S = +SS.value, d = +dS.value; + SL.textContent = S.toFixed(3); + dL.textContent = d.toFixed(3); + const C = eps * eps0 * S / d; // Ф + const Cnf = C * 1e9; // нФ + const Cmkf = C * 1e6; // мкФ + + const W = 480, H = 280, cx = W/2, cy = H/2; + // Длина пластин пропорциональна sqrt(S), макс ширина ~280 + const plateLen = 80 + 200 * Math.sqrt(S / 0.1); + // Расстояние между пластинами пропорционально d + const platesGap = 20 + 120 * (d / 0.01); + const xL = cx - plateLen/2, xR = cx + plateLen/2; + const yTop = cy - platesGap/2; + const yBot = cy + platesGap/2; + + let g = ''; + g += ''; + g += 'Плоский конденсатор'; + + // Диэлектрик между пластинами + g += ''; + // Верхняя пластина (+) + g += ''; + // Нижняя пластина (−) + g += ''; + // Метки + и − + g += '+'; + g += ''; + + // Подпись диэлектрика по центру + g += ''+epsName+' (ε = '+eps+')'; + + // Размер d справа + g += ''; + g += ''; + g += ''; + g += 'd'; + + // Размер плакеты сверху (S = площадь, длина — проекция) + g += 'площадь S'; + + svg.innerHTML = g; + + // Вывод значения + let CStr; + if(Cmkf >= 1) CStr = Cmkf.toFixed(2) + ' мкФ'; + else if(Cnf >= 1) CStr = Cnf.toFixed(2) + ' нФ'; + else CStr = (C*1e12).toFixed(2) + ' пФ'; + + out.innerHTML = '$C = \\dfrac{\\varepsilon\\varepsilon_0 S}{d} = \\dfrac{'+eps+'\\cdot 8{,}85\\cdot 10^{-12}\\cdot '+S.toFixed(3)+'}{'+d.toFixed(3)+'} = '+C.toExponential(2)+'$ Ф $\\approx$ '+CStr+''; + renderMath(out); + + seen.add(S.toFixed(3)+':'+d.toFixed(3)+':'+eps); + if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p23-iv1'); bumpProgress('p23', 15); } + } + bA.addEventListener('click', () => setEps(1, 'воздух', '#f8fafc', bA)); + bM.addEventListener('click', () => setEps(6, 'слюда', '#e2e8f0', bM)); + bC.addEventListener('click', () => setEps(100, 'керамика', '#fed7aa', bC)); + SS.addEventListener('input', render); + dS.addEventListener('input', render); + render(); + })(); + + /* IV2 — Калькулятор соединений */ + (function(){ + let mode = 'P'; + const mP = document.getElementById('p23-iv2-mP'); + const mS = document.getElementById('p23-iv2-mS'); + const out = document.getElementById('p23-iv2-out'); + const seen = new Set(); + let _done = false; + + function setMode(m){ + mode = m; + if(m === 'P'){ mP.classList.add('primary'); mS.classList.remove('primary'); } + else { mS.classList.add('primary'); mP.classList.remove('primary'); } + calc(); + } + function calc(){ + const C1 = parseFloat(document.getElementById('p23-iv2-C1').value) || 0; + const C2 = parseFloat(document.getElementById('p23-iv2-C2').value) || 0; + let html = ''; + if(mode === 'P'){ + const Cob = C1 + C2; + html += '
Параллельное соединение:
'; + html += '
$C_{общ} = C_1 + C_2 = '+C1+' + '+C2+' = '+Cob.toFixed(2)+'$ мкФ
'; + } else { + const inv = 1/C1 + 1/C2; + const Cob = (C1*C2)/(C1+C2); + html += '
Последовательное соединение:
'; + html += '
$\\dfrac{1}{C_{общ}} = \\dfrac{1}{C_1} + \\dfrac{1}{C_2} = \\dfrac{1}{'+C1+'} + \\dfrac{1}{'+C2+'} = '+inv.toFixed(3)+'$ 1/мкФ
'; + html += '
$C_{общ} = \\dfrac{C_1 C_2}{C_1 + C_2} = \\dfrac{'+C1+'\\cdot '+C2+'}{'+(C1+C2)+'} = '+Cob.toFixed(3)+'$ мкФ
'; + } + out.innerHTML = html; + renderMath(out); + seen.add(mode+':'+C1+':'+C2); + if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p23-iv2'); bumpProgress('p23', 15); } + } + mP.addEventListener('click', () => setMode('P')); + mS.addEventListener('click', () => setMode('S')); + document.getElementById('p23-iv2-go').addEventListener('click', calc); + ['p23-iv2-C1','p23-iv2-C2'].forEach(id => { + document.getElementById(id).addEventListener('keydown', e => { if(e.key === 'Enter') calc(); }); + }); + setMode('P'); + })(); + + /* IV3 — Что увеличит ёмкость? */ + (function(){ + const OPTS = ['Увеличит', 'Уменьшит']; + const Q = [ + { q:'Увеличить площадь пластин $S$ (при прочих равных).', ans:0, why:'$C \\propto S$ — рост $S$ увеличивает $C$.' }, + { q:'Увеличить расстояние $d$ между пластинами.', ans:1, why:'$C \\propto 1/d$ — рост $d$ уменьшает $C$.' }, + { q:'Заменить воздух на слюду ($\\varepsilon = 6$) между пластинами.', ans:0, why:'$C \\propto \\varepsilon$ — больший $\\varepsilon$ увеличивает $C$.' }, + { q:'Уменьшить площадь пластин $S$ вдвое.', ans:1, why:'$C \\propto S$ — уменьшение $S$ уменьшает $C$.' }, + { q:'Уменьшить расстояние $d$ между пластинами.', ans:0, why:'$C \\propto 1/d$ — уменьшение $d$ увеличивает $C$.' }, + { q:'Заменить слюду ($\\varepsilon = 6$) на вакуум ($\\varepsilon = 1$).', ans:1, why:'$\\varepsilon$ уменьшится в 6 раз $\\Rightarrow C$ уменьшится.' } + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p23-iv3-q'); + const oEl = document.getElementById('p23-iv3-opts'); + const fb = document.getElementById('p23-iv3-fb'); + const iEl = document.getElementById('p23-iv3-i'); + const sEl = document.getElementById('p23-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p23-iv3'); bumpProgress('p23', 25); } + else if(score >= 4){ addXp(8, 'p23-iv3'); bumpProgress('p23', 15); } + return; + } + iEl.textContent = (i+1); + sEl.textContent = score; + const item = Q[i]; + qEl.innerHTML = item.q; + oEl.innerHTML = OPTS.map((t, k) => '').join(''); + fb.style.display = 'none'; + renderMath(qEl); renderMath(oEl); + oEl.querySelectorAll('button').forEach(b => { + b.addEventListener('click', () => { + const v = +b.dataset.v; + if(v === item.ans){ score++; feedback(fb, true, '✓ Верно! ' + item.why + ' Дальше ▶'); } + else feedback(fb, false, '✗ Неверно. ' + item.why + ' Дальше ▶'); + sEl.textContent = score; + oEl.querySelectorAll('button').forEach(x => x.disabled = true); + i++; + setTimeout(show, 1800); + }); + }); + } + document.getElementById('p23-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV4 — Тренажёр конденсаторов */ + (function(){ + const Q = [ + { q:'$S = 0{,}01$ м², $d = 0{,}001$ м, воздух ($\\varepsilon = 1$). Ёмкость $C$ в пФ?', ans:88.5, tol:2, hint:'$C = \\varepsilon\\varepsilon_0 S/d = 8{,}85\\cdot 10^{-12}\\cdot 0{,}01/0{,}001 \\approx 88{,}5$ пФ.' }, + { q:'$C = 100$ мкФ, $U = 50$ В. Заряд $q$ в мКл?', ans:5, tol:0.3, hint:'$q = CU = 100\\cdot 10^{-6}\\cdot 50 = 5\\cdot 10^{-3}$ Кл $= 5$ мКл.' }, + { q:'$C_1 = 2$ мкФ, $C_2 = 6$ мкФ, соединены параллельно. $C_{общ}$ в мкФ?', ans:8, tol:0.5, hint:'$C_{общ} = C_1 + C_2 = 2 + 6 = 8$ мкФ.' }, + { q:'$C_1 = 2$ мкФ, $C_2 = 6$ мкФ, соединены последовательно. $C_{общ}$ в мкФ?', ans:1.5, tol:0.1, hint:'$C_{общ} = C_1 C_2 /(C_1+C_2) = 12/8 = 1{,}5$ мкФ.' }, + { q:'$C = 200$ нФ, $U = 100$ В. Заряд конденсатора $q$ в мкКл?', ans:20, tol:1, hint:'$q = CU = 200\\cdot 10^{-9}\\cdot 100 = 2\\cdot 10^{-5}$ Кл $= 20$ мкКл.' } + ]; + let i = 0, score = 0; + function show(){ + if(i >= Q.length){ + document.getElementById('p23-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + if(score === Q.length){ addXp(15, 'p23-iv4'); bumpProgress('p23', 25); } + else if(score >= 3){ addXp(8, 'p23-iv4'); bumpProgress('p23', 15); } + return; + } + document.getElementById('p23-iv4-i').textContent = (i+1); + document.getElementById('p23-iv4-s').textContent = score; + document.getElementById('p23-iv4-q').innerHTML = Q[i].q; + document.getElementById('p23-iv4-ans').value = ''; + renderMath(document.getElementById('p23-iv4-q')); + document.getElementById('p23-iv4-fb').style.display = 'none'; + } + function go(){ + if(i >= Q.length) return; + const fb = document.getElementById('p23-iv4-fb'); + const raw = document.getElementById('p23-iv4-ans').value.replace(',', '.'); + const ans = parseFloat(raw); + if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; } + if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); } + else feedback(fb, false, '✗ Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶'); + document.getElementById('p23-iv4-s').textContent = score; + i++; + setTimeout(show, 1800); + } + document.getElementById('p23-iv4-go').addEventListener('click', go); + document.getElementById('p23-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); }); + document.getElementById('p23-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + wireReadBtn('p23'); }