diff --git a/frontend/textbooks/algebra_11_ch2.html b/frontend/textbooks/algebra_11_ch2.html index 302b6f9..e1ce5b4 100644 --- a/frontend/textbooks/algebra_11_ch2.html +++ b/frontend/textbooks/algebra_11_ch2.html @@ -1043,15 +1043,416 @@ function buildP4(){ function buildP5(){ const box = document.getElementById('p5-body'); let html = ''; - html += makeCard('theory', 'В разработке', '5.0', ` -

Содержание параграфа Показательные уравнения будет добавлено в Phase 1+.

-

Раздел Phase 0 — skeleton. Здесь появятся теория, примеры и интерактивы.

-

Ключевая формула: $a^{f(x)} = a^{g(x)}$

- `); + + /* === ТЕОРИЯ === */ + + html += makeCard('theory', 'Метод приведения к одному основанию', '5.1', ` +

Показательным уравнением называется уравнение, в котором переменная содержится в показателе степени.

+

Простейший вид: $a^{f(x)} = a^{g(x)}$, где $a > 0$, $a \\ne 1$.

+

Поскольку показательная функция $y = a^x$ инъективна (взаимно однозначна — каждое значение принимает ровно один раз), из равенства степеней с одинаковым основанием следует равенство показателей:

+

+ $a^{f(x)} = a^{g(x)} \\;\\Leftrightarrow\\; f(x) = g(x)$  (при $a > 0$, $a \\ne 1$). +

+

Алгоритм решения:

+
    +
  1. Привести обе части к степени с одинаковым основанием.
  2. +
  3. Приравнять показатели: $f(x) = g(x)$.
  4. +
  5. Решить полученное уравнение и записать корни.
  6. +
+

Пример. $\\left(\\dfrac{1}{2}\\right)^{x-1} = 8$.

+

Приводим к основанию $2$: $\\left(\\dfrac{1}{2}\\right)^{x-1} = 2^{-(x-1)} = 2^{1-x}$, а $8 = 2^3$.

+

Получаем $2^{1-x} = 2^3 \\Rightarrow 1 - x = 3 \\Rightarrow x = -2$.

+

Ответ: $x = -2$.

`); + + html += makeCard('rule', 'Метод замены переменной', '5.2', ` +

Уравнения вида $A \\cdot a^{2x} + B \\cdot a^x + C = 0$ сводятся к квадратному заменой $t = a^x$.

+

Важное условие: $t = a^x > 0$ при любых $x$. Значит, после нахождения корней $t_1, t_2$ нужно отбросить неположительные значения.

+

+ $A \\cdot a^{2x} + B \\cdot a^x + C = 0 \\;\\xrightarrow{\\;t = a^x > 0\\;}\\; A t^2 + B t + C = 0$ +

+

Алгоритм:

+
    +
  1. Заметить структуру: степени образуют пары $a^{2x} = (a^x)^2$.
  2. +
  3. Ввести замену $t = a^x$, $t > 0$.
  4. +
  5. Решить квадратное уравнение, проверить условие $t > 0$.
  6. +
  7. Для каждого подходящего $t$ найти $x$ из $a^x = t$, т.е. $x = \\log_a t$.
  8. +
+

Пример. $9^x - 4 \\cdot 3^x + 3 = 0$.

+

Замечаем: $9^x = (3^2)^x = (3^x)^2$. Замена $t = 3^x$, $t > 0$.

+

$t^2 - 4t + 3 = 0 \\Rightarrow t = 1$ или $t = 3$ (оба положительны).

+

$3^x = 1 \\Rightarrow x = 0$;   $3^x = 3 \\Rightarrow x = 1$.

+

Ответ: $x_1 = 0,\\; x_2 = 1$.

`); + + html += makeCard('example', 'Однородные уравнения и графический метод', '5.3', ` +

Однородное уравнение второй степени относительно $a^x$ и $b^x$ имеет вид

+

+ $A \\cdot a^{2x} + B \\cdot (ab)^x + C \\cdot b^{2x} = 0$. +

+

Все слагаемые имеют «суммарную степень» $2x$. Делим обе части на $b^{2x}$ (это $> 0$, так что эквивалентность сохраняется):

+

$A \\cdot \\left(\\dfrac{a}{b}\\right)^{2x} + B \\cdot \\left(\\dfrac{a}{b}\\right)^x + C = 0$.

+

Замена $t = (a/b)^x$, $t > 0$ — снова получаем квадратное уравнение.

+

Пример. $3 \\cdot 4^x - 7 \\cdot 6^x + 4 \\cdot 9^x = 0$.

+

Делим на $9^x$: $3 \\cdot (4/9)^x - 7 \\cdot (6/9)^x + 4 = 0$, то есть $3 (2/3)^{2x} - 7 (2/3)^x + 4 = 0$.

+

Замена $t = (2/3)^x$: $3t^2 - 7t + 4 = 0 \\Rightarrow t = 1$ или $t = 4/3$.

+

$t = 1 \\Rightarrow x = 0$. $t = 4/3 \\Rightarrow (2/3)^x = 4/3$ — корень $x = -1$ (так как $(2/3)^{-1} = 3/2 \\ne 4/3$… проверь: основание $2/3 < 1$, а $4/3 > 1$, значит $x < 0$).

+
+

Графический метод применяется, когда не удаётся привести к одному основанию и не подходит замена. Решения — абсциссы точек пересечения графиков левой и правой частей.

+

Пример. $2^x = 4 - x$. Строим $y_1 = 2^x$ (возрастает) и $y_2 = 4 - x$ (убывает). Они пересекаются ровно в одной точке (монотонности противоположны).

+

Подбор: $x = 1 \\Rightarrow 2 \\ne 3$, $x = 1{,}4 \\Rightarrow 2{,}64 \\approx 2{,}6$. Корень $x \\approx 1{,}39$ — только приближённый.

+

Вывод: графический метод даёт лишь приблизительный ответ, но позволяет оценить число корней.

`); + + /* === ИНТЕРАКТИВЫ === */ + + /* IV1 — пошаговый решатель */ + html += `
+
ИНТЕРАКТИВ 1
Пошаговый решатель уравнений
+
Выбери задачу ползунком и нажимай «Следующий шаг ▶», чтобы открывать решение по одному шагу. Просмотри все 5 задач — получишь XP.
+
+ +
+
+
+
+ + + +
+
`; + + /* IV2 — калькулятор a^(kx+b) = c */ + html += `
+
ИНТЕРАКТИВ 2
Калькулятор $a^{kx+b} = c$
+
Введи $a$, $k$, $b$, $c$ (целые). Калькулятор решит уравнение через логарифмирование и покажет шаги.
+
+ $a$ = + + $k$ = + + $b$ = + + $c$ = + + +
+
+ Примеры: + + + + +
+
+
+
`; + + /* IV3 — какой метод применить? */ + html += `
+
ИНТЕРАКТИВ 3
Какой метод применить?
+
Определи подходящий метод решения уравнения. 6 заданий.
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
`; + + /* IV4 — тренажёр уравнений */ + html += `
+
ИНТЕРАКТИВ 4
Тренажёр уравнений
+
Реши уравнение и введи корень. Для уравнений с двумя корнями указано «больший» или «меньший». Допуск $\\pm 0{,}05$. 6 задач.
+
Задача 1 / 6Очки: 0 / 6
+
+
+ $x$ = + + + +
+
+
`; + html += secNavFor('p5'); html += readButton('p5'); + box.innerHTML = html; renderMath(box); + + /* === IV1 — пошаговый решатель === */ + (function(){ + const TASKS = [ + { + q: '$2^{x+1} = 16$', + steps: [ + 'Приводим к одному основанию: $16 = 2^4$.', + 'Получаем $2^{x+1} = 2^4$.', + 'Приравниваем показатели: $x + 1 = 4$.', + 'Ответ: $x = 3$.' + ] + }, + { + q: '$\\left(\\dfrac{1}{3}\\right)^{2x-1} = 27$', + steps: [ + 'Приводим к основанию $3$: $\\left(\\dfrac{1}{3}\\right)^{2x-1} = 3^{-(2x-1)} = 3^{1-2x}$, $27 = 3^3$.', + 'Получаем $3^{1-2x} = 3^3$.', + 'Приравниваем показатели: $1 - 2x = 3 \\Rightarrow -2x = 2$.', + 'Ответ: $x = -1$.' + ] + }, + { + q: '$4^x = 32$', + steps: [ + 'Приводим к основанию $2$: $4^x = 2^{2x}$, $32 = 2^5$.', + 'Получаем $2^{2x} = 2^5$.', + 'Приравниваем показатели: $2x = 5$.', + 'Ответ: $x = \\dfrac{5}{2} = 2{,}5$.' + ] + }, + { + q: '$9^x - 4 \\cdot 3^x + 3 = 0$', + steps: [ + 'Замечаем $9^x = (3^2)^x = (3^x)^2$. Делаем замену $t = 3^x$, $t > 0$.', + 'Получаем квадратное: $t^2 - 4t + 3 = 0$.', + 'По теореме Виета: $t_1 = 1$, $t_2 = 3$ — оба положительны.', + 'Обратно: $3^x = 1 \\Rightarrow x = 0$; $\\; 3^x = 3 \\Rightarrow x = 1$.', + 'Ответ: $x_1 = 0,\\; x_2 = 1$.' + ] + }, + { + q: '$5^{x+1} + 5^x = 30$', + steps: [ + 'Выносим $5^x$ за скобку: $5^x \\cdot (5 + 1) = 30$.', + 'Получаем $6 \\cdot 5^x = 30 \\Rightarrow 5^x = 5$.', + 'Приводим: $5^x = 5^1$, значит $x = 1$.', + 'Ответ: $x = 1$.' + ] + } + ]; + const sn = document.getElementById('p5-iv1-sn'); + const nL = document.getElementById('p5-iv1-n'); + const qEl = document.getElementById('p5-iv1-q'); + const stepsEl = document.getElementById('p5-iv1-steps'); + const nextBtn = document.getElementById('p5-iv1-next'); + const allBtn = document.getElementById('p5-iv1-all'); + const resetBtn = document.getElementById('p5-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 '
Шаг '+(i+1)+':'+s+'
'; + }).join(''); + renderMath(qEl); + renderMath(stepsEl); + // отметить просмотр последнего шага + if(shown >= t.steps.length){ + seen.add(cur); + if(!_done && seen.size >= 5){ _done = true; addXp(10, 'p5-iv1'); bumpProgress('p5', 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 — калькулятор a^(kx+b) = c === */ + (function(){ + const aI = document.getElementById('p5-iv2-a'); + const kI = document.getElementById('p5-iv2-k'); + const bI = document.getElementById('p5-iv2-b'); + const cI = document.getElementById('p5-iv2-c'); + const go = document.getElementById('p5-iv2-go'); + const out = document.getElementById('p5-iv2-out'); + const fb = document.getElementById('p5-iv2-fb'); + const used = new Set(); + let _done = false; + + document.querySelectorAll('#p5-iv2 [data-set]').forEach(btn => { + btn.addEventListener('click', () => { + const v = btn.dataset.set.split(','); + aI.value = v[0]; kI.value = v[1]; bI.value = v[2]; cI.value = v[3]; + calc(); + }); + }); + + function fmtFrac(n, d){ + const g = gcd(Math.abs(Math.round(n)), Math.abs(Math.round(d))); + const sign = (n * d < 0) ? '-' : ''; + const nn = Math.abs(Math.round(n)) / g; + const dd = Math.abs(Math.round(d)) / g; + if(dd === 1) return sign + nn; + return sign + '\\dfrac{' + nn + '}{' + dd + '}'; + } + + function calc(){ + const a = parseFloat(aI.value); + const k = parseFloat(kI.value); + const b = parseFloat(bI.value); + const c = parseFloat(cI.value); + if(![a,k,b,c].every(isFinite)){ feedback(fb, false, '✗ Введи все четыре числа.'); return; } + if(a <= 0 || Math.abs(a - 1) < 1e-9){ feedback(fb, false, '✗ Основание $a$ должно быть $> 0$ и $\\ne 1$.'); return; } + if(k === 0){ feedback(fb, false, '✗ При $k = 0$ показатель не зависит от $x$.'); return; } + const eq = '$' + a + '^{' + (k===1?'':k) + 'x' + (b>0?'+'+b:(b<0?b:'')) + '} = ' + c + '$'; + let html = '
Уравнение: '+eq+'
'; + + if(c <= 0){ + html += '
Левая часть $a^{kx+b} > 0$ при любых $x$, а правая $= '+c+' \\le 0$.
'; + html += '
Уравнение не имеет решений.
'; + out.innerHTML = html; + renderMath(out); + feedback(fb, true, '✓ Решено: корней нет.'); + used.add(aI.value+','+kI.value+','+bI.value+','+cI.value); + if(!_done && used.size >= 4){ _done = true; addXp(10, 'p5-iv2'); bumpProgress('p5', 15); } + return; + } + // log_a(c) = ln c / ln a + const logAc = Math.log(c) / Math.log(a); + // целое ли logAc? — проверяем, является ли c степенью a + let intLog = null; + for(let p = -10; p <= 12; p++){ + if(Math.abs(Math.pow(a, p) - c) < 1e-9){ intLog = p; break; } + } + html += '
Приводим к одинаковому основанию или логарифмируем по основанию $'+a+'$:
'; + if(intLog !== null){ + html += '
$'+c+' = '+a+'^{'+intLog+'}$, значит $'+a+'^{'+(k===1?'':k)+'x'+(b>0?'+'+b:(b<0?b:''))+'} = '+a+'^{'+intLog+'}$.
'; + html += '
Приравниваем показатели: $'+(k===1?'':k)+'x'+(b>0?'+'+b:(b<0?b:''))+' = '+intLog+'$.
'; + const xNum = intLog - b; + // x = (intLog - b) / k + const xVal = xNum / k; + let ansTex; + if(Number.isInteger(xVal)){ ansTex = xVal.toString(); } + else { ansTex = fmtFrac(xNum, k); } + html += '
$\\Rightarrow x = '+ansTex+' = '+(+xVal.toFixed(4))+'$
'; + } else { + html += '
$'+(k===1?'':k)+'x'+(b>0?'+'+b:(b<0?b:''))+' = \\log_{'+a+'} '+c+'$.
'; + const xVal = (logAc - b) / k; + html += '
$x = \\dfrac{\\log_{'+a+'} '+c+' - ('+b+')}{'+k+'} \\approx '+(+xVal.toFixed(4))+'$ (приближённо).
'; + html += '
$\\Rightarrow x \\approx '+(+xVal.toFixed(4))+'$
'; + } + out.innerHTML = html; + renderMath(out); + feedback(fb, true, '✓ Решено.'); + used.add(aI.value+','+kI.value+','+bI.value+','+cI.value); + if(!_done && used.size >= 4){ _done = true; addXp(10, 'p5-iv2'); bumpProgress('p5', 15); } + } + go.addEventListener('click', calc); + [aI, kI, bI, cI].forEach(i => i.addEventListener('keydown', e => { if(e.key === 'Enter') calc(); })); + calc(); + })(); + + /* === IV3 — какой метод применить? === */ + (function(){ + const METHODS = ['Одинаковое основание', 'Замена переменной', 'Однородное', 'Графический']; + const Q = [ + { q: '$5^{x-1} = 25$', ans: 0, hint: '$25 = 5^2$ — обе части к одному основанию.' }, + { q: '$4^x - 5 \\cdot 2^x + 4 = 0$', ans: 1, hint: '$4^x = (2^x)^2$ — замена $t = 2^x$.' }, + { q: '$3^x = x + 5$', ans: 3, hint: 'Слева показательная, справа линейная — только графически.' }, + { q: '$2^{x^2 - x} = 1$', ans: 0, hint: '$1 = 2^0$ — степени $2$.' }, + { q: '$3 \\cdot 4^x - 7 \\cdot 6^x + 4 \\cdot 9^x = 0$', ans: 2, hint: '$4 = 2^2$, $9 = 3^2$, $6 = 2 \\cdot 3$ — все слагаемые степени $2x$.' }, + { q: '$25^x + 5 \\cdot 5^x - 6 = 0$', ans: 1, hint: '$25^x = (5^x)^2$ — замена $t = 5^x$.' }, + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p5-iv3-q'); + const oEl = document.getElementById('p5-iv3-opts'); + const fb = document.getElementById('p5-iv3-fb'); + const iEl = document.getElementById('p5-iv3-i'); + const sEl = document.getElementById('p5-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: '+score+' / '+Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p5-iv3'); bumpProgress('p5', 25); } + else if(score >= 4){ addXp(8, 'p5-iv3'); bumpProgress('p5', 15); } + return; + } + iEl.textContent = (i + 1); + sEl.textContent = score; + const item = Q[i]; + qEl.innerHTML = 'Какой метод подходит для уравнения ' + item.q + ' ?'; + oEl.innerHTML = METHODS.map((m, k) => '').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, '✓ Верно! '+item.hint+' Дальше ▶'); } + else feedback(fb, false, '✗ Неверно. Правильно: '+METHODS[item.ans]+'. '+item.hint+' Дальше ▶'); + sEl.textContent = score; + oEl.querySelectorAll('button').forEach(x => x.disabled = true); + i++; + setTimeout(show, 1500); + }); + }); + } + document.getElementById('p5-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* === IV4 — тренажёр уравнений === */ + (function(){ + const Q = [ + { q: '$2^x = 32$', ans: 5, hint: '$32 = 2^5$, поэтому $x = 5$.' }, + { q: '$3^{x-1} = 9$', ans: 3, hint: '$9 = 3^2 \\Rightarrow x - 1 = 2 \\Rightarrow x = 3$.' }, + { q: '$\\left(\\dfrac{1}{2}\\right)^x = 8$', ans: -3, hint: '$\\left(1/2\\right)^x = 2^{-x} = 2^3 \\Rightarrow x = -3$.' }, + { q: '$4^x = 8$', ans: 1.5, hint: '$2^{2x} = 2^3 \\Rightarrow 2x = 3 \\Rightarrow x = 1{,}5$.' }, + { q: '$9^x - 4 \\cdot 3^x + 3 = 0$ — введи больший корень', ans: 1, hint: 'Замена $t = 3^x$: $t = 1, t = 3$. Корни $x = 0$ и $x = 1$.' }, + { q: '$25^x - 6 \\cdot 5^x + 5 = 0$ — введи меньший корень', ans: 0, hint: 'Замена $t = 5^x$: $t = 1, t = 5$. Корни $x = 0$ и $x = 1$.' }, + ]; + let i = 0, score = 0; + function show(){ + const qEl = document.getElementById('p5-iv4-q'); + const iEl = document.getElementById('p5-iv4-i'); + const sEl = document.getElementById('p5-iv4-s'); + const fb = document.getElementById('p5-iv4-fb'); + const ansI = document.getElementById('p5-iv4-ans'); + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: '+score+' / '+Q.length; + if(score === Q.length){ addXp(15, 'p5-iv4'); bumpProgress('p5', 25); } + else if(score >= 4){ addXp(8, 'p5-iv4'); bumpProgress('p5', 15); } + return; + } + iEl.textContent = (i + 1); + sEl.textContent = score; + qEl.innerHTML = Q[i].q; + ansI.value = ''; + renderMath(qEl); + fb.style.display = 'none'; + } + function go(){ + if(i >= Q.length) return; + const fb = document.getElementById('p5-iv4-fb'); + const raw = document.getElementById('p5-iv4-ans').value.replace(',', '.'); + const ans = parseFloat(raw); + if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; } + if(Math.abs(ans - Q[i].ans) < 0.05){ + score++; + feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); + } else { + feedback(fb, false, '✗ Неверно. Ответ: $x = '+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶'); + } + document.getElementById('p5-iv4-s').textContent = score; + i++; + setTimeout(show, 1500); + } + document.getElementById('p5-iv4-go').addEventListener('click', go); + document.getElementById('p5-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); }); + document.getElementById('p5-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + wireReadBtn('p5'); }