feat(phys10 ch3 wave4): §22 «Напряжение» + §23 «Конденсаторы»
This commit is contained in:
@@ -2798,34 +2798,696 @@ function build_p21(){
|
||||
function build_p22(){
|
||||
const box = document.getElementById('p22-body');
|
||||
let html = '';
|
||||
html += makeCard('theory', "Разность потенциалов. Напряжение", "§22", `
|
||||
<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', "Разность потенциалов и напряжение", "§22", `
|
||||
<p><b>Напряжение</b> $U$ между двумя точками 1 и 2 электростатического поля — это <b>разность потенциалов</b> этих точек:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$U_{12} = \\varphi_1 - \\varphi_2$$</p>
|
||||
<p><b>Единица измерения:</b> <b>Вольт</b> (В) $= 1$ Дж / 1 Кл.</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px">$1$ В — это напряжение, при котором поле совершает работу $1$ Дж при переносе заряда $1$ Кл из одной точки в другую.</p>
|
||||
<p style="margin-top:10px"><b>Работа поля</b> при перемещении заряда $q$ из точки 1 в точку 2:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$A_{12} = q U_{12} = q(\\varphi_1 - \\varphi_2)$$</p>
|
||||
<p>Если $A > 0$ — поле помогает перемещению. Если $A < 0$ — поле сопротивляется (нужно работать против поля).</p>
|
||||
<p style="margin-top:10px">Напряжение измеряется <b>вольтметром</b> (подключается между двумя точками).</p>
|
||||
`);
|
||||
|
||||
/* THEORY 2 — Связь U и E в однородном поле */
|
||||
html += makeCard('rule', "Связь напряжения с напряжённостью", "§22", `
|
||||
<p>В <b>однородном поле</b> (например, между обкладок плоского конденсатора) напряжение и напряжённость связаны формулой:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$U = E \\cdot d$$</p>
|
||||
<p>где:</p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>$U$ — напряжение в В</li>
|
||||
<li>$E$ — напряжённость в В/м</li>
|
||||
<li>$d$ — расстояние между точками <b>вдоль направления $\\vec{E}$</b>, в м</li>
|
||||
</ul>
|
||||
<p>Если перемещение перпендикулярно $\\vec{E}$ — напряжение между точками равно нулю.</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--warn-bg,#fef3c7);border-left:4px solid var(--warn,#f59e0b);border-radius:9px">Эта формула — главный инструмент для расчётов в однородных полях: конденсаторы, поле над поверхностью, поле между параллельными пластинами.</p>
|
||||
<p style="margin-top:10px">Отсюда удобная форма для напряжённости: $E = U/d$ — поэтому единица $\\vec{E}$ — <b>В/м</b>.</p>
|
||||
`);
|
||||
|
||||
/* THEORY 3 — Эквипотенциальные поверхности */
|
||||
html += makeCard('example', "Эквипотенциальные поверхности", "§22", `
|
||||
<p><b>Эквипотенциальная поверхность</b> — поверхность, на которой потенциал во всех точках одинаков ($\\varphi = $ const).</p>
|
||||
<p><b>Свойства:</b></p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>Силовые линии $\\vec{E}$ <b>перпендикулярны</b> эквипотенциальным поверхностям.</li>
|
||||
<li>Работа поля при перемещении вдоль эквипотенциальной поверхности <b>равна нулю</b>: $\\Delta\\varphi = 0 \\Rightarrow A = q\\Delta\\varphi = 0$.</li>
|
||||
<li>В <b>однородном поле</b> эквипотенциальные поверхности — параллельные плоскости.</li>
|
||||
<li>Вокруг <b>точечного заряда</b> — концентрические сферы.</li>
|
||||
<li>Поверхность <b>проводника</b> — эквипотенциальная (в электростатике).</li>
|
||||
</ul>
|
||||
<p style="padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0"><b>Пример.</b> Между параллельными пластинами заряженного конденсатора эквипотенциальные поверхности — плоскости, параллельные пластинам. Чем ближе к положительной пластине — тем выше $\\varphi$.</p>
|
||||
`);
|
||||
|
||||
/* INTERACTIVE 1 — Связь U и E в однородном поле */
|
||||
html += `<div class="wg" id="p22-iv1">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Связь $U$ и $E$ в однородном поле</div></div>
|
||||
<div class="wg-help">Меняй напряжение $U$ и расстояние $d$ между пластинами. Наблюдай $E = U/d$ — ширина стрелок $\\vec{E}$ пропорциональна напряжённости.</div>
|
||||
<div class="sliders">
|
||||
<label>$U$: <b id="p22-iv1-UL">100</b> В <input type="range" id="p22-iv1-U" min="10" max="500" value="100" step="10"></label>
|
||||
<label>$d$: <b id="p22-iv1-dL">0.05</b> м <input type="range" id="p22-iv1-d" min="0.01" max="0.20" value="0.05" step="0.01"></label>
|
||||
</div>
|
||||
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
|
||||
<svg id="p22-iv1-svg" viewBox="0 0 480 280" width="100%" style="height:auto"></svg>
|
||||
</div>
|
||||
<div id="p22-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="p22-iv2">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор работы поля</div></div>
|
||||
<div class="wg-help">Режим A: $A = q(\\varphi_1 - \\varphi_2)$. Режим B: $A = qEd$ в однородном поле.</div>
|
||||
<div style="display:flex;gap:8px;justify-content:center;margin-bottom:10px">
|
||||
<button class="btn primary" id="p22-iv2-mA">Режим A: $\\varphi_1, \\varphi_2$</button>
|
||||
<button class="btn" id="p22-iv2-mB">Режим B: $E, d$</button>
|
||||
</div>
|
||||
<div id="p22-iv2-inA" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;align-items:end;margin-bottom:10px">
|
||||
<label>$q$ (нКл): <input type="number" id="p22-iv2-q" class="tinp" value="2" step="0.5" style="width:100%"></label>
|
||||
<label>$\\varphi_1$ (В): <input type="number" id="p22-iv2-f1" class="tinp" value="100" step="10" style="width:100%"></label>
|
||||
<label>$\\varphi_2$ (В): <input type="number" id="p22-iv2-f2" class="tinp" value="40" step="10" style="width:100%"></label>
|
||||
</div>
|
||||
<div id="p22-iv2-inB" style="display:none;grid-template-columns:1fr 1fr 1fr;gap:10px;align-items:end;margin-bottom:10px">
|
||||
<label>$q$ (нКл): <input type="number" id="p22-iv2-qB" class="tinp" value="2" step="0.5" style="width:100%"></label>
|
||||
<label>$E$ (В/м): <input type="number" id="p22-iv2-E" class="tinp" value="500" step="50" style="width:100%"></label>
|
||||
<label>$d$ (м): <input type="number" id="p22-iv2-d" class="tinp" value="0.1" step="0.01" min="0.001" style="width:100%"></label>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:center;margin-bottom:10px">
|
||||
<button class="btn primary" id="p22-iv2-go">Вычислить $A$</button>
|
||||
</div>
|
||||
<div id="p22-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="p22-iv3">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">$U$ положительно, отрицательно или ноль?</div></div>
|
||||
<div class="wg-help">Определи знак напряжения $U_{12} = \\varphi_1 - \\varphi_2$.</div>
|
||||
<div class="score-display"><span>Задача <b id="p22-iv3-i">1</b> / 6</span><span>Очки: <b id="p22-iv3-s">0</b> / 6</span></div>
|
||||
<div id="p22-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="p22-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"></div>
|
||||
<div class="feedback" id="p22-iv3-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p22-iv3-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 4 — Тренажёр напряжения */
|
||||
html += `<div class="wg" id="p22-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="p22-iv4-i">1</b> / 5</span><span>Очки: <b id="p22-iv4-s">0</b> / 5</span></div>
|
||||
<div id="p22-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="p22-iv4-ans" class="tinp" style="width:140px;text-align:center" step="any">
|
||||
<button class="btn primary" id="p22-iv4-go">Проверить</button>
|
||||
<button class="btn" id="p22-iv4-start">Заново</button>
|
||||
</div>
|
||||
<div class="feedback" id="p22-iv4-fb"></div>
|
||||
</div>`;
|
||||
|
||||
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 += '<rect x="0" y="0" width="'+W+'" height="'+H+'" fill="#fafafa"/>';
|
||||
g += '<text x="240" y="22" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">Однородное поле: $U = E\\cdot d$</text>';
|
||||
|
||||
// Верхняя пластина (+)
|
||||
g += '<line x1="'+xL+'" y1="'+yTop+'" x2="'+xR+'" y2="'+yTop+'" stroke="#dc2626" stroke-width="4"/>';
|
||||
g += '<text x="'+(xL-12)+'" y="'+(yTop+5)+'" text-anchor="end" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#dc2626">+</text>';
|
||||
// Нижняя пластина (−)
|
||||
g += '<line x1="'+xL+'" y1="'+yBot+'" x2="'+xR+'" y2="'+yBot+'" stroke="#2563eb" stroke-width="4"/>';
|
||||
g += '<text x="'+(xL-12)+'" y="'+(yBot+5)+'" text-anchor="end" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#2563eb">−</text>';
|
||||
|
||||
// Линии 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 += '<text x="'+(xR+12)+'" y="'+yMid+'" font-family="Inter,sans-serif" font-size="12" font-weight="700" fill="#7c3aed">$\\vec{E}$</text>';
|
||||
|
||||
// Метка d (вертикальная)
|
||||
g += '<line x1="'+(xR+45)+'" y1="'+yTop+'" x2="'+(xR+45)+'" y2="'+yBot+'" stroke="#10b981" stroke-width="1.6" stroke-dasharray="3,3"/>';
|
||||
g += '<line x1="'+(xR+40)+'" y1="'+yTop+'" x2="'+(xR+50)+'" y2="'+yTop+'" stroke="#10b981" stroke-width="1.6"/>';
|
||||
g += '<line x1="'+(xR+40)+'" y1="'+yBot+'" x2="'+(xR+50)+'" y2="'+yBot+'" stroke="#10b981" stroke-width="1.6"/>';
|
||||
g += '<text x="'+(xR+58)+'" y="'+(yMid+4)+'" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#10b981">d</text>';
|
||||
|
||||
// Эквипотенциали — несколько горизонтальных пунктирных
|
||||
const equipCount = 3;
|
||||
for(let i = 1; i <= equipCount; i++){
|
||||
const yE = yTop + (yBot-yTop) * i / (equipCount+1);
|
||||
g += '<line x1="'+(xL+10)+'" y1="'+yE+'" x2="'+(xR-10)+'" y2="'+yE+'" stroke="#94a3b8" stroke-width="0.8" stroke-dasharray="4,4"/>';
|
||||
}
|
||||
g += '<text x="'+(xL+8)+'" y="'+(yBot+22)+'" font-family="Inter,sans-serif" font-size="10" fill="#64748b">эквипотенциали ⊥ $\\vec{E}$</text>';
|
||||
|
||||
svg.innerHTML = g;
|
||||
|
||||
out.innerHTML = '<b>$E = U/d = '+U+'/'+d.toFixed(2)+' = '+E.toFixed(0)+'$ В/м</b> '
|
||||
+ '<span style="color:#64748b">(чем больше $U$ или меньше $d$ — тем сильнее поле)</span>';
|
||||
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 += '<div><b>$U = \\varphi_1 - \\varphi_2 = '+f1+' - '+f2+' = '+U.toFixed(1)+'$ В</b></div>';
|
||||
html += '<div style="margin-top:6px"><b>$A = qU = '+q+'\\cdot 10^{-9} \\cdot '+U.toFixed(1)+' = '+Annano.toFixed(2)+'$ нДж</b></div>';
|
||||
if(A > 0) html += '<div style="margin-top:6px;color:#10b981">$A > 0$: поле совершает положительную работу.</div>';
|
||||
else if(A < 0) html += '<div style="margin-top:6px;color:#dc2626">$A < 0$: поле сопротивляется — нужно работать против поля.</div>';
|
||||
else html += '<div style="margin-top:6px;color:#64748b">$A = 0$: точки на одной эквипотенциали.</div>';
|
||||
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 += '<div><b>$U = Ed = '+E+'\\cdot '+d+' = '+U.toFixed(2)+'$ В</b></div>';
|
||||
html += '<div style="margin-top:6px"><b>$A = qEd = '+q+'\\cdot 10^{-9} \\cdot '+E+' \\cdot '+d+' = '+Annano.toFixed(2)+'$ нДж</b></div>';
|
||||
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 = '<b>Готово!</b> Результат: ' + 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) => '<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, '✓ Верно! ' + 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 = '<b>Готово!</b> Результат: ' + 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", `
|
||||
<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', "Конденсатор и электроёмкость", "§23", `
|
||||
<p><b>Конденсатор</b> — устройство из двух проводников (обкладок), разделённых диэлектриком, предназначенное для накопления электрического заряда и энергии.</p>
|
||||
<p>Заряд конденсатора $q$ — это <b>модуль</b> заряда на одной обкладке (на другой обкладке заряд $-q$). Между обкладками возникает напряжение $U$.</p>
|
||||
<p style="margin-top:10px"><b>Электроёмкость</b> $C$ — отношение заряда обкладки к напряжению между обкладками:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$C = \\dfrac{q}{U}$$</p>
|
||||
<p>$C$ — характеристика самого конденсатора (не зависит от $q$ и $U$, только от геометрии и диэлектрика).</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Единица:</b> <b>Фарад</b> (Ф) $= 1$ Кл / 1 В. Это очень большая ёмкость! На практике:</p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>мкФ ($\\mu$Ф) $= 10^{-6}$ Ф</li>
|
||||
<li>нФ $= 10^{-9}$ Ф</li>
|
||||
<li>пФ $= 10^{-12}$ Ф</li>
|
||||
</ul>
|
||||
`);
|
||||
|
||||
/* THEORY 2 — Плоский конденсатор */
|
||||
html += makeCard('rule', "Плоский конденсатор", "§23", `
|
||||
<p><b>Плоский конденсатор</b> состоит из двух параллельных пластин площадью $S$, разделённых диэлектриком толщины $d$.</p>
|
||||
<p style="text-align:center;margin:10px 0">$$C = \\dfrac{\\varepsilon \\varepsilon_0 S}{d}$$</p>
|
||||
<p>где:</p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>$\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м — электрическая постоянная</li>
|
||||
<li>$\\varepsilon$ — относительная диэлектрическая проницаемость диэлектрика (для воздуха $\\approx 1$, для слюды $\\approx 6$, керамики до 1000)</li>
|
||||
<li>$S$ — площадь пластины в м²</li>
|
||||
<li>$d$ — расстояние между пластинами в м</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--warn-bg,#fef3c7);border-left:4px solid var(--warn,#f59e0b);border-radius:9px"><b>Способы увеличить $C$:</b></p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>Увеличить площадь $S$.</li>
|
||||
<li>Уменьшить расстояние $d$.</li>
|
||||
<li>Использовать диэлектрик с большим $\\varepsilon$.</li>
|
||||
</ul>
|
||||
`);
|
||||
|
||||
/* THEORY 3 — Соединения конденсаторов */
|
||||
html += makeCard('example', "Соединения конденсаторов", "§23", `
|
||||
<p><b>Параллельное соединение:</b></p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>Напряжение одинаково: $U = U_1 = U_2 = \\ldots$</li>
|
||||
<li>Заряды складываются: $q = q_1 + q_2 + \\ldots$</li>
|
||||
<li><b>Ёмкости складываются:</b> $C_{общ} = C_1 + C_2 + \\ldots$</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>Последовательное соединение:</b></p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>Заряд одинаков: $q = q_1 = q_2 = \\ldots$</li>
|
||||
<li>Напряжения складываются: $U = U_1 + U_2 + \\ldots$</li>
|
||||
<li><b>Складываются обратные ёмкости:</b></li>
|
||||
</ul>
|
||||
<p style="text-align:center;margin:10px 0">$$\\dfrac{1}{C_{общ}} = \\dfrac{1}{C_1} + \\dfrac{1}{C_2} + \\ldots$$</p>
|
||||
<p>Для двух последовательно соединённых конденсаторов: $C_{общ} = \\dfrac{C_1 C_2}{C_1 + C_2}$.</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Применение:</b> в радио и электронике для фильтрации и сглаживания сигналов, в импульсных устройствах (фотовспышка), в фильтрах источников питания, в компьютерной памяти.</p>
|
||||
`);
|
||||
|
||||
/* INTERACTIVE 1 — Конструктор плоского конденсатора */
|
||||
html += `<div class="wg" id="p23-iv1">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Конструктор плоского конденсатора</div></div>
|
||||
<div class="wg-help">Меняй площадь пластин $S$, расстояние $d$ и диэлектрик. Наблюдай $C = \\varepsilon\\varepsilon_0 S/d$.</div>
|
||||
<div class="sliders">
|
||||
<label>$S$: <b id="p23-iv1-SL">0.010</b> м² <input type="range" id="p23-iv1-S" min="0.001" max="0.100" value="0.010" step="0.001"></label>
|
||||
<label>$d$: <b id="p23-iv1-dL">0.005</b> м <input type="range" id="p23-iv1-d" min="0.001" max="0.010" value="0.005" step="0.0005"></label>
|
||||
</div>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin:8px 0">
|
||||
<button class="btn primary" id="p23-iv1-eA">Воздух $\\varepsilon = 1$</button>
|
||||
<button class="btn" id="p23-iv1-eM">Слюда $\\varepsilon = 6$</button>
|
||||
<button class="btn" id="p23-iv1-eC">Керамика $\\varepsilon = 100$</button>
|
||||
</div>
|
||||
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
|
||||
<svg id="p23-iv1-svg" viewBox="0 0 480 280" width="100%" style="height:auto"></svg>
|
||||
</div>
|
||||
<div id="p23-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="p23-iv2">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор соединений конденсаторов</div></div>
|
||||
<div class="wg-help">Параллельно: $C = C_1 + C_2$. Последовательно: $1/C = 1/C_1 + 1/C_2$.</div>
|
||||
<div style="display:flex;gap:8px;justify-content:center;margin-bottom:10px">
|
||||
<button class="btn primary" id="p23-iv2-mP">Параллельно</button>
|
||||
<button class="btn" id="p23-iv2-mS">Последовательно</button>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:end;margin-bottom:10px">
|
||||
<label>$C_1$ (мкФ): <input type="number" id="p23-iv2-C1" class="tinp" value="2" step="0.5" min="0.1" style="width:100%"></label>
|
||||
<label>$C_2$ (мкФ): <input type="number" id="p23-iv2-C2" class="tinp" value="6" step="0.5" min="0.1" style="width:100%"></label>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:center;margin-bottom:10px">
|
||||
<button class="btn primary" id="p23-iv2-go">Вычислить $C_{общ}$</button>
|
||||
</div>
|
||||
<div id="p23-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="p23-iv3">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Что увеличит ёмкость конденсатора?</div></div>
|
||||
<div class="wg-help">Опираясь на $C = \\varepsilon\\varepsilon_0 S/d$, выбери: действие <b>увеличит</b> или <b>уменьшит</b> $C$.</div>
|
||||
<div class="score-display"><span>Задача <b id="p23-iv3-i">1</b> / 6</span><span>Очки: <b id="p23-iv3-s">0</b> / 6</span></div>
|
||||
<div id="p23-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="p23-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
|
||||
<div class="feedback" id="p23-iv3-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p23-iv3-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 4 — Тренажёр конденсаторов */
|
||||
html += `<div class="wg" id="p23-iv4">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр конденсаторов</div></div>
|
||||
<div class="wg-help">5 задач. $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м. Допуск $\\pm 5\\%$.</div>
|
||||
<div class="score-display"><span>Задача <b id="p23-iv4-i">1</b> / 5</span><span>Очки: <b id="p23-iv4-s">0</b> / 5</span></div>
|
||||
<div id="p23-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="p23-iv4-ans" class="tinp" style="width:140px;text-align:center" step="any">
|
||||
<button class="btn primary" id="p23-iv4-go">Проверить</button>
|
||||
<button class="btn" id="p23-iv4-start">Заново</button>
|
||||
</div>
|
||||
<div class="feedback" id="p23-iv4-fb"></div>
|
||||
</div>`;
|
||||
|
||||
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 += '<rect x="0" y="0" width="'+W+'" height="'+H+'" fill="#fafafa"/>';
|
||||
g += '<text x="240" y="22" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">Плоский конденсатор</text>';
|
||||
|
||||
// Диэлектрик между пластинами
|
||||
g += '<rect x="'+xL+'" y="'+yTop+'" width="'+(xR-xL)+'" height="'+(yBot-yTop)+'" fill="'+epsColor+'" stroke="#cbd5e1" stroke-width="0.8"/>';
|
||||
// Верхняя пластина (+)
|
||||
g += '<line x1="'+xL+'" y1="'+yTop+'" x2="'+xR+'" y2="'+yTop+'" stroke="#dc2626" stroke-width="5"/>';
|
||||
// Нижняя пластина (−)
|
||||
g += '<line x1="'+xL+'" y1="'+yBot+'" x2="'+xR+'" y2="'+yBot+'" stroke="#2563eb" stroke-width="5"/>';
|
||||
// Метки + и −
|
||||
g += '<text x="'+(xL-10)+'" y="'+(yTop+5)+'" text-anchor="end" font-family="Inter,sans-serif" font-size="16" font-weight="700" fill="#dc2626">+</text>';
|
||||
g += '<text x="'+(xL-10)+'" y="'+(yBot+5)+'" text-anchor="end" font-family="Inter,sans-serif" font-size="16" font-weight="700" fill="#2563eb">−</text>';
|
||||
|
||||
// Подпись диэлектрика по центру
|
||||
g += '<text x="'+cx+'" y="'+(cy+4)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">'+epsName+' (ε = '+eps+')</text>';
|
||||
|
||||
// Размер d справа
|
||||
g += '<line x1="'+(xR+25)+'" y1="'+yTop+'" x2="'+(xR+25)+'" y2="'+yBot+'" stroke="#10b981" stroke-width="1.6" stroke-dasharray="3,3"/>';
|
||||
g += '<line x1="'+(xR+20)+'" y1="'+yTop+'" x2="'+(xR+30)+'" y2="'+yTop+'" stroke="#10b981" stroke-width="1.6"/>';
|
||||
g += '<line x1="'+(xR+20)+'" y1="'+yBot+'" x2="'+(xR+30)+'" y2="'+yBot+'" stroke="#10b981" stroke-width="1.6"/>';
|
||||
g += '<text x="'+(xR+38)+'" y="'+(cy+4)+'" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#10b981">d</text>';
|
||||
|
||||
// Размер плакеты сверху (S = площадь, длина — проекция)
|
||||
g += '<text x="'+cx+'" y="'+(yTop-8)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" font-weight="700" fill="#7c3aed">площадь S</text>';
|
||||
|
||||
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 = '<b>$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+'</b>';
|
||||
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 += '<div><b>Параллельное соединение:</b></div>';
|
||||
html += '<div style="margin-top:6px"><b>$C_{общ} = C_1 + C_2 = '+C1+' + '+C2+' = '+Cob.toFixed(2)+'$ мкФ</b></div>';
|
||||
} else {
|
||||
const inv = 1/C1 + 1/C2;
|
||||
const Cob = (C1*C2)/(C1+C2);
|
||||
html += '<div><b>Последовательное соединение:</b></div>';
|
||||
html += '<div style="margin-top:6px"><b>$\\dfrac{1}{C_{общ}} = \\dfrac{1}{C_1} + \\dfrac{1}{C_2} = \\dfrac{1}{'+C1+'} + \\dfrac{1}{'+C2+'} = '+inv.toFixed(3)+'$ 1/мкФ</b></div>';
|
||||
html += '<div style="margin-top:6px"><b>$C_{общ} = \\dfrac{C_1 C_2}{C_1 + C_2} = \\dfrac{'+C1+'\\cdot '+C2+'}{'+(C1+C2)+'} = '+Cob.toFixed(3)+'$ мкФ</b></div>';
|
||||
}
|
||||
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 = '<b>Готово!</b> Результат: ' + 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) => '<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, '✓ Верно! ' + 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 = '<b>Готово!</b> Результат: ' + 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');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user