feat(phys10 ch3 wave5 + final): §24 «Энергия конденсатора» + Финал Главы 3 (7 боссов)

This commit is contained in:
Maxim Dolgolyov
2026-05-29 17:48:13 +03:00
parent 22b95ed072
commit f999ad550e
+580 -15
View File
@@ -3494,35 +3494,600 @@ function build_p23(){
function build_p24(){
const box = document.getElementById('p24-body');
let html = '';
html += makeCard('theory', "Энергия поля конденсатора", "§24", `
<p><b>Энергия поля конденсатора</b> — этот параграф в разработке (Phase 1+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет учебника. <b>Phase 3+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
</p>
/* THEORY 1 — Энергия заряженного конденсатора */
html += makeCard('theory', "Энергия заряженного конденсатора", "§24", `
<p>Заряженный конденсатор обладает <b>запасённой энергией</b>. Чтобы зарядить конденсатор, источник тока совершает работу — переносит заряды с одной обкладки на другую против сил электрического поля.</p>
<p>Если рассчитать эту работу через интегрирование, получим, что <b>энергия конденсатора</b> равна:</p>
<p style="text-align:center;margin:10px 0">$$W = \\dfrac{CU^2}{2}$$</p>
<p>Используя соотношение $q = CU$ ($C = q/U$, $U = q/C$), эту формулу можно переписать ещё двумя способами:</p>
<p style="text-align:center;margin:10px 0">$$W = \\dfrac{q^2}{2C} = \\dfrac{qU}{2}$$</p>
<p>Все три формулы <b>эквивалентны</b> — выбирай удобную в зависимости от того, какие величины даны в задаче:</p>
<ul style="margin:6px 0 6px 18px">
<li>Известны $C$ и $U$ → $W = CU^2/2$.</li>
<li>Известны $q$ и $C$ → $W = q^2/(2C)$.</li>
<li>Известны $q$ и $U$ → $W = qU/2$.</li>
</ul>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Единица энергии:</b> Джоуль (Дж). На практике в электронике: мДж $= 10^{-3}$ Дж, мкДж $= 10^{-6}$ Дж.</p>
`);
/* THEORY 2 — Где запасена энергия */
html += makeCard('rule', "Где запасена энергия. Плотность энергии поля", "§24", `
<p>Где же находится энергия конденсатора? Не на пластинах и не в зарядах. <b>Энергия запасена в электрическом поле</b> между обкладками.</p>
<p>Это глубокий вывод: <b>электрическое поле — носитель энергии</b>, как и материя. Энергию можно вычислить через характеристики самого поля.</p>
<p style="margin-top:10px"><b>Объёмная плотность энергии</b> — энергия в единице объёма поля:</p>
<p style="text-align:center;margin:10px 0">$$w = \\dfrac{\\varepsilon \\varepsilon_0 E^2}{2}$$</p>
<ul style="margin:6px 0 6px 18px">
<li>$w$ — плотность энергии в Дж/м³</li>
<li>$E$ — напряжённость поля в В/м</li>
<li>$\\varepsilon$ — относительная диэлектрическая проницаемость среды</li>
<li>$\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м — электрическая постоянная</li>
</ul>
<p style="margin-top:10px">Полная энергия поля в объёме $V$:</p>
<p style="text-align:center;margin:10px 0">$$W = w \\cdot V$$</p>
<p style="padding:10px 14px;background:var(--warn-bg,#fef3c7);border-left:4px solid var(--warn,#f59e0b);border-radius:9px"><b>Проверка:</b> для плоского конденсатора $E = U/d$, $V = Sd$, $C = \\varepsilon\\varepsilon_0 S/d$. Подставив, получаем $W = \\varepsilon\\varepsilon_0 (U/d)^2 \\cdot Sd / 2 = (\\varepsilon\\varepsilon_0 S/d)\\cdot U^2/2 = CU^2/2$. То же самое!</p>
`);
/* THEORY 3 — Применение */
html += makeCard('example', "Применение энергии конденсатора", "§24", `
<p>Запасание энергии в конденсаторах используется в технике и медицине очень широко:</p>
<ul style="margin:6px 0 6px 18px">
<li><b>Фотовспышка:</b> конденсатор медленно заряжается от батареи, затем за миллисекунды разряжается через ксеноновую лампу → яркая вспышка света.</li>
<li><b>Импульсные лазеры:</b> накопленная энергия за миллисекунды отдаётся в активную среду для накачки.</li>
<li><b>Дефибрилляторы:</b> короткий мощный импульс (сотни Дж) восстанавливает ритм сердца — спасает жизни.</li>
<li><b>Источники бесперебойного питания, фильтры:</b> сглаживают пульсации тока и поддерживают питание при просадках.</li>
<li><b>Суперконденсаторы в электромобилях:</b> быстрое накопление/отдача энергии при разгоне и торможении.</li>
</ul>
<p style="margin-top:12px;padding:12px 14px;background:var(--sec-acc-soft);border-radius:10px"><b>Пример (фотовспышка).</b> $C = 1000$ мкФ $= 10^{-3}$ Ф, $U = 300$ В.</p>
<p style="text-align:center;margin:10px 0">$$W = \\dfrac{CU^2}{2} = \\dfrac{10^{-3} \\cdot 90\\,000}{2} = 45 \\text{ Дж}$$</p>
<p>Это много! Если разряд происходит за $\\Delta t = 1$ мс $= 10^{-3}$ с, мощность вспышки:</p>
<p style="text-align:center;margin:10px 0">$$P = \\dfrac{W}{\\Delta t} = \\dfrac{45}{10^{-3}} = 45\\,000 \\text{ Вт} = 45 \\text{ кВт}$$</p>
<p>Поэтому фотовспышка такая яркая.</p>
`);
/* INTERACTIVE 1 — Энергия от C и U */
html += `<div class="wg" id="p24-iv1">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Энергия конденсатора от $C$ и $U$</div></div>
<div class="wg-help">Меняй ёмкость $C$ и напряжение $U$. Наблюдай $W = CU^2/2$ и заряд $q = CU$. «Заряжённость» обкладок видна по числу значков «+» и «−».</div>
<div class="sliders">
<label>$C$: <b id="p24-iv1-CL">100</b> мкФ <input type="range" id="p24-iv1-C" min="1" max="1000" value="100" step="1"></label>
<label>$U$: <b id="p24-iv1-UL">100</b> В <input type="range" id="p24-iv1-U" min="10" max="500" value="100" step="5"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
<svg id="p24-iv1-svg" viewBox="0 0 480 260" width="100%" style="height:auto"></svg>
</div>
<div id="p24-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.94rem;line-height:1.75;text-align:center"></div>
</div>`;
/* INTERACTIVE 2 — Калькулятор энергии */
html += `<div class="wg" id="p24-iv2">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор энергии: 3 формулы</div></div>
<div class="wg-help">Выбери формулу, подставь данные, получи $W$. Попробуй все три варианта.</div>
<div style="display:flex;gap:8px;justify-content:center;margin-bottom:10px;flex-wrap:wrap">
<button class="btn primary" id="p24-iv2-mCU">через $C, U$</button>
<button class="btn" id="p24-iv2-mqC">через $q, C$</button>
<button class="btn" id="p24-iv2-mqU">через $q, U$</button>
</div>
<div id="p24-iv2-inputs" style="display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:end;margin-bottom:10px"></div>
<div style="display:flex;justify-content:center;margin-bottom:10px">
<button class="btn primary" id="p24-iv2-go">Вычислить $W$</button>
</div>
<div id="p24-iv2-out" style="padding:12px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.75;text-align:center"></div>
</div>`;
/* INTERACTIVE 3 — Как изменится энергия? */
html += `<div class="wg" id="p24-iv3">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Как изменится энергия конденсатора?</div></div>
<div class="wg-help">Опираясь на формулы $W = CU^2/2 = q^2/(2C) = qU/2$, выбери, как изменится энергия.</div>
<div class="score-display"><span>Задача <b id="p24-iv3-i">1</b> / 6</span><span>Очки: <b id="p24-iv3-s">0</b> / 6</span></div>
<div id="p24-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p24-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
<div class="feedback" id="p24-iv3-fb"></div>
<div class="actions"><button class="btn" id="p24-iv3-restart">Начать заново</button></div>
</div>`;
/* INTERACTIVE 4 — Тренажёр энергии */
html += `<div class="wg" id="p24-iv4">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр энергии конденсатора</div></div>
<div class="wg-help">5 задач. Допуск $\\pm 5\\%$. Внимательно следи за единицами (мкФ, нФ, мкКл, мДж).</div>
<div class="score-display"><span>Задача <b id="p24-iv4-i">1</b> / 5</span><span>Очки: <b id="p24-iv4-s">0</b> / 5</span></div>
<div id="p24-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:center">
<span style="font-family:'JetBrains Mono',monospace">ответ =</span>
<input type="number" id="p24-iv4-ans" class="tinp" style="width:140px;text-align:center" step="any">
<button class="btn primary" id="p24-iv4-go">Проверить</button>
<button class="btn" id="p24-iv4-start">Заново</button>
</div>
<div class="feedback" id="p24-iv4-fb"></div>
</div>`;
html += secNav('p23', 'final3');
html += readButton('p24');
box.innerHTML = html;
renderMath(box);
/* IV1 — Энергия конденсатора (C, U) */
(function(){
const CS = document.getElementById('p24-iv1-C');
const US = document.getElementById('p24-iv1-U');
const CL = document.getElementById('p24-iv1-CL');
const UL = document.getElementById('p24-iv1-UL');
const svg = document.getElementById('p24-iv1-svg');
const out = document.getElementById('p24-iv1-out');
const seen = new Set();
let _done = false;
function render(){
const C_uF = +CS.value; // мкФ
const U = +US.value; // В
const C = C_uF * 1e-6; // Ф
const W = C * U * U / 2; // Дж
const q = C * U; // Кл
CL.textContent = C_uF;
UL.textContent = U;
// SVG: два прямоугольника-обкладки с зарядами
const W_svg = 480, H_svg = 260, cx = W_svg/2, cy = H_svg/2;
const plateW = 280, plateH = 14;
const gap = 90;
const xL = cx - plateW/2;
const yTop = cy - gap/2 - plateH;
const yBot = cy + gap/2;
// Число значков пропорционально q (норм. к диапазону ~ q_max = 1000e-6 * 500 = 0.5 Кл; logarithmically scale)
const qMax = 1000e-6 * 500;
const ratio = Math.min(1, Math.sqrt(q / qMax));
const nSign = Math.max(3, Math.round(3 + ratio * 17)); // 3..20
let g = '';
g += '<rect x="0" y="0" width="'+W_svg+'" height="'+H_svg+'" fill="#fafafa"/>';
g += '<text x="'+cx+'" y="22" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">Заряд на обкладках</text>';
// Поле (стрелки между пластинами)
const yMid = (yTop+plateH + yBot)/2;
for(let i = 0; i < 5; i++){
const x = xL + 30 + i*(plateW-60)/4;
g += '<line x1="'+x+'" y1="'+(yTop+plateH+4)+'" x2="'+x+'" y2="'+(yBot-4)+'" stroke="#0ea5e9" stroke-width="1.4" stroke-dasharray="3,3" opacity="0.6"/>';
g += '<polygon points="'+(x-4)+','+(yBot-8)+' '+(x+4)+','+(yBot-8)+' '+x+','+(yBot-2)+'" fill="#0ea5e9" opacity="0.6"/>';
}
// Верхняя обкладка (+)
g += '<rect x="'+xL+'" y="'+yTop+'" width="'+plateW+'" height="'+plateH+'" fill="#fecaca" stroke="#dc2626" stroke-width="2"/>';
// Нижняя обкладка (−)
g += '<rect x="'+xL+'" y="'+yBot+'" width="'+plateW+'" height="'+plateH+'" fill="#bfdbfe" stroke="#2563eb" stroke-width="2"/>';
// Значки + сверху
for(let i = 0; i < nSign; i++){
const x = xL + 14 + i*(plateW-28)/(nSign-1 || 1);
g += '<text x="'+x+'" y="'+(yTop+plateH-2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#dc2626">+</text>';
}
// Значки − снизу
for(let i = 0; i < nSign; i++){
const x = xL + 14 + i*(plateW-28)/(nSign-1 || 1);
g += '<text x="'+x+'" y="'+(yBot+plateH-2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#2563eb"></text>';
}
// Подписи U и q
g += '<text x="'+(xL-12)+'" y="'+(yTop+plateH+4)+'" text-anchor="end" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#dc2626">+q</text>';
g += '<text x="'+(xL-12)+'" y="'+(yBot+plateH-2)+'" text-anchor="end" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#2563eb">q</text>';
g += '<text x="'+(xL+plateW+12)+'" y="'+(yMid+4)+'" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#0ea5e9">U</text>';
svg.innerHTML = g;
// Вывод
let WStr;
if(W >= 1) WStr = W.toFixed(2) + ' Дж';
else if(W >= 1e-3) WStr = (W*1e3).toFixed(2) + ' мДж';
else WStr = (W*1e6).toFixed(2) + ' мкДж';
let qStr;
if(q >= 1e-3) qStr = (q*1e3).toFixed(2) + ' мКл';
else qStr = (q*1e6).toFixed(2) + ' мкКл';
out.innerHTML = '<b>$W = \\dfrac{CU^2}{2} = \\dfrac{'+C_uF+'\\cdot 10^{-6} \\cdot '+U+'^2}{2} \\approx$ '+WStr+'</b><br><span style="color:var(--muted);font-size:.9rem">$q = CU = $ '+qStr+'</span>';
renderMath(out);
seen.add(C_uF+':'+U);
if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p24-iv1'); bumpProgress('p24', 15); }
}
CS.addEventListener('input', render);
US.addEventListener('input', render);
render();
})();
/* IV2 — Калькулятор энергии (3 формулы) */
(function(){
let mode = 'CU';
const mCU = document.getElementById('p24-iv2-mCU');
const mqC = document.getElementById('p24-iv2-mqC');
const mqU = document.getElementById('p24-iv2-mqU');
const inputs = document.getElementById('p24-iv2-inputs');
const out = document.getElementById('p24-iv2-out');
const seen = new Set();
let _done = false;
function setMode(m){
mode = m;
[mCU,mqC,mqU].forEach(b => b.classList.remove('primary'));
if(m === 'CU') mCU.classList.add('primary');
else if(m === 'qC') mqC.classList.add('primary');
else mqU.classList.add('primary');
render();
}
function render(){
if(mode === 'CU'){
inputs.innerHTML = '<label>$C$ (мкФ): <input type="number" id="p24-iv2-C" class="tinp" value="100" step="1" min="0.1" style="width:100%"></label>'
+ '<label>$U$ (В): <input type="number" id="p24-iv2-U" class="tinp" value="100" step="1" min="0.1" style="width:100%"></label>';
} else if(mode === 'qC'){
inputs.innerHTML = '<label>$q$ (мкКл): <input type="number" id="p24-iv2-q" class="tinp" value="20" step="0.1" min="0.001" style="width:100%"></label>'
+ '<label>$C$ (мкФ): <input type="number" id="p24-iv2-C" class="tinp" value="10" step="0.1" min="0.001" style="width:100%"></label>';
} else {
inputs.innerHTML = '<label>$q$ (мкКл): <input type="number" id="p24-iv2-q" class="tinp" value="20" step="0.1" min="0.001" style="width:100%"></label>'
+ '<label>$U$ (В): <input type="number" id="p24-iv2-U" class="tinp" value="100" step="1" min="0.1" style="width:100%"></label>';
}
renderMath(inputs);
out.innerHTML = '<span style="color:var(--muted)">Введи значения и нажми «Вычислить $W$».</span>';
renderMath(out);
}
function calc(){
let W = 0, html = '';
if(mode === 'CU'){
const Cuf = parseFloat(document.getElementById('p24-iv2-C').value) || 0;
const U = parseFloat(document.getElementById('p24-iv2-U').value) || 0;
const C = Cuf * 1e-6;
W = C * U * U / 2;
html = '<b>$W = \\dfrac{CU^2}{2} = \\dfrac{'+Cuf+'\\cdot 10^{-6} \\cdot '+U+'^2}{2} = '+W.toExponential(3)+'$ Дж</b>';
} else if(mode === 'qC'){
const quc = parseFloat(document.getElementById('p24-iv2-q').value) || 0;
const Cuf = parseFloat(document.getElementById('p24-iv2-C').value) || 0;
const q = quc * 1e-6, C = Cuf * 1e-6;
W = (C > 0) ? (q*q / (2*C)) : 0;
html = '<b>$W = \\dfrac{q^2}{2C} = \\dfrac{('+quc+'\\cdot 10^{-6})^2}{2 \\cdot '+Cuf+'\\cdot 10^{-6}} = '+W.toExponential(3)+'$ Дж</b>';
} else {
const quc = parseFloat(document.getElementById('p24-iv2-q').value) || 0;
const U = parseFloat(document.getElementById('p24-iv2-U').value) || 0;
const q = quc * 1e-6;
W = q * U / 2;
html = '<b>$W = \\dfrac{qU}{2} = \\dfrac{'+quc+'\\cdot 10^{-6} \\cdot '+U+'}{2} = '+W.toExponential(3)+'$ Дж</b>';
}
// Дополнительный перевод в удобные единицы
let extra = '';
if(W >= 1) extra = '$\\approx '+W.toFixed(3)+'$ Дж';
else if(W >= 1e-3) extra = '$\\approx '+(W*1e3).toFixed(3)+'$ мДж';
else if(W > 0) extra = '$\\approx '+(W*1e6).toFixed(3)+'$ мкДж';
out.innerHTML = html + (extra ? '<br><span style="font-size:.92rem">'+extra+'</span>' : '');
renderMath(out);
seen.add(mode);
if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p24-iv2'); bumpProgress('p24', 15); }
}
mCU.addEventListener('click', () => setMode('CU'));
mqC.addEventListener('click', () => setMode('qC'));
mqU.addEventListener('click', () => setMode('qU'));
document.getElementById('p24-iv2-go').addEventListener('click', calc);
setMode('CU');
})();
/* IV3 — Как изменится энергия? (6 заданий, 4 варианта) */
(function(){
const OPTS = ['увеличится в 2 раза', 'уменьшится в 2 раза', 'увеличится в 4 раза', 'не изменится'];
// ans: 0 = увеличится в 2 раза, 1 = уменьшится в 2 раза, 2 = увеличится в 4 раза, 3 = не изменится
const Q = [
{ q:'Удвоили $U$ при том же $C$. Как изменится $W$?', ans:2, why:'$W = CU^2/2$: $U$ удваивается $\\Rightarrow W$ растёт в $2^2 = 4$ раза.' },
{ q:'Удвоили $C$ при том же $U$. Как изменится $W$?', ans:0, why:'$W = CU^2/2$: $C$ удваивается $\\Rightarrow W$ растёт в 2 раза.' },
{ q:'Удвоили заряд $q$ при том же $C$. Как изменится $W$?', ans:2, why:'$W = q^2/(2C)$: $q$ удваивается $\\Rightarrow W$ растёт в $2^2 = 4$ раза.' },
{ q:'Уменьшили $C$ в 2 раза при том же заряде $q$. Как изменится $W$?', ans:0, why:'$W = q^2/(2C)$: $C$ в знаменателе уменьшается в 2 раза $\\Rightarrow W$ растёт в 2 раза.' },
{ q:'Уменьшили $U$ в 2 раза, а $C$ увеличили в 4 раза. Как изменится $W$?', ans:3, why:'$W = CU^2/2$: $U^2$ упало в 4 раза, $C$ выросло в 4 раза $\\Rightarrow$ $W$ не меняется.' },
{ q:'Зарядили конденсатор с 100 В до 200 В при том же $C$. Как изменилась $W$?', ans:2, why:'$W \\propto U^2$: $(200/100)^2 = 4$ — $W$ увеличилась в 4 раза.' },
];
let i = 0, score = 0;
const qEl = document.getElementById('p24-iv3-q');
const oEl = document.getElementById('p24-iv3-opts');
const fb = document.getElementById('p24-iv3-fb');
const iEl = document.getElementById('p24-iv3-i');
const sEl = document.getElementById('p24-iv3-s');
// Update score-display total to actual length
const total = Q.length;
document.querySelector('#p24-iv3 .score-display').innerHTML =
'<span>Задача <b id="p24-iv3-i">1</b> / '+total+'</span><span>Очки: <b id="p24-iv3-s">0</b> / '+total+'</span>';
const iEl2 = document.getElementById('p24-iv3-i');
const sEl2 = document.getElementById('p24-iv3-s');
function show(){
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
oEl.innerHTML = '';
if(score === Q.length){ addXp(15, 'p24-iv3'); bumpProgress('p24', 25); }
else if(score >= 4){ addXp(8, 'p24-iv3'); bumpProgress('p24', 15); }
return;
}
iEl2.textContent = (i+1);
sEl2.textContent = score;
const item = Q[i];
qEl.innerHTML = item.q;
oEl.innerHTML = OPTS.map((t, k) => '<button class="btn primary" data-v="' + k + '">' + t + '</button>').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, '&#10003; Верно! ' + item.why + ' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. ' + item.why + ' Дальше ▶');
sEl2.textContent = score;
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
i++;
setTimeout(show, 2000);
});
});
}
document.getElementById('p24-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
show();
})();
/* IV4 — Тренажёр энергии */
(function(){
const Q = [
{ q:'$C = 100$ мкФ, $U = 100$ В. Найди $W$ в Дж (до сотых).', ans:0.5, tol:0.03, hint:'$W = CU^2/2 = 10^{-4}\\cdot 10^4/2 = 0{,}5$ Дж.' },
{ q:'$C = 1000$ мкФ, $U = 300$ В (фотовспышка). Найди $W$ в Дж.', ans:45, tol:2.5, hint:'$W = CU^2/2 = 10^{-3}\\cdot 9\\cdot 10^4/2 = 45$ Дж.' },
{ q:'$q = 10$ мкКл, $U = 200$ В. Найди $W$ в мДж.', ans:1, tol:0.06, hint:'$W = qU/2 = 10^{-5}\\cdot 200/2 = 10^{-3}$ Дж $= 1$ мДж.' },
{ q:'$q = 20$ мкКл, $C = 200$ нФ. Найди $W$ в мДж.', ans:1, tol:0.06, hint:'$W = q^2/(2C) = (2\\cdot 10^{-5})^2/(2\\cdot 2\\cdot 10^{-7}) = 4\\cdot 10^{-10}/(4\\cdot 10^{-7}) = 10^{-3}$ Дж $= 1$ мДж.' },
{ q:'Если удвоить $U$ конденсатора при $C = $ const, во сколько раз вырастет $W$?', ans:4, tol:0.1, hint:'$W \\propto U^2$: $(2U)^2/U^2 = 4$.' }
];
let i = 0, score = 0;
function show(){
if(i >= Q.length){
document.getElementById('p24-iv4-q').innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
if(score === Q.length){ addXp(15, 'p24-iv4'); bumpProgress('p24', 25); }
else if(score >= 3){ addXp(8, 'p24-iv4'); bumpProgress('p24', 15); }
return;
}
document.getElementById('p24-iv4-i').textContent = (i+1);
document.getElementById('p24-iv4-s').textContent = score;
document.getElementById('p24-iv4-q').innerHTML = Q[i].q;
document.getElementById('p24-iv4-ans').value = '';
renderMath(document.getElementById('p24-iv4-q'));
document.getElementById('p24-iv4-fb').style.display = 'none';
}
function go(){
if(i >= Q.length) return;
const fb = document.getElementById('p24-iv4-fb');
const raw = document.getElementById('p24-iv4-ans').value.replace(',', '.');
const ans = parseFloat(raw);
if(isNaN(ans)){ feedback(fb, false, '&#10007; Введи число.'); return; }
if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '&#10003; Верно! '+Q[i].hint+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶');
document.getElementById('p24-iv4-s').textContent = score;
i++;
setTimeout(show, 1800);
}
document.getElementById('p24-iv4-go').addEventListener('click', go);
document.getElementById('p24-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
document.getElementById('p24-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
show();
})();
wireReadBtn('p24');
}
function build_final3(){
const box = document.getElementById('final3-body');
let html = '';
html += makeCard('theory', "Финал главы 3", "★", `
<p><b>Финал главы 3</b> — этот параграф в разработке (Phase 1+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет учебника. <b>Phase 3+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
</p>
`);
/* Часть А — Шпаргалка главы (9 mini-карточек) */
const SHEET = [
{ t:'§ 16 · Заряд', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#dc2626" stroke-width="2" style="width:18px;height:18px"><circle cx="12" cy="12" r="9"/><text x="12" y="16" text-anchor="middle" font-size="12" font-weight="700" fill="#dc2626">+</text></svg>', body:'$q = ne$, $e = 1{,}6 \\cdot 10^{-19}$ Кл. Закон сохранения: $\\sum q = $ const.' },
{ t:'§ 17 · Кулон', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#7c3aed" stroke-width="2" style="width:18px;height:18px"><circle cx="6" cy="12" r="3"/><circle cx="18" cy="12" r="3"/><path d="M9 12h6"/></svg>', body:'$F = k\\dfrac{q_1 q_2}{r^2}$, $k = 9\\cdot 10^9$ Н·м²/Кл². В среде: $F = F_0/\\varepsilon$.' },
{ t:'§ 18 · Поле', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#0ea5e9" stroke-width="2" style="width:18px;height:18px"><circle cx="12" cy="12" r="3"/><path d="M12 5v2"/><path d="M12 17v2"/><path d="M5 12h2"/><path d="M17 12h2"/></svg>', body:'Создаётся неподвижными зарядами, действует на заряды. Пробный заряд $q_0$ — для измерения.' },
{ t:'§ 19 · Напряжённость', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2" style="width:18px;height:18px"><path d="M4 12h14"/><polyline points="14 7 19 12 14 17"/></svg>', body:'$\\vec{E} = \\vec{F}/q$. Точечный: $E = kq/r^2$. Принцип суперпозиции — векторно.' },
{ t:'§ 20 · Линии', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2" style="width:18px;height:18px"><path d="M5 4c4 4 10 4 14 0"/><path d="M5 12c4 4 10 4 14 0"/><path d="M5 20c4 4 10 4 14 0"/></svg>', body:'Касательны к $\\vec{E}$. От + к −, не пересекаются. Густота = $E$. Однородное поле — параллельные линии.' },
{ t:'§ 21 · Работа · потенциал', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#8b5cf6" stroke-width="2" style="width:18px;height:18px"><path d="M4 18l8-12 8 12"/></svg>', body:'$A = qEd\\cos\\alpha = q(\\varphi_1-\\varphi_2)$. $\\varphi = kq/r$. Работа не зависит от траектории.' },
{ t:'§ 22 · Напряжение', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#06b6d4" stroke-width="2" style="width:18px;height:18px"><path d="M4 6h16"/><path d="M4 12h16"/><path d="M4 18h10"/></svg>', body:'$U = \\varphi_1 - \\varphi_2$ [В]. В однородном: $U = Ed$. Эквипотенциальные поверхности $\\perp \\vec{E}$.' },
{ t:'§ 23 · Конденсаторы', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#0891b2" stroke-width="2" style="width:18px;height:18px"><path d="M4 8v8"/><path d="M9 6v12"/><path d="M15 6v12"/><path d="M20 8v8"/></svg>', body:'$C = q/U$ [Ф]. Плоский: $C = \\varepsilon\\varepsilon_0 S/d$. $\\parallel$: $\\sum C$. Последов.: $\\sum 1/C$.' },
{ t:'§ 24 · Энергия', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#dc2626" stroke-width="2" style="width:18px;height:18px"><polygon points="13,2 4,14 12,14 11,22 20,10 12,10"/></svg>', body:'$W = \\dfrac{CU^2}{2} = \\dfrac{q^2}{2C} = \\dfrac{qU}{2}$. Хранится в поле.' },
];
html += `<div class="card">
<div class="card-header">
<span class="card-icon theory">${ICONS.theory}</span>
<span class="card-title">Шпаргалка главы 3 — Электростатика</span>
<span class="card-num">Итог</span>
</div>
<div class="card-body">
<p>Ключевые формулы и идеи всех 9 параграфов главы — повтори перед битвой с боссами.</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-top:10px">
${SHEET.map(s => `<div style="padding:12px 14px;background:var(--sec-acc-soft);border-radius:11px;border-left:3px solid var(--pri)">
<div style="display:flex;align-items:center;gap:8px;margin-bottom:6px">
${s.icon}
<div style="font-family:'Unbounded',sans-serif;font-weight:700;color:var(--pri2);font-size:.88rem">${s.t}</div>
</div>
<div style="font-size:.92rem;line-height:1.55">${s.body}</div>
</div>`).join('')}
</div>
</div>
</div>`;
/* Часть Б — 7 боссов intro */
html += `<div class="card">
<div class="card-header">
<span class="card-icon rule">${ICONS.rule}</span>
<span class="card-title">Боссы главы 3</span>
<span class="card-num">7</span>
</div>
<div class="card-body">
<p>7 интегрированных задач по §§16–24. За каждого побеждённого босса: <b>+10 XP, +14% к прогрессу</b>. Победишь всех — ачивка <b>«Мастер электростатики»</b> и <b>+50 XP бонус</b>.</p>
<p style="margin-top:6px;font-size:.92rem;color:var(--muted)">Константы: $k = 9 \\cdot 10^9$ Н·м²/Кл², $e = 1{,}6 \\cdot 10^{-19}$ Кл, $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м. Допуск $\\pm 5\\%$.</p>
</div>
</div>`;
html += '<div id="ch3-bosses-container"></div>';
html += `<div style="margin-top:18px;padding:18px 20px;background:linear-gradient(135deg,var(--pri-soft),var(--sec-acc-soft));border-radius:14px;border:1.5px solid var(--pri);text-align:center" id="ch3-final-summary">
<div style="font-family:'Unbounded',sans-serif;font-weight:800;color:var(--pri2);font-size:1.1rem;margin-bottom:6px">Прогресс по боссам</div>
<div id="ch3-boss-overall" style="font-size:.95rem;color:var(--text);margin-bottom:10px">0 / 7 боссов побеждено</div>
<div style="height:12px;background:var(--card);border-radius:8px;overflow:hidden;border:1px solid var(--border)">
<div id="ch3-boss-overall-fill" style="height:100%;width:0%;background:linear-gradient(90deg,#7c3aed,#a78bfa);transition:width .35s"></div>
</div>
<div id="ch3-final-reward" style="margin-top:14px;display:none;padding:14px;background:var(--card);border-radius:11px;border:2px solid #7c3aed">
<div style="font-family:'Unbounded',sans-serif;font-weight:800;color:#5b21b6;font-size:1.05rem;margin-bottom:6px">Мастер электростатики</div>
<div style="font-size:.92rem;margin-bottom:10px">Глава 3 пройдена! Все 7 боссов повержены. +50 XP бонус.</div>
<a class="btn primary" href="/textbook/physics-10-ch4" style="text-decoration:none">Дальше: Глава 4 <svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></a>
</div>
</div>`;
html += secNav('p24', null);
html += readButton('final3');
box.innerHTML = html;
renderMath(box);
wireReadBtn('final3');
/* Боссы главы 3 */
const BOSSES = [
{
n:1, color:'#dc2626',
title:'Хранитель Заряда',
tag:'§ 16',
q:'Сколько электронов в заряде модулем $|q| = 3{,}2$ нКл? Введи коэффициент $a$ в записи $n = a \\cdot 10^{10}$.',
ans:2, tol:0.1,
hint:'$n = |q|/e = 3{,}2 \\cdot 10^{-9} / (1{,}6 \\cdot 10^{-19}) = 2 \\cdot 10^{10}$.'
},
{
n:2, color:'#7c3aed',
title:'Дракон Кулона',
tag:'§ 17',
q:'Два заряда по $+2$ мкКл в воздухе на $r = 0{,}3$ м. Найди модуль силы Кулона $F$ в Н (до сотых).',
ans:0.4, tol:0.025,
hint:'$F = k\\dfrac{q_1 q_2}{r^2} = 9\\cdot 10^9 \\cdot \\dfrac{4 \\cdot 10^{-12}}{0{,}09} = 0{,}4$ Н.'
},
{
n:3, color:'#f59e0b',
title:'Стражник Напряжённости',
tag:'§ 19',
q:'$E$ на расстоянии $r = 0{,}2$ м от точечного заряда $q = +5$ нКл. Ответ в В/м.',
ans:1125, tol:60,
hint:'$E = kq/r^2 = 9\\cdot 10^9 \\cdot 5\\cdot 10^{-9}/0{,}04 = 1125$ В/м.'
},
{
n:4, color:'#8b5cf6',
title:'Сторож Потенциала',
tag:'§ 21 + § 22',
q:'Заряд $q = +2$ мкКл перенесли между точками с $\\varphi_1 = 200$ В и $\\varphi_2 = 50$ В. Работа поля $A$ в мкДж?',
ans:300, tol:15,
hint:'$A = q(\\varphi_1 - \\varphi_2) = 2\\cdot 10^{-6} \\cdot 150 = 3\\cdot 10^{-4}$ Дж $= 300$ мкДж.'
},
{
n:5, color:'#0891b2',
title:'Капитан Конденсатор',
tag:'§ 23',
q:'Плоский конденсатор: $S = 0{,}02$ м², $d = 0{,}001$ м, воздух ($\\varepsilon = 1$). Найди $C$ в пФ.',
ans:177, tol:9,
hint:'$C = \\varepsilon\\varepsilon_0 S/d = 8{,}85\\cdot 10^{-12}\\cdot 0{,}02/0{,}001 = 1{,}77\\cdot 10^{-10}$ Ф $= 177$ пФ.'
},
{
n:6, color:'#dc2626',
title:'Энергетический Левиафан',
tag:'§ 24',
q:'$C = 500$ мкФ, $U = 100$ В. Найди энергию $W$ конденсатора в Дж (до десятых).',
ans:2.5, tol:0.15,
hint:'$W = CU^2/2 = 5\\cdot 10^{-4}\\cdot 10^4/2 = 2{,}5$ Дж.'
},
{
n:7, color:'#a78bfa',
title:'Магистр Электростатики',
tag:'§ 16 + § 17',
q:'Два одинаковых металлических шара с зарядами $+8$ нКл и $-4$ нКл соприкоснулись и были разведены на $r = 0{,}2$ м. Найди модуль силы между ними в мкН (до десятых).',
ans:0.9, tol:0.06,
hint:'После касания: $(8 + (-4))/2 = +2$ нКл на каждом. $F = k q^2/r^2 = 9\\cdot 10^9 \\cdot (2\\cdot 10^{-9})^2/0{,}04 = 9\\cdot 10^{-7}$ Н $= 0{,}9$ мкН.'
},
];
const cont = document.getElementById('ch3-bosses-container');
const STATE_KEY = 'physics10_ch3_bosses';
const BOSS_STATE = (function(){
try{ const s = localStorage.getItem(STATE_KEY); if(s){ const p = JSON.parse(s); if(Array.isArray(p) && p.length === BOSSES.length) return p; } }catch(e){}
return BOSSES.map(()=>({defeated:false}));
})();
function saveBosses(){ try{ localStorage.setItem(STATE_KEY, JSON.stringify(BOSS_STATE)); }catch(e){} }
cont.innerHTML = BOSSES.map((b)=>{
return '<div class="boss-card" id="boss3-'+b.n+'-card" style="padding:16px;background:var(--card);border-radius:12px;border:2px solid '+b.color+';margin-bottom:14px">'
+'<div style="display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap">'
+'<svg viewBox="0 0 24 24" fill="none" stroke="'+b.color+'" stroke-width="2.2" style="width:28px;height:28px;flex-shrink:0"><polygon points="12,2 22,20 2,20"/></svg>'
+'<div style="font-family:\'Unbounded\',sans-serif;font-weight:800;color:'+b.color+';font-size:1.05rem">Босс '+b.n+': '+b.title+'</div>'
+'<div style="margin-left:auto;font-size:.78rem;color:var(--muted);padding:3px 8px;background:var(--sec-acc-soft);border-radius:6px">'+b.tag+'</div>'
+'</div>'
+'<div class="boss-q" id="boss3-'+b.n+'-q" style="padding:12px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:1rem;line-height:1.5;margin-bottom:10px">'+b.q+'</div>'
+'<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">'
+'<span style="font-family:\'JetBrains Mono\',monospace;font-size:.92rem">ответ =</span>'
+'<input type="number" id="boss3-'+b.n+'-ans" class="tinp" style="width:130px;text-align:center" step="0.01" placeholder="число">'
+'<button class="btn primary" id="boss3-'+b.n+'-go" style="background:'+b.color+';border-color:'+b.color+'">Атаковать</button>'
+'<button class="btn" id="boss3-'+b.n+'-hint">Подсказка</button>'
+'</div>'
+'<div class="feedback" id="boss3-'+b.n+'-fb"></div>'
+'</div>';
}).join('');
renderMath(cont);
function refreshOverall(){
const won = BOSS_STATE.filter(s => s.defeated).length;
const txt = document.getElementById('ch3-boss-overall');
const fill = document.getElementById('ch3-boss-overall-fill');
if(txt) txt.textContent = won + ' / ' + BOSSES.length + ' боссов побеждено';
if(fill) fill.style.width = (won * 100 / BOSSES.length) + '%';
if(won >= BOSSES.length){
const reward = document.getElementById('ch3-final-reward');
if(reward && reward.style.display === 'none'){
reward.style.display = 'block';
if(!STATE.achievements.has('ch3_done')){
achievement('ch3_done','Мастер электростатики');
addXp(50, 'ch3-bonus');
bumpProgress('final3', 30);
if(window.confetti){ try{ confetti(); }catch(e){} }
}
}
}
}
BOSSES.forEach((b, idx)=>{
const card = document.getElementById('boss3-'+b.n+'-card');
const goBtn = document.getElementById('boss3-'+b.n+'-go');
const hintBtn = document.getElementById('boss3-'+b.n+'-hint');
const ansInp = document.getElementById('boss3-'+b.n+'-ans');
if(BOSS_STATE[idx].defeated){
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow');
goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
}
goBtn.addEventListener('click', ()=>{
if(BOSS_STATE[idx].defeated) return;
const fb = document.getElementById('boss3-'+b.n+'-fb');
const raw = ansInp.value.replace(',', '.');
const val = parseFloat(raw);
if(isNaN(val)){ feedback(fb, false, '&#10007; Введи число.'); return; }
const tol = (typeof b.tol === 'number') ? b.tol : Math.max(0.05 * Math.abs(b.ans), 0.05);
if(Math.abs(val - b.ans) < tol + 0.001){
BOSS_STATE[idx].defeated = true; saveBosses();
feedback(fb, true, '&#10003; Босс '+b.n+' повержен! +10 XP. '+b.hint);
addXp(10, 'boss-ch3-'+b.n);
bumpProgress('final3', 14);
goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен';
ansInp.disabled = true;
card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))';
card.classList.add('glow','pulse');
setTimeout(()=>card.classList.remove('pulse'), 900);
refreshOverall();
} else {
feedback(fb, false, '&#10007; Промах. Попробуй ещё. Подсказка доступна.');
}
});
hintBtn.addEventListener('click', ()=>{
const fb = document.getElementById('boss3-'+b.n+'-fb');
fb.className = 'feedback ok';
fb.innerHTML = '<b>Подсказка:</b> '+b.hint;
fb.style.display = 'block';
fb.style.background = 'var(--warn-bg)';
fb.style.color = '#92400e';
fb.style.borderLeftColor = 'var(--warn)';
renderMath(fb);
});
ansInp.addEventListener('keydown', e=>{ if(e.key === 'Enter') goBtn.click(); });
});
refreshOverall();
}
/* ===== Search ===== */