feat(phys10 ch6 wave1): §34 «Ток в металлах» + §35 «Электролиты»
§34 «Электрический ток в металлах. Сверхпроводимость»: - 3 makeCard: природа тока, R(t) для металлов, сверхпроводимость - IV1: симуляция дрейфа электронов в решётке (SVG, slider U) - IV2: график R(t) = R_0(1 + alpha t), переключение материалов + скачок T_c - IV3: квикфайр на носителей заряда в средах (6 вопросов) - IV4: тренажёр 5 задач (rho L/S, R при разных T, T_c ртути) §35 «Электрический ток в электролитах. Электролиз»: - 3 makeCard: электролиты/ионы, законы Фарадея, применение - IV1: симуляция электролиза (катионы → катоду, анионы → аноду) - IV2: калькулятор массы m = MIt/(Fn) для Cu/Ag/Al/Fe/H - IV3: квикфайр направления ионов (6 вопросов, 2 кнопки) - IV4: тренажёр 5 задач (расчёт m для Cu/Ag, F = 96500)
This commit is contained in:
@@ -634,34 +634,779 @@ function wireReadBtn(paraId){
|
||||
function build_p34(){
|
||||
const box = document.getElementById('p34-body');
|
||||
let html = '';
|
||||
html += makeCard('theory', "Ток в металлах. Сверхпроводимость", "§34", `
|
||||
<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 6+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
|
||||
</p>
|
||||
|
||||
/* THEORY 1 — Природа тока в металлах */
|
||||
html += makeCard('theory', "Природа тока в металлах", "§34", `
|
||||
<p>В <b>металлах</b> свободными носителями заряда являются <b>электроны проводимости</b> — внешние электроны атомов, не связанные с конкретным узлом решётки.</p>
|
||||
<p style="margin-top:10px">Концентрация свободных электронов огромна: $n \\sim 10^{29}$ в м³.</p>
|
||||
<p style="margin-top:10px"><b>Кристаллическая решётка</b> металла состоит из положительных ионов в узлах. Между ними движется «электронный газ» — почти свободные электроны.</p>
|
||||
<p style="margin-top:10px"><b>Без электрического поля</b>: электроны движутся <b>хаотически</b> со скоростями $\\sim 10^5 - 10^6$ м/с. Средняя скорость направленного движения равна нулю — тока нет.</p>
|
||||
<p style="margin-top:10px"><b>В электрическом поле $\\vec{E}$</b>: на хаотическое движение накладывается <b>дрейфовое</b> движение в сторону, противоположную $\\vec{E}$ (так как заряд электрона отрицательный). Средняя дрейфовая скорость очень мала: $v_{др} \\sim 10^{-3} - 10^{-5}$ м/с.</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Парадокс.</b> Дрейф электронов очень медленный, но ток в проводнике включается «мгновенно» — электрическое поле в проводнике устанавливается со скоростью света $c \\approx 3\\cdot 10^8$ м/с.</p>
|
||||
`);
|
||||
|
||||
/* THEORY 2 — Сопротивление и температура */
|
||||
html += makeCard('rule', "Сопротивление и зависимость от температуры", "§34", `
|
||||
<p><b>Сопротивление</b> однородного проводника:</p>
|
||||
<p style="text-align:center;margin:8px 0">$$R = \\rho\\,\\dfrac{L}{S}$$</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>$\\rho$ — удельное сопротивление (Ом·м);</li>
|
||||
<li>$L$ — длина проводника (м);</li>
|
||||
<li>$S$ — площадь поперечного сечения (м²).</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>Зависимость от температуры</b> для металлов — линейная:</p>
|
||||
<p style="text-align:center;margin:8px 0">$$\\rho(t) = \\rho_0\\,(1 + \\alpha t)$$</p>
|
||||
<p>где $\\rho_0$ — удельное сопротивление при $0°$C, $t$ — температура в $°$C, $\\alpha$ — <b>температурный коэффициент сопротивления</b> (К$^{-1}$).</p>
|
||||
<p style="margin-top:10px"><b>Эталонные значения $\\alpha$</b>:</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>Медь: $\\alpha \\approx 0{,}0043$ К$^{-1}$;</li>
|
||||
<li>Алюминий: $\\alpha \\approx 0{,}0042$ К$^{-1}$;</li>
|
||||
<li>Железо: $\\alpha \\approx 0{,}0066$ К$^{-1}$;</li>
|
||||
<li>Платина: $\\alpha \\approx 0{,}0039$ К$^{-1}$ — используется в термометрах сопротивления.</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px">С нагревом сопротивление металлов <b>увеличивается</b>: атомы решётки сильнее колеблются и чаще «мешают» электронам дрейфовать.</p>
|
||||
`);
|
||||
|
||||
/* THEORY 3 — Сверхпроводимость */
|
||||
html += makeCard('example', "Сверхпроводимость", "§34", `
|
||||
<p><b>Сверхпроводимость</b> — явление полного исчезновения сопротивления у некоторых металлов при температурах ниже <b>критической</b> $T_c$.</p>
|
||||
<p style="margin-top:10px">Открыта в 1911 году для ртути ($T_c = 4{,}2$ К — близко к абсолютному нулю).</p>
|
||||
<p style="margin-top:10px"><b>Критические температуры</b>:</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>Ртуть: $T_c = 4{,}2$ К;</li>
|
||||
<li>Свинец: $T_c = 7{,}2$ К;</li>
|
||||
<li>Ниобий: $T_c = 9{,}2$ К;</li>
|
||||
<li>Высокотемпературные сверхпроводники (керамика YBa$_2$Cu$_3$O$_7$): $T_c \\approx 95$ К — выше точки кипения жидкого азота (77 К). Открыты в 1986, революция, Нобелевская премия.</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>В сверхпроводнике ток может циркулировать бесконечно долго без потерь.</b></p>
|
||||
<p style="margin-top:10px"><b>Применение:</b></p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li><b>Сверхмощные магниты</b> — МРТ, ускорители (в Большом адронном коллайдере все магниты сверхпроводящие);</li>
|
||||
<li><b>Маглев-поезда</b> — левитация на сверхпроводящих магнитах;</li>
|
||||
<li><b>Беспотерьная передача электроэнергии</b> — экспериментально для коротких линий.</li>
|
||||
</ul>
|
||||
`);
|
||||
|
||||
/* INTERACTIVE 1 — Симуляция дрейфа электронов */
|
||||
html += `<div class="wg" id="p34-iv1">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Симуляция дрейфа электронов</div></div>
|
||||
<div class="wg-help">При $U = 0$ — электроны движутся <b>хаотически</b>, тока нет. При $U > 0$ — на хаос накладывается медленный <b>дрейф</b> в сторону, противоположную $\\vec{E}$. Дрейф $\\Rightarrow$ ток.</div>
|
||||
<div class="sliders">
|
||||
<label>Напряжение $U$ (В): <b id="p34-iv1-UL">0.0</b><input type="range" id="p34-iv1-U" min="0" max="10" value="0" step="0.5"></label>
|
||||
</div>
|
||||
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px;margin-top:8px">
|
||||
<svg id="p34-iv1-svg" viewBox="0 0 380 240" width="100%" style="height:auto"></svg>
|
||||
</div>
|
||||
<div id="p34-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.7;text-align:center"></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 2 — Температурная зависимость */
|
||||
html += `<div class="wg" id="p34-iv2">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Сопротивление: график $R(t)$</div></div>
|
||||
<div class="wg-help">Для металлов: $R(t) = R_0(1 + \\alpha t)$ — прямая линия. Сверхпроводники имеют <b>скачок</b> до $R = 0$ при $T < T_c$.</div>
|
||||
<div class="sliders">
|
||||
<label>Материал: <b id="p34-iv2-ML">Медь</b><input type="range" id="p34-iv2-M" min="0" max="3" value="0" step="1"></label>
|
||||
<label>$R_0$ при $0°$C (Ом): <b id="p34-iv2-RL">1.0</b><input type="range" id="p34-iv2-R" min="0.1" max="10" value="1" step="0.1"></label>
|
||||
</div>
|
||||
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px;margin-top:8px">
|
||||
<svg id="p34-iv2-svg" viewBox="0 0 380 260" width="100%" style="height:auto"></svg>
|
||||
</div>
|
||||
<div id="p34-iv2-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.7;text-align:center"></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 3 — Носители заряда в разных средах */
|
||||
html += `<div class="wg" id="p34-iv3">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Кто переносит ток?</div></div>
|
||||
<div class="wg-help">В каждой среде свои носители заряда — определи правильно.</div>
|
||||
<div class="score-display"><span>Задача <b id="p34-iv3-i">1</b> / 6</span><span>Очки: <b id="p34-iv3-s">0</b> / 6</span></div>
|
||||
<div id="p34-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="p34-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"></div>
|
||||
<div class="feedback" id="p34-iv3-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p34-iv3-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 4 — Тренажёр сопротивления */
|
||||
html += `<div class="wg" id="p34-iv4">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр: сопротивление и сверхпроводимость</div></div>
|
||||
<div class="wg-help">5 задач. Допуск $\\pm 5\\%$. Формулы: $R = \\rho L/S$, $R(t) = R_0(1+\\alpha t)$.</div>
|
||||
<div class="score-display"><span>Задача <b id="p34-iv4-i">1</b> / 5</span><span>Очки: <b id="p34-iv4-s">0</b> / 5</span></div>
|
||||
<div id="p34-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 id="p34-iv4-form" style="display:flex;gap:8px;justify-content:center;margin-bottom:8px;flex-wrap:wrap">
|
||||
<input type="number" id="p34-iv4-inp" step="any" style="padding:8px 10px;border:1px solid var(--border);border-radius:6px;width:140px;font-size:1rem">
|
||||
<button class="btn primary" id="p34-iv4-go">Проверить</button>
|
||||
</div>
|
||||
<div class="feedback" id="p34-iv4-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p34-iv4-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
html += secNav(null, 'p35');
|
||||
html += readButton('p34');
|
||||
|
||||
box.innerHTML = html;
|
||||
renderMath(box);
|
||||
|
||||
/* IV1 — Дрейф электронов */
|
||||
(function(){
|
||||
const svg = document.getElementById('p34-iv1-svg');
|
||||
const out = document.getElementById('p34-iv1-out');
|
||||
const UI = document.getElementById('p34-iv1-U'), UL = document.getElementById('p34-iv1-UL');
|
||||
const W = 380, H = 240;
|
||||
// Решётка ионов: сетка
|
||||
const ions = [];
|
||||
for(let r=0; r<4; r++){
|
||||
for(let c=0; c<7; c++){
|
||||
ions.push({x: 40 + c*48, y: 50 + r*48});
|
||||
}
|
||||
}
|
||||
// Электроны
|
||||
const N = 22;
|
||||
const els = [];
|
||||
for(let k=0; k<N; k++){
|
||||
els.push({
|
||||
x: 30 + Math.random()*320,
|
||||
y: 30 + Math.random()*180,
|
||||
vx: (Math.random()-0.5)*1.8,
|
||||
vy: (Math.random()-0.5)*1.8
|
||||
});
|
||||
}
|
||||
let rafId = null;
|
||||
let configsSeen = new Set(), _done = false;
|
||||
|
||||
function step(){
|
||||
const U = +UI.value;
|
||||
const drift = U * 0.18; // дрейфовая скорость "пиксели/кадр"
|
||||
// обновим электроны: хаос + дрейф вправо (если U>0)
|
||||
els.forEach(e => {
|
||||
// случайные толчки от ионов
|
||||
e.vx += (Math.random()-0.5)*0.45;
|
||||
e.vy += (Math.random()-0.5)*0.45;
|
||||
// ограничение
|
||||
const sp = Math.hypot(e.vx, e.vy);
|
||||
if(sp > 2.4){ e.vx *= 2.4/sp; e.vy *= 2.4/sp; }
|
||||
e.x += e.vx + drift;
|
||||
e.y += e.vy;
|
||||
// отскок от границ
|
||||
if(e.x < 16){ e.x = 364; }
|
||||
if(e.x > 364){ e.x = 16; }
|
||||
if(e.y < 16){ e.y = 16; e.vy = Math.abs(e.vy); }
|
||||
if(e.y > 220){ e.y = 220; e.vy = -Math.abs(e.vy); }
|
||||
});
|
||||
draw();
|
||||
rafId = requestAnimationFrame(step);
|
||||
}
|
||||
|
||||
function draw(){
|
||||
const U = +UI.value;
|
||||
UL.textContent = U.toFixed(1);
|
||||
let g = '';
|
||||
g += '<rect x="0" y="0" width="'+W+'" height="'+H+'" fill="#fafafa"/>';
|
||||
// рамка проводника
|
||||
g += '<rect x="8" y="14" width="364" height="212" fill="none" stroke="#cbd5e1" stroke-width="1.4" rx="6"/>';
|
||||
// подпись E
|
||||
if(U > 0){
|
||||
g += PHYS.drawArrow(40, 8, 90, 8, '#dc2626', 2, 8);
|
||||
g += '<text x="100" y="12" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#dc2626">E</text>';
|
||||
}
|
||||
// ионы (большие красные +)
|
||||
ions.forEach(io => {
|
||||
g += '<circle cx="'+io.x+'" cy="'+io.y+'" r="7" fill="#fecaca" stroke="#dc2626" stroke-width="1.4"/>';
|
||||
g += '<text x="'+io.x+'" y="'+(io.y+3.5)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="11" font-weight="800" fill="#7f1d1d">+</text>';
|
||||
});
|
||||
// электроны
|
||||
els.forEach(e => {
|
||||
g += '<circle cx="'+e.x.toFixed(1)+'" cy="'+e.y.toFixed(1)+'" r="3.2" fill="#0891b2" stroke="#fff" stroke-width="0.8"/>';
|
||||
// вектор скорости
|
||||
if(U > 0){
|
||||
const sx = e.x, sy = e.y;
|
||||
const ex = sx + 6, ey = sy;
|
||||
g += '<line x1="'+sx.toFixed(1)+'" y1="'+sy.toFixed(1)+'" x2="'+ex.toFixed(1)+'" y2="'+ey.toFixed(1)+'" stroke="#0891b2" stroke-width="1" opacity=".7"/>';
|
||||
}
|
||||
});
|
||||
svg.innerHTML = g;
|
||||
|
||||
const vDrift = U > 0 ? (U * 0.0002).toFixed(4) : '0';
|
||||
out.innerHTML = U === 0
|
||||
? 'При $U = 0$ электроны движутся <b>хаотически</b> — тока нет.'
|
||||
: '$U = '+U.toFixed(1)+'$ В $\\Rightarrow$ дрейф электронов вправо, $v_{др} \\sim '+vDrift+'$ м/с (примерная оценка).';
|
||||
renderMath(out);
|
||||
}
|
||||
|
||||
UI.addEventListener('input', ()=>{
|
||||
configsSeen.add(UI.value);
|
||||
if(!_done && configsSeen.size >= 4){ _done = true; addXp(15, 'p34-iv1'); bumpProgress('p34', 20); }
|
||||
});
|
||||
draw();
|
||||
rafId = requestAnimationFrame(step);
|
||||
})();
|
||||
|
||||
/* IV2 — R(t) график */
|
||||
(function(){
|
||||
const svg = document.getElementById('p34-iv2-svg');
|
||||
const out = document.getElementById('p34-iv2-out');
|
||||
const MI = document.getElementById('p34-iv2-M'), ML = document.getElementById('p34-iv2-ML');
|
||||
const RI = document.getElementById('p34-iv2-R'), RL = document.getElementById('p34-iv2-RL');
|
||||
const MATS = [
|
||||
{ name:'Медь', alpha:0.0043, color:'#b45309', sc:false },
|
||||
{ name:'Алюминий', alpha:0.0042, color:'#64748b', sc:false },
|
||||
{ name:'Железо', alpha:0.0066, color:'#374151', sc:false },
|
||||
{ name:'Свинец (сверхпр. при $T<7{,}2$ К)', alpha:0.0042, color:'#7c3aed', sc:true, Tc:7.2 }
|
||||
];
|
||||
let switched = new Set(), _done = false;
|
||||
|
||||
function draw(){
|
||||
const m = MATS[Math.min(3, Math.max(0, +MI.value))];
|
||||
const R0 = +RI.value;
|
||||
ML.innerHTML = m.name;
|
||||
RL.textContent = R0.toFixed(1);
|
||||
renderMath(MI.parentNode);
|
||||
|
||||
// Оси: t от -50 до 500 °C; R от 0 до примерно R0*(1+alpha*500)
|
||||
const Rmax = R0 * (1 + m.alpha * 500) * 1.1;
|
||||
const Wd = 380, Hd = 260, pad = 38;
|
||||
const tmin = -50, tmax = 500;
|
||||
const ux = (Wd - 2*pad) / (tmax - tmin);
|
||||
const uy = (Hd - 2*pad) / (Rmax - 0);
|
||||
const toX = t => pad + (t - tmin) * ux;
|
||||
const toY = R => Hd - pad - R * uy;
|
||||
|
||||
let g = '';
|
||||
g += '<rect x="0" y="0" width="'+Wd+'" height="'+Hd+'" fill="#fafafa"/>';
|
||||
// сетка
|
||||
g += '<g stroke="#e5e7eb" stroke-width="1">';
|
||||
for(let t=0; t<=500; t+=100){
|
||||
const x = toX(t);
|
||||
g += '<line x1="'+x+'" y1="'+pad+'" x2="'+x+'" y2="'+(Hd-pad)+'"/>';
|
||||
}
|
||||
g += '</g>';
|
||||
// оси
|
||||
g += '<line x1="'+pad+'" y1="'+toY(0)+'" x2="'+(Wd-pad)+'" y2="'+toY(0)+'" stroke="#0f172a" stroke-width="1.4"/>';
|
||||
g += '<line x1="'+toX(0)+'" y1="'+pad+'" x2="'+toX(0)+'" y2="'+(Hd-pad)+'" stroke="#0f172a" stroke-width="1.4"/>';
|
||||
g += '<text x="'+(Wd-pad+2)+'" y="'+(toY(0)-4)+'" font-size="11" fill="#0f172a">t, °C</text>';
|
||||
g += '<text x="'+(toX(0)+4)+'" y="'+(pad-2)+'" font-size="11" fill="#0f172a">R, Ом</text>';
|
||||
|
||||
// tick labels
|
||||
g += '<g font-size="10" fill="#64748b">';
|
||||
for(let t=0; t<=500; t+=100){
|
||||
g += '<text x="'+(toX(t)-3)+'" y="'+(toY(0)+12)+'">'+t+'</text>';
|
||||
}
|
||||
g += '<text x="'+(toX(0)+4)+'" y="'+(toY(R0)+3)+'">'+R0.toFixed(1)+'</text>';
|
||||
g += '</g>';
|
||||
|
||||
// Линия R(t)
|
||||
let path = '';
|
||||
for(let i=0; i<=80; i++){
|
||||
const t = tmin + (tmax - tmin)*i/80;
|
||||
const Rv = R0 * (1 + m.alpha * t);
|
||||
path += (i===0 ? 'M' : 'L') + toX(t).toFixed(1) + ',' + toY(Math.max(0,Rv)).toFixed(1) + ' ';
|
||||
}
|
||||
g += '<path d="'+path+'" stroke="'+m.color+'" stroke-width="2.4" fill="none"/>';
|
||||
|
||||
// Если сверхпроводник — вертикальный скачок до 0 при T=Tc
|
||||
if(m.sc){
|
||||
// Tc в °C
|
||||
const tcC = m.Tc - 273.15;
|
||||
// отметим линию
|
||||
const xTc = toX(tcC);
|
||||
if(xTc > pad && xTc < Wd - pad){
|
||||
g += '<line x1="'+xTc+'" y1="'+toY(0)+'" x2="'+xTc+'" y2="'+toY(R0)+'" stroke="#dc2626" stroke-width="2.2" stroke-dasharray="4 3"/>';
|
||||
g += '<text x="'+(xTc+4)+'" y="'+toY(R0*0.5)+'" font-size="10" fill="#dc2626">T_c</text>';
|
||||
}
|
||||
g += '<text x="'+(Wd/2)+'" y="'+(Hd-8)+'" text-anchor="middle" font-size="10" fill="#7c3aed">Слева от $T_c$ — сверхпроводимость: $R = 0$</text>';
|
||||
}
|
||||
|
||||
// Точка R при t=100
|
||||
const t100 = 100;
|
||||
const R100 = R0 * (1 + m.alpha * t100);
|
||||
g += '<circle cx="'+toX(t100)+'" cy="'+toY(R100)+'" r="4.5" fill="'+m.color+'" stroke="#fff" stroke-width="2"/>';
|
||||
g += '<text x="'+(toX(t100)+8)+'" y="'+(toY(R100)-6)+'" font-family="JetBrains Mono,monospace" font-size="10" fill="'+m.color+'">R(100°C) = '+R100.toFixed(2)+'</text>';
|
||||
|
||||
svg.innerHTML = g;
|
||||
|
||||
out.innerHTML = '$\\alpha = '+m.alpha.toFixed(4)+'$ К$^{-1}$ $R(100°C) = '+R0.toFixed(2)+'\\cdot(1+'+m.alpha.toFixed(4)+'\\cdot 100) = '+R100.toFixed(3)+'$ Ом';
|
||||
renderMath(out);
|
||||
}
|
||||
|
||||
MI.addEventListener('input', ()=>{
|
||||
switched.add(MI.value);
|
||||
draw();
|
||||
if(!_done && switched.size >= 3){ _done = true; addXp(15, 'p34-iv2'); bumpProgress('p34', 20); }
|
||||
});
|
||||
RI.addEventListener('input', draw);
|
||||
draw();
|
||||
})();
|
||||
|
||||
/* IV3 — Носители заряда */
|
||||
(function(){
|
||||
const OPTS = ['Электроны', 'Ионы', 'Электроны + ионы'];
|
||||
const Q = [
|
||||
{ q:'В <b>металлах</b> ток переносят…', ans:0, why:'Свободные электроны проводимости (~$10^{29}$ в м³). Ионы решётки неподвижны.' },
|
||||
{ q:'В <b>электролитах</b> (раствор соли) ток переносят…', ans:1, why:'Положительные катионы и отрицательные анионы движутся к электродам.' },
|
||||
{ q:'В <b>газах при электрическом разряде</b> ток переносят…', ans:2, why:'Электроны (ионизированные при разряде) и положительные ионы.' },
|
||||
{ q:'В <b>вакуумной электронной лампе</b> ток переносят…', ans:0, why:'Только электроны, испускаемые горячим катодом (термоэлектронная эмиссия).' },
|
||||
{ q:'В <b>сверхпроводнике</b> (металл при $T<T_c$) ток переносят…', ans:0, why:'Электроны, но <b>без сопротивления</b> — куперовские пары не рассеиваются на решётке.' },
|
||||
{ q:'В <b>полупроводнике</b> ток переносят…', ans:2, why:'Электроны проводимости и «дырки» (положительные носители) — оба типа.' }
|
||||
];
|
||||
let i = 0, score = 0;
|
||||
const qEl = document.getElementById('p34-iv3-q');
|
||||
const oEl = document.getElementById('p34-iv3-opts');
|
||||
const fb = document.getElementById('p34-iv3-fb');
|
||||
const iEl = document.getElementById('p34-iv3-i');
|
||||
const sEl = document.getElementById('p34-iv3-s');
|
||||
|
||||
function show(){
|
||||
if(i >= Q.length){
|
||||
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
|
||||
oEl.innerHTML = '';
|
||||
if(score === Q.length){ addXp(15, 'p34-iv3'); bumpProgress('p34', 25); }
|
||||
else if(score >= 4){ addXp(8, 'p34-iv3'); bumpProgress('p34', 15); }
|
||||
return;
|
||||
}
|
||||
iEl.textContent = (i+1);
|
||||
sEl.textContent = score;
|
||||
qEl.innerHTML = Q[i].q;
|
||||
oEl.innerHTML = OPTS.map((t,k) => '<button class="btn primary" data-v="'+k+'">'+t+'</button>').join('');
|
||||
fb.style.display = 'none';
|
||||
renderMath(qEl);
|
||||
oEl.querySelectorAll('button').forEach(b => {
|
||||
b.addEventListener('click', () => {
|
||||
const v = +b.dataset.v;
|
||||
if(v === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! '+Q[i].why+' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Верно: '+OPTS[Q[i].ans]+'. '+Q[i].why+' Дальше ▶');
|
||||
sEl.textContent = score;
|
||||
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
|
||||
i++;
|
||||
setTimeout(show, 1900);
|
||||
});
|
||||
});
|
||||
}
|
||||
document.getElementById('p34-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
|
||||
show();
|
||||
})();
|
||||
|
||||
/* IV4 — Тренажёр */
|
||||
(function(){
|
||||
const Q = [
|
||||
{ q:'Медь: $\\rho = 1{,}7\\cdot 10^{-8}$ Ом·м. Провод $L = 10$ м, сечение $S = 1$ мм² $= 10^{-6}$ м². Найди $R$ (Ом).', ans:0.17, tol:0.01, why:'$R = \\rho L/S = 1{,}7\\cdot 10^{-8}\\cdot 10 / 10^{-6} = 0{,}17$ Ом.' },
|
||||
{ q:'Медь: $R_0 = 1$ Ом при $0°$C, $\\alpha = 0{,}0043$ К$^{-1}$. Найди $R$ при $100°$C (Ом).', ans:1.43, tol:0.05, why:'$R = R_0(1 + \\alpha t) = 1\\cdot(1 + 0{,}0043\\cdot 100) = 1{,}43$ Ом.' },
|
||||
{ q:'Сверхпроводимость — это явление, когда $R$… (1=максимально, 2=равно нулю, 3=пропорц. $T$). Введи номер.', ans:2, tol:0.1, why:'При $T<T_c$ сопротивление сверхпроводника <b>равно нулю</b>.' },
|
||||
{ q:'Первая критическая температура сверхпроводимости ртути (в кельвинах). Введи число.', ans:4.2, tol:0.3, why:'Камерлинг-Оннес, 1911: $T_c({Hg}) = 4{,}2$ К.' },
|
||||
{ q:'Алюминий ($\\alpha = 0{,}0042$ К$^{-1}$). $R_0 = 5$ Ом при $0°$C. Найди $R$ при $50°$C (Ом).', ans:6.05, tol:0.2, why:'$R = 5(1 + 0{,}0042\\cdot 50) = 5\\cdot 1{,}21 = 6{,}05$ Ом.' }
|
||||
];
|
||||
let i = 0, score = 0;
|
||||
const qEl = document.getElementById('p34-iv4-q');
|
||||
const fb = document.getElementById('p34-iv4-fb');
|
||||
const iEl = document.getElementById('p34-iv4-i');
|
||||
const sEl = document.getElementById('p34-iv4-s');
|
||||
const inp = document.getElementById('p34-iv4-inp');
|
||||
const bGo = document.getElementById('p34-iv4-go');
|
||||
|
||||
function show(){
|
||||
if(i >= Q.length){
|
||||
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
|
||||
inp.disabled = true; bGo.disabled = true;
|
||||
if(score === Q.length){ addXp(15, 'p34-iv4'); bumpProgress('p34', 25); }
|
||||
else if(score >= 3){ addXp(8, 'p34-iv4'); bumpProgress('p34', 15); }
|
||||
return;
|
||||
}
|
||||
iEl.textContent = (i+1);
|
||||
sEl.textContent = score;
|
||||
qEl.innerHTML = Q[i].q;
|
||||
fb.style.display = 'none';
|
||||
inp.value = ''; inp.disabled = false; bGo.disabled = false; inp.focus();
|
||||
renderMath(qEl);
|
||||
}
|
||||
function check(){
|
||||
if(inp.disabled) return;
|
||||
const v = parseFloat(inp.value.replace(',','.'));
|
||||
if(!isFinite(v)){ feedback(fb, false, 'Введи число.'); return; }
|
||||
const tol = Math.max(Q[i].tol, Math.abs(Q[i].ans)*0.05);
|
||||
const ok = Math.abs(v - Q[i].ans) <= tol;
|
||||
if(ok){ score++; feedback(fb, true, '✓ Верно! '+Q[i].why+' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Верно: '+Q[i].ans+'. '+Q[i].why+' Дальше ▶');
|
||||
sEl.textContent = score;
|
||||
inp.disabled = true; bGo.disabled = true;
|
||||
i++;
|
||||
setTimeout(show, 1900);
|
||||
}
|
||||
bGo.addEventListener('click', check);
|
||||
inp.addEventListener('keydown', e => { if(e.key==='Enter') check(); });
|
||||
document.getElementById('p34-iv4-restart').addEventListener('click', () => { i = 0; score = 0; inp.disabled=false; bGo.disabled=false; show(); });
|
||||
show();
|
||||
})();
|
||||
|
||||
wireReadBtn('p34');
|
||||
}
|
||||
|
||||
function build_p35(){
|
||||
const box = document.getElementById('p35-body');
|
||||
let html = '';
|
||||
html += makeCard('theory', "Ток в электролитах", "§35", `
|
||||
<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 6+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
|
||||
</p>
|
||||
|
||||
/* THEORY 1 — Электролиты и ионная проводимость */
|
||||
html += makeCard('theory', "Электролиты и ионная проводимость", "§35", `
|
||||
<p><b>Электролиты</b> — вещества, проводящие электрический ток в растворе или расплаве за счёт движения ионов:</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>Растворы солей, кислот, щелочей в воде;</li>
|
||||
<li>Расплавы солей.</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px">В электролите присутствуют <b>свободные ионы</b> — продукт диссоциации молекул электролита:</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li><b>Катионы</b> ($+$): Na$^+$, K$^+$, Cu$^{2+}$, Fe$^{2+}$, H$^+$ и др.;</li>
|
||||
<li><b>Анионы</b> ($-$): Cl$^-$, SO$_4^{2-}$, NO$_3^-$, OH$^-$ и др.</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>В электрическом поле</b> ионы движутся к электродам:</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>Катионы $(+)$ — к <b>катоду</b> $(-$ электрод);</li>
|
||||
<li>Анионы $(-)$ — к <b>аноду</b> $(+$ электрод).</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Главное отличие от металлов:</b> в электролите переносится не только заряд, но и <b>вещество</b> — на электродах идут химические реакции. Это явление называется <b>электролизом</b>.</p>
|
||||
`);
|
||||
|
||||
/* THEORY 2 — Законы Фарадея */
|
||||
html += makeCard('rule', "Законы Фарадея для электролиза", "§35", `
|
||||
<p><b>Первый закон Фарадея</b>: масса вещества, выделившегося на электроде, прямо пропорциональна заряду, прошедшему через электролит:</p>
|
||||
<p style="text-align:center;margin:8px 0">$$m = k\\,I\\,t = k\\,q$$</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>$m$ — масса вещества (кг);</li>
|
||||
<li>$I$ — сила тока (А);</li>
|
||||
<li>$t$ — время (с);</li>
|
||||
<li>$k$ — <b>электрохимический эквивалент</b> вещества (кг/Кл).</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>Второй закон Фарадея</b>: электрохимический эквивалент пропорционален молярной массе и обратно пропорционален валентности:</p>
|
||||
<p style="text-align:center;margin:8px 0">$$k = \\dfrac{M}{F\\,n}$$</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li>$M$ — молярная масса (кг/моль);</li>
|
||||
<li>$n$ — валентность иона;</li>
|
||||
<li>$F = N_A\\,e \\approx 96\\,500$ Кл/моль — <b>постоянная Фарадея</b>.</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>Объединённый закон Фарадея</b>:</p>
|
||||
<p style="text-align:center;margin:8px 0">$$m = \\dfrac{M}{F\\,n}\\,I\\,t$$</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Физический смысл $F$:</b> это заряд $\\sim 1$ моль однозарядных ионов, $F = N_A\\,e \\approx 6{,}022\\cdot 10^{23}\\cdot 1{,}6\\cdot 10^{-19} \\approx 96\\,500$ Кл.</p>
|
||||
`);
|
||||
|
||||
/* THEORY 3 — Применение электролиза */
|
||||
html += makeCard('example', "Применение электролиза", "§35", `
|
||||
<p><b>Промышленные применения</b>:</p>
|
||||
<ul style="margin:6px 0 6px 22px">
|
||||
<li><b>Электролиз алюминия</b> — основной способ его получения из боксита. Огромные ванны рядом с электростанциями.</li>
|
||||
<li><b>Электрометаллургия меди</b>: получение чистой меди электролизом раствора CuSO$_4$.</li>
|
||||
<li><b>Производство хлора и каустической соды</b> — электролиз раствора NaCl.</li>
|
||||
<li><b>Гальванопластика</b>: точные металлические копии скульптур, форм для печати — осаждение металла на форму.</li>
|
||||
<li><b>Гальваностегия</b>: декоративные и защитные покрытия — хромирование, золочение, никелирование.</li>
|
||||
<li><b>Зарядка аккумуляторов</b> — процесс, обратный разрядке (тоже электролиз).</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px"><b>Пример расчёта.</b> Сколько меди ($M = 64$ г/моль, $n = 2$) выделится на катоде при $I = 5$ А за $t = 1$ ч?</p>
|
||||
<p style="text-align:center;margin:8px 0">$m = \\dfrac{M I t}{F n} = \\dfrac{0{,}064 \\cdot 5 \\cdot 3600}{96\\,500 \\cdot 2} \\approx 5{,}97$ г</p>
|
||||
<p style="margin-top:10px"><b>Серебро</b> $(M = 108$ г/моль, $n = 1)$ при тех же условиях:</p>
|
||||
<p style="text-align:center;margin:8px 0">$m = \\dfrac{0{,}108 \\cdot 5 \\cdot 3600}{96\\,500 \\cdot 1} \\approx 20{,}15$ г — почти в 4 раза больше!</p>
|
||||
`);
|
||||
|
||||
/* INTERACTIVE 1 — Симуляция электролиза */
|
||||
html += `<div class="wg" id="p35-iv1">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Симуляция электролиза</div></div>
|
||||
<div class="wg-help">Положительные катионы (красные) движутся к <b>катоду</b> (слева, $-$). Отрицательные анионы (синие) — к <b>аноду</b> (справа, $+$). Скорость пропорциональна току $I$.</div>
|
||||
<div class="sliders">
|
||||
<label>Сила тока $I$ (А): <b id="p35-iv1-IL">0.0</b><input type="range" id="p35-iv1-I" min="0" max="10" value="0" step="0.5"></label>
|
||||
</div>
|
||||
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px;margin-top:8px">
|
||||
<svg id="p35-iv1-svg" viewBox="0 0 380 280" width="100%" style="height:auto"></svg>
|
||||
</div>
|
||||
<div id="p35-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.7;text-align:center"></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 2 — Калькулятор электролиза */
|
||||
html += `<div class="wg" id="p35-iv2">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор массы вещества при электролизе</div></div>
|
||||
<div class="wg-help">Формула: $m = \\dfrac{M\\,I\\,t}{F\\,n}$, $F = 96\\,500$ Кл/моль.</div>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:10px">
|
||||
<label style="display:flex;flex-direction:column;gap:4px;font-size:.92rem">Вещество:
|
||||
<select id="p35-iv2-sub" style="padding:7px;border:1px solid var(--border);border-radius:6px">
|
||||
<option value="0">Медь (Cu): M=64, n=2</option>
|
||||
<option value="1">Серебро (Ag): M=108, n=1</option>
|
||||
<option value="2">Алюминий (Al): M=27, n=3</option>
|
||||
<option value="3">Железо (Fe): M=56, n=2</option>
|
||||
<option value="4">Водород (H): M=1, n=1</option>
|
||||
</select>
|
||||
</label>
|
||||
<label style="display:flex;flex-direction:column;gap:4px;font-size:.92rem">$I$ (А):<input type="number" id="p35-iv2-I" value="5" step="0.1" min="0" style="padding:7px;border:1px solid var(--border);border-radius:6px"></label>
|
||||
<label style="display:flex;flex-direction:column;gap:4px;font-size:.92rem">$t$ (с):<input type="number" id="p35-iv2-t" value="3600" step="any" min="0" style="padding:7px;border:1px solid var(--border);border-radius:6px"></label>
|
||||
</div>
|
||||
<div class="actions"><button class="btn primary" id="p35-iv2-calc">Вычислить массу $m$</button></div>
|
||||
<div id="p35-iv2-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.98rem;line-height:1.8;text-align:center;min-height:40px"></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 3 — Куда движется ион? */
|
||||
html += `<div class="wg" id="p35-iv3">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Куда движется ион?</div></div>
|
||||
<div class="wg-help">Катионы $(+)$ → к катоду $(-)$. Анионы $(-)$ → к аноду $(+)$.</div>
|
||||
<div class="score-display"><span>Задача <b id="p35-iv3-i">1</b> / 6</span><span>Очки: <b id="p35-iv3-s">0</b> / 6</span></div>
|
||||
<div id="p35-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.05rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
|
||||
<div id="p35-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
|
||||
<div class="feedback" id="p35-iv3-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p35-iv3-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 4 — Тренажёр электролиза */
|
||||
html += `<div class="wg" id="p35-iv4">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр: электролиз</div></div>
|
||||
<div class="wg-help">5 задач. $F = 96\\,500$ Кл/моль. Допуск $\\pm 5\\%$.</div>
|
||||
<div class="score-display"><span>Задача <b id="p35-iv4-i">1</b> / 5</span><span>Очки: <b id="p35-iv4-s">0</b> / 5</span></div>
|
||||
<div id="p35-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 id="p35-iv4-form" style="display:flex;gap:8px;justify-content:center;margin-bottom:8px;flex-wrap:wrap">
|
||||
<input type="number" id="p35-iv4-inp" step="any" style="padding:8px 10px;border:1px solid var(--border);border-radius:6px;width:140px;font-size:1rem">
|
||||
<button class="btn primary" id="p35-iv4-go">Проверить</button>
|
||||
</div>
|
||||
<div class="feedback" id="p35-iv4-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p35-iv4-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
html += secNav('p34', 'p36');
|
||||
html += readButton('p35');
|
||||
|
||||
box.innerHTML = html;
|
||||
renderMath(box);
|
||||
|
||||
/* IV1 — Симуляция электролиза */
|
||||
(function(){
|
||||
const svg = document.getElementById('p35-iv1-svg');
|
||||
const out = document.getElementById('p35-iv1-out');
|
||||
const II = document.getElementById('p35-iv1-I'), IL = document.getElementById('p35-iv1-IL');
|
||||
const W = 380, H = 280;
|
||||
// Ионы: красные катионы (+) и синие анионы (-)
|
||||
const NCat = 12, NAn = 12;
|
||||
const cats = [], ans = [];
|
||||
for(let k=0; k<NCat; k++){
|
||||
cats.push({ x: 80 + Math.random()*220, y: 80 + Math.random()*160, vy: (Math.random()-0.5)*1.0 });
|
||||
}
|
||||
for(let k=0; k<NAn; k++){
|
||||
ans.push({ x: 80 + Math.random()*220, y: 80 + Math.random()*160, vy: (Math.random()-0.5)*1.0 });
|
||||
}
|
||||
let rafId = null;
|
||||
let configs = new Set(), _done = false;
|
||||
|
||||
function step(){
|
||||
const I = +II.value;
|
||||
const v = I * 0.25;
|
||||
cats.forEach(p => {
|
||||
p.x -= v; // катионы влево (к катоду)
|
||||
p.vy += (Math.random()-0.5)*0.4;
|
||||
if(Math.abs(p.vy) > 1.4) p.vy *= 0.7;
|
||||
p.y += p.vy;
|
||||
if(p.x < 75){ p.x = 295; }
|
||||
if(p.y < 80){ p.y = 80; p.vy = Math.abs(p.vy); }
|
||||
if(p.y > 240){ p.y = 240; p.vy = -Math.abs(p.vy); }
|
||||
});
|
||||
ans.forEach(p => {
|
||||
p.x += v; // анионы вправо (к аноду)
|
||||
p.vy += (Math.random()-0.5)*0.4;
|
||||
if(Math.abs(p.vy) > 1.4) p.vy *= 0.7;
|
||||
p.y += p.vy;
|
||||
if(p.x > 305){ p.x = 85; }
|
||||
if(p.y < 80){ p.y = 80; p.vy = Math.abs(p.vy); }
|
||||
if(p.y > 240){ p.y = 240; p.vy = -Math.abs(p.vy); }
|
||||
});
|
||||
draw();
|
||||
rafId = requestAnimationFrame(step);
|
||||
}
|
||||
|
||||
function draw(){
|
||||
const I = +II.value;
|
||||
IL.textContent = I.toFixed(1);
|
||||
let g = '';
|
||||
g += '<rect x="0" y="0" width="'+W+'" height="'+H+'" fill="#fafafa"/>';
|
||||
// ванна с электролитом
|
||||
g += '<rect x="60" y="65" width="260" height="195" rx="10" fill="#e0f2fe" stroke="#0891b2" stroke-width="2"/>';
|
||||
g += '<text x="190" y="58" text-anchor="middle" font-family="Inter,sans-serif" font-size="11" font-weight="700" fill="#0f172a">Электролит (раствор)</text>';
|
||||
// катод (слева, минус)
|
||||
g += '<rect x="70" y="75" width="14" height="180" fill="#6b7280" stroke="#374151" stroke-width="1.4"/>';
|
||||
g += '<text x="77" y="68" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="13" font-weight="800" fill="#0891b2">К ('+'−'+')</text>';
|
||||
// анод (справа, плюс)
|
||||
g += '<rect x="296" y="75" width="14" height="180" fill="#6b7280" stroke="#374151" stroke-width="1.4"/>';
|
||||
g += '<text x="303" y="68" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="13" font-weight="800" fill="#dc2626">А (+)</text>';
|
||||
|
||||
// батарея внизу
|
||||
g += '<text x="190" y="276" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#64748b">Источник тока</text>';
|
||||
g += PHYS.batteryEMF(190, 270, undefined, 'h');
|
||||
|
||||
// провода
|
||||
g += PHYS.wire(77, 257, 77, 270);
|
||||
g += PHYS.wire(77, 270, 175, 270);
|
||||
g += PHYS.wire(205, 270, 303, 270);
|
||||
g += PHYS.wire(303, 270, 303, 257);
|
||||
|
||||
// ионы — катионы (красные, +)
|
||||
cats.forEach(p => {
|
||||
g += '<circle cx="'+p.x.toFixed(1)+'" cy="'+p.y.toFixed(1)+'" r="6" fill="#fecaca" stroke="#dc2626" stroke-width="1.4"/>';
|
||||
g += '<text x="'+p.x.toFixed(1)+'" y="'+(p.y+3).toFixed(1)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" font-weight="800" fill="#7f1d1d">+</text>';
|
||||
});
|
||||
// анионы (синие, -)
|
||||
ans.forEach(p => {
|
||||
g += '<circle cx="'+p.x.toFixed(1)+'" cy="'+p.y.toFixed(1)+'" r="6" fill="#dbeafe" stroke="#1d4ed8" stroke-width="1.4"/>';
|
||||
g += '<text x="'+p.x.toFixed(1)+'" y="'+(p.y+3).toFixed(1)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="11" font-weight="800" fill="#1e3a8a">'+'−'+'</text>';
|
||||
});
|
||||
|
||||
// стрелка направления для катионов и анионов
|
||||
if(I > 0){
|
||||
g += PHYS.drawArrow(200, 50, 130, 50, '#dc2626', 1.6, 7);
|
||||
g += '<text x="200" y="48" font-family="Inter,sans-serif" font-size="10" fill="#dc2626">катионы</text>';
|
||||
g += PHYS.drawArrow(180, 30, 250, 30, '#1d4ed8', 1.6, 7);
|
||||
g += '<text x="120" y="33" font-family="Inter,sans-serif" font-size="10" fill="#1d4ed8">анионы</text>';
|
||||
}
|
||||
|
||||
svg.innerHTML = g;
|
||||
out.innerHTML = I === 0
|
||||
? 'При $I = 0$ ионы движутся хаотически (тока нет).'
|
||||
: '$I = '+I.toFixed(1)+'$ А — катионы дрейфуют к <b>катоду</b> ($-$), анионы к <b>аноду</b> ($+$).';
|
||||
renderMath(out);
|
||||
}
|
||||
|
||||
II.addEventListener('input', ()=>{
|
||||
configs.add(II.value);
|
||||
if(!_done && configs.size >= 4){ _done = true; addXp(15, 'p35-iv1'); bumpProgress('p35', 20); }
|
||||
});
|
||||
draw();
|
||||
rafId = requestAnimationFrame(step);
|
||||
})();
|
||||
|
||||
/* IV2 — Калькулятор */
|
||||
(function(){
|
||||
const out = document.getElementById('p35-iv2-out');
|
||||
const sub = document.getElementById('p35-iv2-sub');
|
||||
const iI = document.getElementById('p35-iv2-I');
|
||||
const iT = document.getElementById('p35-iv2-t');
|
||||
const bGo = document.getElementById('p35-iv2-calc');
|
||||
const SUBS = [
|
||||
{ name:'Cu (медь)', M:0.064, n:2 },
|
||||
{ name:'Ag (серебро)', M:0.108, n:1 },
|
||||
{ name:'Al (алюминий)', M:0.027, n:3 },
|
||||
{ name:'Fe (железо)', M:0.056, n:2 },
|
||||
{ name:'H (водород)', M:0.001, n:1 }
|
||||
];
|
||||
const F = 96500;
|
||||
let count = 0, _done = false;
|
||||
|
||||
function calc(){
|
||||
const s = SUBS[+sub.value];
|
||||
const I = +iI.value, t = +iT.value;
|
||||
if(![I,t].every(isFinite) || I < 0 || t < 0){
|
||||
out.innerHTML = '<b style="color:#dc2626">Проверь ввод: $I \\ge 0$, $t \\ge 0$.</b>';
|
||||
renderMath(out);
|
||||
return;
|
||||
}
|
||||
const m_kg = (s.M * I * t) / (F * s.n);
|
||||
const m_g = m_kg * 1000;
|
||||
let html = '';
|
||||
html += '<b>'+s.name+'</b>: $M = '+(s.M*1000)+'$ г/моль, $n = '+s.n+'$<br>';
|
||||
html += '$m = \\dfrac{M\\,I\\,t}{F\\,n} = \\dfrac{'+s.M+'\\cdot '+I+'\\cdot '+t+'}{'+F+'\\cdot '+s.n+'}$<br>';
|
||||
html += '$m \\approx $ <b>'+m_g.toFixed(3)+' г</b> ($'+m_kg.toExponential(3)+'$ кг)';
|
||||
out.innerHTML = html;
|
||||
renderMath(out);
|
||||
count++;
|
||||
if(!_done && count >= 3){ _done = true; addXp(10, 'p35-iv2'); bumpProgress('p35', 15); }
|
||||
}
|
||||
bGo.addEventListener('click', calc);
|
||||
[iI, iT].forEach(x => x.addEventListener('keydown', e => { if(e.key==='Enter') calc(); }));
|
||||
sub.addEventListener('change', calc);
|
||||
})();
|
||||
|
||||
/* IV3 — Куда движется ион */
|
||||
(function(){
|
||||
const OPTS = ['К катоду (−)', 'К аноду (+)'];
|
||||
const Q = [
|
||||
{ q:'Ион меди Cu$^{2+}$ движется…', ans:0, why:'Катион (+) → к катоду ($-$). На катоде восстанавливается до Cu.' },
|
||||
{ q:'Ион SO$_4^{2-}$ движется…', ans:1, why:'Анион ($-$) → к аноду (+).' },
|
||||
{ q:'Ион натрия Na$^+$ движется…', ans:0, why:'Катион → к катоду.' },
|
||||
{ q:'Ион хлора Cl$^-$ движется…', ans:1, why:'Анион → к аноду. На аноде окисляется до Cl$_2$.' },
|
||||
{ q:'Ион водорода H$^+$ движется…', ans:0, why:'Катион → к катоду. На катоде восстанавливается до H$_2$.' },
|
||||
{ q:'Ион гидроксила OH$^-$ движется…',ans:1, why:'Анион → к аноду. На аноде окисляется (выделяется O$_2$).' }
|
||||
];
|
||||
let i = 0, score = 0;
|
||||
const qEl = document.getElementById('p35-iv3-q');
|
||||
const oEl = document.getElementById('p35-iv3-opts');
|
||||
const fb = document.getElementById('p35-iv3-fb');
|
||||
const iEl = document.getElementById('p35-iv3-i');
|
||||
const sEl = document.getElementById('p35-iv3-s');
|
||||
|
||||
function show(){
|
||||
if(i >= Q.length){
|
||||
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
|
||||
oEl.innerHTML = '';
|
||||
if(score === Q.length){ addXp(15, 'p35-iv3'); bumpProgress('p35', 25); }
|
||||
else if(score >= 4){ addXp(8, 'p35-iv3'); bumpProgress('p35', 15); }
|
||||
return;
|
||||
}
|
||||
iEl.textContent = (i+1);
|
||||
sEl.textContent = score;
|
||||
qEl.innerHTML = Q[i].q;
|
||||
oEl.innerHTML = OPTS.map((t,k) => '<button class="btn primary" data-v="'+k+'">'+t+'</button>').join('');
|
||||
fb.style.display = 'none';
|
||||
renderMath(qEl);
|
||||
oEl.querySelectorAll('button').forEach(b => {
|
||||
b.addEventListener('click', () => {
|
||||
const v = +b.dataset.v;
|
||||
if(v === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! '+Q[i].why+' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Верно: '+OPTS[Q[i].ans]+'. '+Q[i].why+' Дальше ▶');
|
||||
sEl.textContent = score;
|
||||
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
|
||||
i++;
|
||||
setTimeout(show, 1900);
|
||||
});
|
||||
});
|
||||
}
|
||||
document.getElementById('p35-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
|
||||
show();
|
||||
})();
|
||||
|
||||
/* IV4 — Тренажёр */
|
||||
(function(){
|
||||
const Q = [
|
||||
{ q:'$I = 2$ А, $t = 30$ мин $= 1800$ с. Медь (Cu, $M = 64$ г/моль, $n = 2$), $F = 96\\,500$ Кл/моль. Найди $m$ (в <b>граммах</b>).', ans:1.19, tol:0.06, why:'$m = MIt/(Fn) = 64\\cdot 2\\cdot 1800/(96\\,500\\cdot 2) \\approx 1{,}19$ г.' },
|
||||
{ q:'$I = 5$ А, $t = 1$ ч $= 3600$ с. Медь ($M=64$, $n=2$). Найди $m$ (г).', ans:5.97, tol:0.3, why:'$m = 64\\cdot 5\\cdot 3600/(96\\,500\\cdot 2) \\approx 5{,}97$ г.' },
|
||||
{ q:'Серебро ($M = 108$ г/моль, $n = 1$). $I = 1$ А, $t = 3600$ с. Найди $m$ (г).', ans:4.03, tol:0.2, why:'$m = 108\\cdot 1\\cdot 3600/(96\\,500\\cdot 1) \\approx 4{,}03$ г.' },
|
||||
{ q:'К какому электроду движутся <b>катионы</b>? (1 = анод, 2 = катод). Введи номер.', ans:2, tol:0.1, why:'Катионы $(+)$ движутся к катоду $(-)$.' },
|
||||
{ q:'Постоянная Фарадея $F$ в Кл/моль (округлённое значение). Введи число.', ans:96500, tol:500, why:'$F = N_A \\cdot e \\approx 96\\,500$ Кл/моль.' }
|
||||
];
|
||||
let i = 0, score = 0;
|
||||
const qEl = document.getElementById('p35-iv4-q');
|
||||
const fb = document.getElementById('p35-iv4-fb');
|
||||
const iEl = document.getElementById('p35-iv4-i');
|
||||
const sEl = document.getElementById('p35-iv4-s');
|
||||
const inp = document.getElementById('p35-iv4-inp');
|
||||
const bGo = document.getElementById('p35-iv4-go');
|
||||
|
||||
function show(){
|
||||
if(i >= Q.length){
|
||||
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
|
||||
inp.disabled = true; bGo.disabled = true;
|
||||
if(score === Q.length){ addXp(15, 'p35-iv4'); bumpProgress('p35', 25); }
|
||||
else if(score >= 3){ addXp(8, 'p35-iv4'); bumpProgress('p35', 15); }
|
||||
return;
|
||||
}
|
||||
iEl.textContent = (i+1);
|
||||
sEl.textContent = score;
|
||||
qEl.innerHTML = Q[i].q;
|
||||
fb.style.display = 'none';
|
||||
inp.value = ''; inp.disabled = false; bGo.disabled = false; inp.focus();
|
||||
renderMath(qEl);
|
||||
}
|
||||
function check(){
|
||||
if(inp.disabled) return;
|
||||
const v = parseFloat(inp.value.replace(',','.'));
|
||||
if(!isFinite(v)){ feedback(fb, false, 'Введи число.'); return; }
|
||||
const tol = Math.max(Q[i].tol, Math.abs(Q[i].ans)*0.05);
|
||||
const ok = Math.abs(v - Q[i].ans) <= tol;
|
||||
if(ok){ score++; feedback(fb, true, '✓ Верно! '+Q[i].why+' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Верно: '+Q[i].ans+'. '+Q[i].why+' Дальше ▶');
|
||||
sEl.textContent = score;
|
||||
inp.disabled = true; bGo.disabled = true;
|
||||
i++;
|
||||
setTimeout(show, 1900);
|
||||
}
|
||||
bGo.addEventListener('click', check);
|
||||
inp.addEventListener('keydown', e => { if(e.key==='Enter') check(); });
|
||||
document.getElementById('p35-iv4-restart').addEventListener('click', () => { i = 0; score = 0; inp.disabled=false; bGo.disabled=false; show(); });
|
||||
show();
|
||||
})();
|
||||
|
||||
wireReadBtn('p35');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user