feat(alg11 ch3 wave3): §9 «Логарифмические уравнения» (4 метода + ОДЗ)

This commit is contained in:
Maxim Dolgolyov
2026-05-29 12:19:43 +03:00
parent 2a987f01d0
commit c8385205b4
+424 -5
View File
@@ -1518,15 +1518,434 @@ function buildP8(){
function buildP9(){
const box = document.getElementById('p9-body');
let html = '';
html += makeCard('theory', 'В разработке', '9.0', `
<p>Содержание параграфа <b>Логарифмические уравнения</b> будет добавлено в Phase 1+.</p>
<p style="color:var(--muted);font-size:.9rem">Раздел Phase 0 — skeleton. Здесь появятся теория, примеры и интерактивы.</p>
<p style="color:var(--muted);font-size:.9rem">Ключевая формула: $\log_a f = \log_a g$</p>
`);
/* === ТЕОРИЯ === */
html += makeCard('theory', 'Основной метод: потенциирование', '9.1', `
<p><b>Логарифмическим уравнением</b> называется уравнение, в котором переменная содержится <b>под знаком логарифма</b> (или в его основании).</p>
<p>Простейший вид: $\\log_a f(x) = \\log_a g(x)$, где $a > 0$, $a \\ne 1$.</p>
<p>Поскольку логарифмическая функция $y = \\log_a x$ <b>монотонна</b> (см. §8) — строго возрастает при $a > 1$ или строго убывает при $0 < a < 1$, — она <b>инъективна</b>. Из равенства логарифмов следует равенство аргументов:</p>
<p style="text-align:center;padding:10px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">
$\\log_a f(x) = \\log_a g(x) \\;\\Leftrightarrow\\; \\begin{cases} f(x) = g(x) \\\\\\\\ f(x) > 0 \\\\\\\\ g(x) > 0 \\end{cases}$
</p>
<p>Этот переход называется <b>потенциированием</b>. Условия $f(x) > 0$ и $g(x) > 0$ — это <b>ОДЗ</b> (область допустимых значений) уравнения.</p>
<p><b>Алгоритм решения</b>:</p>
<ol style="margin:8px 0 8px 22px;line-height:1.75">
<li>Привести обе части к одному основанию.</li>
<li>Применить свойства логарифмов (см. §7) для упрощения.</li>
<li>Записать ОДЗ: для каждого $\\log_a h(x)$ требуем $h(x) > 0$.</li>
<li>Потенциировать: $f(x) = g(x)$ — и решить.</li>
<li><b>Проверить</b> корни на принадлежность ОДЗ — отбросить посторонние.</li>
</ol>
<p><b>Пример.</b> $\\log_3 (5 - x) = \\log_3 (x + 1)$.</p>
<p>ОДЗ: $5 - x > 0$ и $x + 1 > 0$, то есть $-1 < x < 5$.</p>
<p>Потенциируем: $5 - x = x + 1 \\Rightarrow 2x = 4 \\Rightarrow x = 2$. Проверка: $2 \\in (-1; 5)$ — корень подходит.</p>
<p><b>Ответ:</b> $x = 2$.</p>`);
html += makeCard('rule', 'Определение логарифма и замена переменной', '9.2', `
<p><b>Метод 1. Через определение логарифма.</b> Уравнение вида $\\log_a f(x) = b$ (число справа) — это просто определение логарифма наоборот:</p>
<p style="text-align:center;padding:10px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">
$\\log_a f(x) = b \\;\\Leftrightarrow\\; f(x) = a^b$ &nbsp;(при $f(x) > 0$).
</p>
<p><b>Пример.</b> $\\log_3 (2x - 1) = 2 \\Rightarrow 2x - 1 = 3^2 = 9 \\Rightarrow x = 5$. ОДЗ: $2x - 1 > 0 \\Leftrightarrow x > 0{,}5$. $5 > 0{,}5$ — корень подходит.</p>
<hr style="margin:14px 0;border:none;border-top:1px solid var(--border)">
<p><b>Метод 2. Замена переменной.</b> Уравнения вида</p>
<p style="text-align:center;padding:10px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">
$\\alpha \\log_a^2 x + \\beta \\log_a x + \\gamma = 0$
</p>
<p>— квадратные относительно $t = \\log_a x$. После замены получим $\\alpha t^2 + \\beta t + \\gamma = 0$; найдём $t_1, t_2$, потом обратно $x_i = a^{t_i}$. <b>Все</b> такие $x$ автоматически положительны (это степени положительного числа), поэтому ОДЗ выполняется автоматически.</p>
<p><b>Пример.</b> $\\log_2 x + \\log_x 2 = \\dfrac{5}{2}$.</p>
<p>По формуле перехода $\\log_x 2 = \\dfrac{1}{\\log_2 x}$. Пусть $t = \\log_2 x$, тогда</p>
<p>$t + \\dfrac{1}{t} = \\dfrac{5}{2} \\Rightarrow 2t^2 - 5t + 2 = 0 \\Rightarrow t = 2$ или $t = \\dfrac{1}{2}$.</p>
<p>Обратно: $\\log_2 x = 2 \\Rightarrow x = 4$; $\\;\\log_2 x = \\dfrac{1}{2} \\Rightarrow x = \\sqrt{2}$.</p>
<p><b>Ответ:</b> $x_1 = 4,\\; x_2 = \\sqrt{2}$.</p>`);
html += makeCard('example', 'Применение свойств логарифма', '9.3', `
<p>Часто уравнения содержат <b>сумму или разность</b> логарифмов — их сводят к одному через свойства из §7:</p>
<ul style="margin:8px 0 8px 22px;line-height:1.75">
<li>$\\log_a u + \\log_a v = \\log_a (u v)$;</li>
<li>$\\log_a u - \\log_a v = \\log_a \\dfrac{u}{v}$;</li>
<li>$n \\log_a u = \\log_a u^n$.</li>
</ul>
<p style="padding:10px 12px;background:#fef3c7;border-left:4px solid #f59e0b;border-radius:6px;margin:12px 0">
<b>Внимание!</b> После применения свойств <b>ОДЗ может расшириться</b>. Например, $\\log_a u + \\log_a v$ требует $u > 0$ <b>и</b> $v > 0$, а получившийся $\\log_a (uv)$ требует только $uv > 0$ — то есть допустимо и $u < 0, v < 0$ одновременно.<br>
Поэтому при проверке корней используйте ОДЗ <b>исходного</b> уравнения, а не упрощённого!
</p>
<p><b>Пример.</b> $\\log_2 (x - 1) + \\log_2 (x + 1) = 3$.</p>
<p><b>ОДЗ исходного:</b> $x - 1 > 0$ <b>и</b> $x + 1 > 0$, то есть $x > 1$.</p>
<p>Объединяем логарифмы: $\\log_2 \\bigl((x-1)(x+1)\\bigr) = 3 \\Rightarrow (x-1)(x+1) = 2^3$.</p>
<p>$x^2 - 1 = 8 \\Rightarrow x^2 = 9 \\Rightarrow x = \\pm 3$.</p>
<p>Проверка по ОДЗ: $x = 3 > 1$ — подходит. $x = -3$ не входит в ОДЗ — <b>посторонний корень</b>.</p>
<p><b>Ответ:</b> $x = 3$.</p>
<p><b>Второй пример.</b> $\\log_5 x + \\log_5 (x - 4) = 1$.</p>
<p><b>ОДЗ:</b> $x > 0$ и $x - 4 > 0 \\Rightarrow x > 4$.</p>
<p>$\\log_5 \\bigl(x(x-4)\\bigr) = 1 \\Rightarrow x(x-4) = 5 \\Rightarrow x^2 - 4x - 5 = 0 \\Rightarrow x = 5$ или $x = -1$.</p>
<p>Проверка: $x = 5 > 4$ — подходит. $x = -1$ — посторонний.</p>
<p><b>Ответ:</b> $x = 5$.</p>`);
/* === ИНТЕРАКТИВЫ === */
/* IV1 — пошаговый решатель с ОДЗ */
html += `<div class="wg" id="p9-iv1">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Пошаговый решатель с ОДЗ</div></div>
<div class="wg-help">Выбери задачу ползунком и нажимай «Следующий шаг ▶», чтобы открывать решение по одному шагу. Особое внимание — записи ОДЗ и проверке корней. Просмотри все 5 задач — получишь XP.</div>
<div class="sliders">
<label>Задача № <b id="p9-iv1-n">1</b> / 5<input type="range" id="p9-iv1-sn" min="1" max="5" step="1" value="1"></label>
</div>
<div id="p9-iv1-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.08rem;text-align:center;margin-bottom:10px"></div>
<div id="p9-iv1-steps" style="display:flex;flex-direction:column;gap:8px;margin-bottom:10px"></div>
<div class="actions" style="justify-content:center">
<button class="btn primary" id="p9-iv1-next">Следующий шаг ▶</button>
<button class="btn" id="p9-iv1-all">Показать все шаги</button>
<button class="btn" id="p9-iv1-reset">Скрыть шаги</button>
</div>
</div>`;
/* IV2 — калькулятор log_a (kx + n) = b */
html += `<div class="wg" id="p9-iv2">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор $\\log_a (kx + n) = b$</div></div>
<div class="wg-help">Введи основание $a$ ($a > 0$, $a \\ne 1$) и коэффициенты $k$, $n$, $b$ — калькулятор решит уравнение через определение логарифма и проверит ОДЗ.</div>
<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:center;margin-bottom:8px">
<span style="font-family:'JetBrains Mono',monospace">$a$ =</span>
<input type="number" id="p9-iv2-a" class="tinp" style="width:70px;text-align:center" value="2" step="1">
<span style="font-family:'JetBrains Mono',monospace">$k$ =</span>
<input type="number" id="p9-iv2-k" class="tinp" style="width:70px;text-align:center" value="1" step="1">
<span style="font-family:'JetBrains Mono',monospace">$n$ =</span>
<input type="number" id="p9-iv2-n" class="tinp" style="width:70px;text-align:center" value="3" step="1">
<span style="font-family:'JetBrains Mono',monospace">$b$ =</span>
<input type="number" id="p9-iv2-b" class="tinp" style="width:70px;text-align:center" value="4" step="1">
<button class="btn primary" id="p9-iv2-go">Решить</button>
</div>
<div style="display:flex;gap:6px;flex-wrap:wrap;justify-content:center;margin-bottom:10px;font-size:.82rem">
<span style="color:var(--muted)">Примеры:</span>
<button class="btn" data-set="2,1,3,4" style="padding:4px 10px;font-size:.82rem">$\\log_2(x+3)=4$</button>
<button class="btn" data-set="3,2,-1,2" style="padding:4px 10px;font-size:.82rem">$\\log_3(2x-1)=2$</button>
<button class="btn" data-set="10,1,1,2" style="padding:4px 10px;font-size:.82rem">$\\lg(x+1)=2$</button>
<button class="btn" data-set="5,1,0,1" style="padding:4px 10px;font-size:.82rem">$\\log_5 x=1$</button>
</div>
<div id="p9-iv2-out" style="padding:12px 14px;background:var(--card);border-radius:9px;font-size:.96rem;min-height:60px;line-height:1.8"></div>
<div class="feedback" id="p9-iv2-fb"></div>
</div>`;
/* IV3 — посторонний корень или нет? */
html += `<div class="wg" id="p9-iv3">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Посторонний корень или нет?</div></div>
<div class="wg-help">Дано уравнение и найденный корень. Проверь, удовлетворяет ли он ОДЗ исходного уравнения. 6 заданий.</div>
<div class="score-display"><span>Задача <b id="p9-iv3-i">1</b> / 6</span><span>Очки: <b id="p9-iv3-s">0</b> / 6</span></div>
<div id="p9-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.08rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p9-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:420px;margin:0 auto"></div>
<div class="feedback" id="p9-iv3-fb"></div>
<div class="actions" style="justify-content:center"><button class="btn" id="p9-iv3-restart">Начать заново</button></div>
</div>`;
/* IV4 — тренажёр уравнений */
html += `<div class="wg" id="p9-iv4">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр уравнений</div></div>
<div class="wg-help">Реши уравнение и введи корень (целое или десятичное число, допуск $\\pm 0{,}05$). Где указано — введи <b>сумму</b> корней. 6 задач.</div>
<div class="score-display"><span>Задача <b id="p9-iv4-i">1</b> / 6</span><span>Очки: <b id="p9-iv4-s">0</b> / 6</span></div>
<div id="p9-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.12rem;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="p9-iv4-ans" class="tinp" style="width:120px;text-align:center" step="0.01">
<button class="btn primary" id="p9-iv4-go">Проверить</button>
<button class="btn" id="p9-iv4-start">Заново</button>
</div>
<div class="feedback" id="p9-iv4-fb"></div>
</div>`;
html += secNavFor('p9');
html += readButton('p9');
box.innerHTML = html;
renderMath(box);
/* === IV1 — пошаговый решатель === */
(function(){
const TASKS = [
{
q: '$\\log_2 (x + 3) = 4$',
steps: [
'<b>ОДЗ:</b> $x + 3 > 0 \\Rightarrow x > -3$.',
'По определению логарифма: $x + 3 = 2^4 = 16$.',
'Решаем: $x = 16 - 3 = 13$.',
'Проверка по ОДЗ: $13 > -3$ — корень подходит.',
'<b>Ответ:</b> $x = 13$.'
]
},
{
q: '$\\log_3 (x - 1) = \\log_3 (5 - x)$',
steps: [
'<b>ОДЗ:</b> $x - 1 > 0$ и $5 - x > 0 \\Rightarrow 1 < x < 5$.',
'Потенциируем (основания равны): $x - 1 = 5 - x$.',
'Решаем: $2x = 6 \\Rightarrow x = 3$.',
'Проверка: $3 \\in (1; 5)$ — корень подходит.',
'<b>Ответ:</b> $x = 3$.'
]
},
{
q: '$\\log_5 x + \\log_5 (x - 4) = 1$',
steps: [
'<b>ОДЗ:</b> $x > 0$ и $x - 4 > 0 \\Rightarrow x > 4$.',
'Объединяем по свойству суммы: $\\log_5 \\bigl(x(x-4)\\bigr) = 1$.',
'По определению: $x(x - 4) = 5 \\Rightarrow x^2 - 4x - 5 = 0$.',
'По теореме Виета: $x_1 = 5$, $x_2 = -1$.',
'Проверка по ОДЗ: $5 > 4$ — подходит; $-1$ не входит в ОДЗ — <b>посторонний корень</b>.',
'<b>Ответ:</b> $x = 5$.'
]
},
{
q: '$\\log_2^2 x - 3 \\log_2 x + 2 = 0$',
steps: [
'<b>ОДЗ:</b> $x > 0$.',
'Замена $t = \\log_2 x$: $t^2 - 3t + 2 = 0$.',
'По теореме Виета: $t_1 = 1$, $t_2 = 2$.',
'Обратно: $\\log_2 x = 1 \\Rightarrow x = 2$; $\\;\\log_2 x = 2 \\Rightarrow x = 4$.',
'Оба корня положительны — ОДЗ выполняется.',
'<b>Ответ:</b> $x_1 = 2,\\; x_2 = 4$.'
]
},
{
q: '$\\lg^2 x - \\lg x = 6$',
steps: [
'<b>ОДЗ:</b> $x > 0$.',
'Замена $t = \\lg x$: $t^2 - t - 6 = 0$.',
'По теореме Виета: $t_1 = 3$, $t_2 = -2$.',
'Обратно: $\\lg x = 3 \\Rightarrow x = 10^3 = 1000$; $\\;\\lg x = -2 \\Rightarrow x = 10^{-2} = 0{,}01$.',
'Оба корня положительны — ОДЗ выполняется.',
'<b>Ответ:</b> $x_1 = 1000,\\; x_2 = 0{,}01$.'
]
}
];
const sn = document.getElementById('p9-iv1-sn');
const nL = document.getElementById('p9-iv1-n');
const qEl = document.getElementById('p9-iv1-q');
const stepsEl = document.getElementById('p9-iv1-steps');
const nextBtn = document.getElementById('p9-iv1-next');
const allBtn = document.getElementById('p9-iv1-all');
const resetBtn = document.getElementById('p9-iv1-reset');
const seen = new Set();
let _done = false;
let cur = 0, shown = 0;
function render(){
const t = TASKS[cur];
nL.textContent = (cur + 1);
qEl.innerHTML = t.q;
stepsEl.innerHTML = t.steps.map((s, i) => {
const visible = i < shown;
const isLast = i === t.steps.length - 1 && visible;
const bg = isLast ? '#dcfce7' : 'var(--card)';
const brd = isLast ? '2px solid #16a34a' : '1px solid var(--border)';
return '<div data-i="'+i+'" style="padding:10px 12px;background:'+bg+';border:'+brd+';border-radius:8px;font-size:.95rem;display:'+(visible?'block':'none')+'"><span style="color:var(--muted);font-weight:700;margin-right:6px">Шаг '+(i+1)+':</span>'+s+'</div>';
}).join('');
renderMath(qEl);
renderMath(stepsEl);
if(shown >= t.steps.length){
seen.add(cur);
if(!_done && seen.size >= 5){ _done = true; addXp(10, 'p9-iv1'); bumpProgress('p9', 15); }
}
}
function load(n){ cur = Math.max(0, Math.min(TASKS.length - 1, n)); shown = 1; render(); }
sn.addEventListener('input', () => load((+sn.value) - 1));
nextBtn.addEventListener('click', () => {
if(shown < TASKS[cur].steps.length){ shown++; render(); }
});
allBtn.addEventListener('click', () => { shown = TASKS[cur].steps.length; render(); });
resetBtn.addEventListener('click', () => { shown = 1; render(); });
load(0);
})();
/* === IV2 — калькулятор log_a (kx + n) = b === */
(function(){
const aI = document.getElementById('p9-iv2-a');
const kI = document.getElementById('p9-iv2-k');
const nI = document.getElementById('p9-iv2-n');
const bI = document.getElementById('p9-iv2-b');
const go = document.getElementById('p9-iv2-go');
const out = document.getElementById('p9-iv2-out');
const fb = document.getElementById('p9-iv2-fb');
const used = new Set();
let _done = false;
document.querySelectorAll('#p9-iv2 [data-set]').forEach(btn => {
btn.addEventListener('click', () => {
const v = btn.dataset.set.split(',');
aI.value = v[0]; kI.value = v[1]; nI.value = v[2]; bI.value = v[3];
calc();
});
});
function aLabel(a){
if(a === 10) return '\\lg';
return '\\log_{' + a + '}';
}
function fxLabel(k, n){
let s = '';
if(k === 1) s = 'x';
else if(k === -1) s = '-x';
else s = k + 'x';
if(n > 0) s += ' + ' + n;
else if(n < 0) s += ' - ' + (-n);
return s;
}
function calc(){
const a = parseFloat(aI.value);
const k = parseFloat(kI.value);
const n = parseFloat(nI.value);
const b = parseFloat(bI.value);
if(![a,k,n,b].every(isFinite)){ feedback(fb, false, '&#10007; Введи все четыре числа.'); return; }
if(a <= 0 || Math.abs(a - 1) < 1e-9){ feedback(fb, false, '&#10007; Основание $a$ должно быть $> 0$ и $\\ne 1$.'); return; }
if(k === 0){ feedback(fb, false, '&#10007; При $k = 0$ выражение под логарифмом не зависит от $x$.'); return; }
const fx = fxLabel(k, n);
const eq = '$' + aLabel(a) + '(' + fx + ') = ' + b + '$';
let html = '<div style="font-size:1.04rem;margin-bottom:8px;text-align:center">Уравнение: '+eq+'</div>';
// ОДЗ: kx + n > 0
let odzStr;
if(k > 0){
const bound = -n / k;
odzStr = '$x > ' + (+bound.toFixed(4)) + '$';
} else {
const bound = -n / k;
odzStr = '$x < ' + (+bound.toFixed(4)) + '$';
}
html += '<div style="margin-bottom:6px"><b>ОДЗ:</b> $' + fx + ' > 0 \\Rightarrow$ ' + odzStr + '.</div>';
// По определению: kx + n = a^b
const ab = Math.pow(a, b);
html += '<div style="margin-bottom:6px">По определению логарифма: $' + fx + ' = ' + a + '^{' + b + '} = ' + (+ab.toFixed(4)) + '$.</div>';
// x = (a^b - n) / k
const xVal = (ab - n) / k;
html += '<div style="margin-bottom:6px">Решаем: $x = \\dfrac{' + (+ab.toFixed(4)) + ' - (' + n + ')}{' + k + '} = ' + (+xVal.toFixed(4)) + '$.</div>';
// Проверка ОДЗ
const check = k * xVal + n;
const ok = check > 1e-9;
if(ok){
html += '<div style="margin-bottom:4px;color:#15803d"><b>Проверка ОДЗ:</b> $' + fx.replace('x', '(' + (+xVal.toFixed(4)) + ')') + ' = ' + (+check.toFixed(4)) + ' > 0$ — корень подходит.</div>';
html += '<div style="font-weight:700;color:#15803d">$\\Rightarrow x = ' + (+xVal.toFixed(4)) + '$</div>';
feedback(fb, true, '&#10003; Решено.');
} else {
html += '<div style="margin-bottom:4px;color:#b91c1c"><b>Проверка ОДЗ:</b> аргумент логарифма получается $\\le 0$ — посторонний корень.</div>';
html += '<div style="font-weight:700;color:#b91c1c">Уравнение не имеет решений.</div>';
feedback(fb, true, '&#10003; Решено: корней нет.');
}
out.innerHTML = html;
renderMath(out);
used.add(aI.value+','+kI.value+','+nI.value+','+bI.value);
if(!_done && used.size >= 4){ _done = true; addXp(10, 'p9-iv2'); bumpProgress('p9', 15); }
}
go.addEventListener('click', calc);
[aI, kI, nI, bI].forEach(i => i.addEventListener('keydown', e => { if(e.key === 'Enter') calc(); }));
calc();
})();
/* === IV3 — посторонний корень или нет? === */
(function(){
const OPTS = ['Подходит', 'Посторонний'];
const Q = [
{ q: '$\\log_2 (x + 1) = 3$, найден $x = 7$', ans: 0, hint: 'ОДЗ: $x + 1 > 0 \\Rightarrow x > -1$. $7 > -1$ — подходит.' },
{ q: '$\\log_2 (x - 5) = 1$, найден $x = 7$', ans: 0, hint: 'ОДЗ: $x - 5 > 0 \\Rightarrow x > 5$. $7 > 5$ — подходит.' },
{ q: '$\\log_3 (x - 1) + \\log_3 (x + 1) = 1$, найден $x = -2$', ans: 1, hint: 'ОДЗ исходного: $x - 1 > 0$ и $x + 1 > 0 \\Rightarrow x > 1$. $-2 < 1$ — посторонний.' },
{ q: '$\\log_2 (4 - x) = 0$, найден $x = 3$', ans: 0, hint: 'ОДЗ: $4 - x > 0 \\Rightarrow x < 4$. $3 < 4$ — подходит (и $4 - 3 = 1 > 0$).' },
{ q: '$\\lg (x^2 - 5) = \\lg (4x)$, найден $x = -1$', ans: 1, hint: 'ОДЗ: $4x > 0 \\Rightarrow x > 0$. $-1 < 0$ — посторонний.' },
{ q: '$\\log_5 (x - 3) = 1$, найден $x = 8$', ans: 0, hint: 'ОДЗ: $x - 3 > 0 \\Rightarrow x > 3$. $8 > 3$ — подходит ($x - 3 = 5 > 0$).' },
];
let i = 0, score = 0;
const qEl = document.getElementById('p9-iv3-q');
const oEl = document.getElementById('p9-iv3-opts');
const fb = document.getElementById('p9-iv3-fb');
const iEl = document.getElementById('p9-iv3-i');
const sEl = document.getElementById('p9-iv3-s');
function show(){
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: '+score+' / '+Q.length;
oEl.innerHTML = '';
if(score === Q.length){ addXp(15, 'p9-iv3'); bumpProgress('p9', 25); }
else if(score >= 4){ addXp(8, 'p9-iv3'); bumpProgress('p9', 15); }
return;
}
iEl.textContent = (i + 1);
sEl.textContent = score;
const item = Q[i];
qEl.innerHTML = item.q;
oEl.innerHTML = OPTS.map((o, k) => '<button class="btn primary" data-k="'+k+'">'+o+'</button>').join('');
fb.style.display = 'none';
renderMath(qEl);
oEl.querySelectorAll('button').forEach(b => {
b.addEventListener('click', () => {
const k = +b.dataset.k;
if(k === item.ans){ score++; feedback(fb, true, '&#10003; Верно! '+item.hint+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. Правильно: <b>'+OPTS[item.ans]+'</b>. '+item.hint+' Дальше ▶');
sEl.textContent = score;
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
i++;
setTimeout(show, 1700);
});
});
}
document.getElementById('p9-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
show();
})();
/* === IV4 — тренажёр уравнений === */
(function(){
const Q = [
{ q: '$\\log_3 x = 2$', ans: 9, hint: '$x = 3^2 = 9$.' },
{ q: '$\\log_2 (x - 1) = 3$', ans: 9, hint: '$x - 1 = 2^3 = 8 \\Rightarrow x = 9$.' },
{ q: '$\\lg (x + 1) = 2$', ans: 99, hint: '$x + 1 = 10^2 = 100 \\Rightarrow x = 99$.' },
{ q: '$\\log_5 (2x + 1) = 1$', ans: 2, hint: '$2x + 1 = 5 \\Rightarrow x = 2$.' },
{ q: '$\\log_2^2 x - 5 \\log_2 x + 6 = 0$ — введи <b>сумму</b> корней', ans: 12, hint: 'Замена $t = \\log_2 x$: $t = 2$ или $t = 3$. Корни $x = 4, x = 8$, сумма $= 12$.' },
{ q: '$\\log_3 x + \\log_3 (x - 2) = 1$ — введи корень', ans: 3, hint: 'ОДЗ $x > 2$. $x(x-2) = 3 \\Rightarrow x^2 - 2x - 3 = 0 \\Rightarrow x = 3$ или $-1$. $-1$ — посторонний.' },
];
let i = 0, score = 0;
function show(){
const qEl = document.getElementById('p9-iv4-q');
const iEl = document.getElementById('p9-iv4-i');
const sEl = document.getElementById('p9-iv4-s');
const fb = document.getElementById('p9-iv4-fb');
const ansI = document.getElementById('p9-iv4-ans');
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: '+score+' / '+Q.length;
if(score === Q.length){ addXp(15, 'p9-iv4'); bumpProgress('p9', 25); }
else if(score >= 4){ addXp(8, 'p9-iv4'); bumpProgress('p9', 15); }
return;
}
iEl.textContent = (i + 1);
sEl.textContent = score;
qEl.innerHTML = Q[i].q;
ansI.value = '';
renderMath(qEl);
fb.style.display = 'none';
setTimeout(() => ansI.focus(), 30);
}
function go(){
if(i >= Q.length) return;
const fb = document.getElementById('p9-iv4-fb');
const raw = document.getElementById('p9-iv4-ans').value.replace(',', '.');
const ans = parseFloat(raw);
if(isNaN(ans)){ feedback(fb, false, '&#10007; Введи число.'); return; }
if(Math.abs(ans - Q[i].ans) < 0.05){
score++;
feedback(fb, true, '&#10003; Верно! '+Q[i].hint+' Дальше ▶');
} else {
feedback(fb, false, '&#10007; Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶');
}
document.getElementById('p9-iv4-s').textContent = score;
i++;
setTimeout(show, 1700);
}
document.getElementById('p9-iv4-go').addEventListener('click', go);
document.getElementById('p9-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
document.getElementById('p9-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
show();
})();
wireReadBtn('p9');
}