feat(alg11 ch2 wave2): §5 «Показательные уравнения» (4 метода решения)
This commit is contained in:
@@ -1043,15 +1043,416 @@ function buildP4(){
|
||||
function buildP5(){
|
||||
const box = document.getElementById('p5-body');
|
||||
let html = '';
|
||||
html += makeCard('theory', 'В разработке', '5.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">Ключевая формула: $a^{f(x)} = a^{g(x)}$</p>
|
||||
`);
|
||||
|
||||
/* === ТЕОРИЯ === */
|
||||
|
||||
html += makeCard('theory', 'Метод приведения к одному основанию', '5.1', `
|
||||
<p><b>Показательным уравнением</b> называется уравнение, в котором переменная содержится в показателе степени.</p>
|
||||
<p>Простейший вид: $a^{f(x)} = a^{g(x)}$, где $a > 0$, $a \\ne 1$.</p>
|
||||
<p>Поскольку показательная функция $y = a^x$ <b>инъективна</b> (взаимно однозначна — каждое значение принимает ровно один раз), из равенства степеней с одинаковым основанием следует равенство показателей:</p>
|
||||
<p style="text-align:center;padding:10px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">
|
||||
$a^{f(x)} = a^{g(x)} \\;\\Leftrightarrow\\; f(x) = g(x)$ (при $a > 0$, $a \\ne 1$).
|
||||
</p>
|
||||
<p><b>Алгоритм решения</b>:</p>
|
||||
<ol style="margin:8px 0 8px 22px;line-height:1.75">
|
||||
<li>Привести обе части к степени с <b>одинаковым основанием</b>.</li>
|
||||
<li>Приравнять показатели: $f(x) = g(x)$.</li>
|
||||
<li>Решить полученное уравнение и записать корни.</li>
|
||||
</ol>
|
||||
<p><b>Пример.</b> $\\left(\\dfrac{1}{2}\\right)^{x-1} = 8$.</p>
|
||||
<p>Приводим к основанию $2$: $\\left(\\dfrac{1}{2}\\right)^{x-1} = 2^{-(x-1)} = 2^{1-x}$, а $8 = 2^3$.</p>
|
||||
<p>Получаем $2^{1-x} = 2^3 \\Rightarrow 1 - x = 3 \\Rightarrow x = -2$.</p>
|
||||
<p><b>Ответ:</b> $x = -2$.</p>`);
|
||||
|
||||
html += makeCard('rule', 'Метод замены переменной', '5.2', `
|
||||
<p>Уравнения вида $A \\cdot a^{2x} + B \\cdot a^x + C = 0$ сводятся к квадратному заменой $t = a^x$.</p>
|
||||
<p><b>Важное условие:</b> $t = a^x > 0$ при любых $x$. Значит, после нахождения корней $t_1, t_2$ нужно <b>отбросить</b> неположительные значения.</p>
|
||||
<p style="text-align:center;padding:10px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">
|
||||
$A \\cdot a^{2x} + B \\cdot a^x + C = 0 \\;\\xrightarrow{\\;t = a^x > 0\\;}\\; A t^2 + B t + C = 0$
|
||||
</p>
|
||||
<p><b>Алгоритм</b>:</p>
|
||||
<ol style="margin:8px 0 8px 22px;line-height:1.75">
|
||||
<li>Заметить структуру: степени образуют пары $a^{2x} = (a^x)^2$.</li>
|
||||
<li>Ввести замену $t = a^x$, $t > 0$.</li>
|
||||
<li>Решить квадратное уравнение, проверить условие $t > 0$.</li>
|
||||
<li>Для каждого подходящего $t$ найти $x$ из $a^x = t$, т.е. $x = \\log_a t$.</li>
|
||||
</ol>
|
||||
<p><b>Пример.</b> $9^x - 4 \\cdot 3^x + 3 = 0$.</p>
|
||||
<p>Замечаем: $9^x = (3^2)^x = (3^x)^2$. Замена $t = 3^x$, $t > 0$.</p>
|
||||
<p>$t^2 - 4t + 3 = 0 \\Rightarrow t = 1$ или $t = 3$ (оба положительны).</p>
|
||||
<p>$3^x = 1 \\Rightarrow x = 0$; $3^x = 3 \\Rightarrow x = 1$.</p>
|
||||
<p><b>Ответ:</b> $x_1 = 0,\\; x_2 = 1$.</p>`);
|
||||
|
||||
html += makeCard('example', 'Однородные уравнения и графический метод', '5.3', `
|
||||
<p><b>Однородное уравнение</b> второй степени относительно $a^x$ и $b^x$ имеет вид</p>
|
||||
<p style="text-align:center;padding:10px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">
|
||||
$A \\cdot a^{2x} + B \\cdot (ab)^x + C \\cdot b^{2x} = 0$.
|
||||
</p>
|
||||
<p>Все слагаемые имеют «суммарную степень» $2x$. Делим обе части на $b^{2x}$ (это $> 0$, так что эквивалентность сохраняется):</p>
|
||||
<p>$A \\cdot \\left(\\dfrac{a}{b}\\right)^{2x} + B \\cdot \\left(\\dfrac{a}{b}\\right)^x + C = 0$.</p>
|
||||
<p>Замена $t = (a/b)^x$, $t > 0$ — снова получаем квадратное уравнение.</p>
|
||||
<p><b>Пример.</b> $3 \\cdot 4^x - 7 \\cdot 6^x + 4 \\cdot 9^x = 0$.</p>
|
||||
<p>Делим на $9^x$: $3 \\cdot (4/9)^x - 7 \\cdot (6/9)^x + 4 = 0$, то есть $3 (2/3)^{2x} - 7 (2/3)^x + 4 = 0$.</p>
|
||||
<p>Замена $t = (2/3)^x$: $3t^2 - 7t + 4 = 0 \\Rightarrow t = 1$ или $t = 4/3$.</p>
|
||||
<p>$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$).</p>
|
||||
<hr style="margin:14px 0;border:none;border-top:1px solid var(--border)">
|
||||
<p><b>Графический метод</b> применяется, когда не удаётся привести к одному основанию и не подходит замена. Решения — <b>абсциссы точек пересечения</b> графиков левой и правой частей.</p>
|
||||
<p><b>Пример.</b> $2^x = 4 - x$. Строим $y_1 = 2^x$ (возрастает) и $y_2 = 4 - x$ (убывает). Они пересекаются ровно в одной точке (монотонности противоположны).</p>
|
||||
<p>Подбор: $x = 1 \\Rightarrow 2 \\ne 3$, $x = 1{,}4 \\Rightarrow 2{,}64 \\approx 2{,}6$. Корень $x \\approx 1{,}39$ — только приближённый.</p>
|
||||
<p><b>Вывод:</b> графический метод даёт лишь приблизительный ответ, но позволяет оценить число корней.</p>`);
|
||||
|
||||
/* === ИНТЕРАКТИВЫ === */
|
||||
|
||||
/* IV1 — пошаговый решатель */
|
||||
html += `<div class="wg" id="p5-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="p5-iv1-n">1</b> / 5<input type="range" id="p5-iv1-sn" min="1" max="5" step="1" value="1"></label>
|
||||
</div>
|
||||
<div id="p5-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="p5-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="p5-iv1-next">Следующий шаг ▶</button>
|
||||
<button class="btn" id="p5-iv1-all">Показать все шаги</button>
|
||||
<button class="btn" id="p5-iv1-reset">Скрыть шаги</button>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
/* IV2 — калькулятор a^(kx+b) = c */
|
||||
html += `<div class="wg" id="p5-iv2">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор $a^{kx+b} = c$</div></div>
|
||||
<div class="wg-help">Введи $a$, $k$, $b$, $c$ (целые). Калькулятор решит уравнение через логарифмирование и покажет шаги.</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="p5-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="p5-iv2-k" class="tinp" style="width:70px;text-align:center" value="1" step="1">
|
||||
<span style="font-family:'JetBrains Mono',monospace">$b$ =</span>
|
||||
<input type="number" id="p5-iv2-b" class="tinp" style="width:70px;text-align:center" value="1" step="1">
|
||||
<span style="font-family:'JetBrains Mono',monospace">$c$ =</span>
|
||||
<input type="number" id="p5-iv2-c" class="tinp" style="width:70px;text-align:center" value="16" step="1">
|
||||
<button class="btn primary" id="p5-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,1,16" style="padding:4px 10px;font-size:.82rem">$2^{x+1}=16$</button>
|
||||
<button class="btn" data-set="3,2,-1,27" style="padding:4px 10px;font-size:.82rem">$3^{2x-1}=27$</button>
|
||||
<button class="btn" data-set="5,1,0,3" style="padding:4px 10px;font-size:.82rem">$5^x=3$</button>
|
||||
<button class="btn" data-set="2,1,0,-4" style="padding:4px 10px;font-size:.82rem">$2^x=-4$</button>
|
||||
</div>
|
||||
<div id="p5-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="p5-iv2-fb"></div>
|
||||
</div>`;
|
||||
|
||||
/* IV3 — какой метод применить? */
|
||||
html += `<div class="wg" id="p5-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="p5-iv3-i">1</b> / 6</span><span>Очки: <b id="p5-iv3-s">0</b> / 6</span></div>
|
||||
<div id="p5-iv3-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 id="p5-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:520px;margin:0 auto"></div>
|
||||
<div class="feedback" id="p5-iv3-fb"></div>
|
||||
<div class="actions" style="justify-content:center"><button class="btn" id="p5-iv3-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
/* IV4 — тренажёр уравнений */
|
||||
html += `<div class="wg" id="p5-iv4">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр уравнений</div></div>
|
||||
<div class="wg-help">Реши уравнение и введи корень. Для уравнений с двумя корнями указано «больший» или «меньший». Допуск $\\pm 0{,}05$. 6 задач.</div>
|
||||
<div class="score-display"><span>Задача <b id="p5-iv4-i">1</b> / 6</span><span>Очки: <b id="p5-iv4-s">0</b> / 6</span></div>
|
||||
<div id="p5-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">$x$ =</span>
|
||||
<input type="number" id="p5-iv4-ans" class="tinp" style="width:120px;text-align:center" step="0.01">
|
||||
<button class="btn primary" id="p5-iv4-go">Проверить</button>
|
||||
<button class="btn" id="p5-iv4-start">Заново</button>
|
||||
</div>
|
||||
<div class="feedback" id="p5-iv4-fb"></div>
|
||||
</div>`;
|
||||
|
||||
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$.',
|
||||
'<b>Ответ:</b> $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$.',
|
||||
'<b>Ответ:</b> $x = -1$.'
|
||||
]
|
||||
},
|
||||
{
|
||||
q: '$4^x = 32$',
|
||||
steps: [
|
||||
'Приводим к основанию $2$: $4^x = 2^{2x}$, $32 = 2^5$.',
|
||||
'Получаем $2^{2x} = 2^5$.',
|
||||
'Приравниваем показатели: $2x = 5$.',
|
||||
'<b>Ответ:</b> $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$.',
|
||||
'<b>Ответ:</b> $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$.',
|
||||
'<b>Ответ:</b> $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 '<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, '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 = '<div style="font-size:1.04rem;margin-bottom:8px;text-align:center">Уравнение: '+eq+'</div>';
|
||||
|
||||
if(c <= 0){
|
||||
html += '<div style="color:#b91c1c;font-weight:700">Левая часть $a^{kx+b} > 0$ при любых $x$, а правая $= '+c+' \\le 0$.</div>';
|
||||
html += '<div style="margin-top:6px;color:#b91c1c;font-weight:700">Уравнение <b>не имеет решений</b>.</div>';
|
||||
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 += '<div style="margin-bottom:6px">Приводим к одинаковому основанию или логарифмируем по основанию $'+a+'$:</div>';
|
||||
if(intLog !== null){
|
||||
html += '<div style="margin-bottom:6px">$'+c+' = '+a+'^{'+intLog+'}$, значит $'+a+'^{'+(k===1?'':k)+'x'+(b>0?'+'+b:(b<0?b:''))+'} = '+a+'^{'+intLog+'}$.</div>';
|
||||
html += '<div style="margin-bottom:6px">Приравниваем показатели: $'+(k===1?'':k)+'x'+(b>0?'+'+b:(b<0?b:''))+' = '+intLog+'$.</div>';
|
||||
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 += '<div style="font-weight:700;color:#15803d">$\\Rightarrow x = '+ansTex+' = '+(+xVal.toFixed(4))+'$</div>';
|
||||
} else {
|
||||
html += '<div style="margin-bottom:6px">$'+(k===1?'':k)+'x'+(b>0?'+'+b:(b<0?b:''))+' = \\log_{'+a+'} '+c+'$.</div>';
|
||||
const xVal = (logAc - b) / k;
|
||||
html += '<div style="margin-bottom:6px">$x = \\dfrac{\\log_{'+a+'} '+c+' - ('+b+')}{'+k+'} \\approx '+(+xVal.toFixed(4))+'$ (приближённо).</div>';
|
||||
html += '<div style="font-weight:700;color:#1d4ed8">$\\Rightarrow x \\approx '+(+xVal.toFixed(4))+'$</div>';
|
||||
}
|
||||
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 = '<b>Готово!</b> Результат: '+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) => '<button class="btn primary" data-k="'+k+'">'+m+'</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, '✓ Верно! '+item.hint+' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Неверно. Правильно: <b>'+METHODS[item.ans]+'</b>. '+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$ — введи <b>больший</b> корень', ans: 1, hint: 'Замена $t = 3^x$: $t = 1, t = 3$. Корни $x = 0$ и $x = 1$.' },
|
||||
{ q: '$25^x - 6 \\cdot 5^x + 5 = 0$ — введи <b>меньший</b> корень', 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 = '<b>Готово!</b> Результат: '+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');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user