No LaTeX/markdown anywhere students read (seed, import, DB migration 0021, tutor history, frontend guard); quiz of an island is fixed per user again

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 12:15:28 +03:30
parent dd10ff83f4
commit e662914efc
11 changed files with 855 additions and 670 deletions

View File

@@ -0,0 +1,107 @@
"""
LaTeX و نشانه‌گذاریِ خام (`^(−۴)`، `**…**`، `\\vec`) را از همه‌ی متن‌هایی که دانش‌آموز می‌بیند پاک می‌کند:
سوال‌ها و گزینه‌ها، متنِ درس‌ها و گفتگوهای دستیار. فایل‌های seed همین تبدیل را دارند؛ بدونِ این migration
`seed_content` سوالِ تمیز را «تازه» می‌دید (صورتش با دیتابیس فرق دارد) و کنارِ نسخه‌ی قدیمی دوباره می‌ساخت.
تبدیل `content/plain_math.py::convert` است (idempotent). معکوس ندارد. پاسخِ دستیار با
`rag.services.mathtext.to_plain` (همان مسیرِ زنده‌ی پاسخ‌ها).
"""
import hashlib
from django.db import migrations
from content.plain_math import convert, convert_figures
def _h(text):
return hashlib.sha1((text or '').encode('utf-8')).hexdigest()
def _key(*parts):
return hashlib.sha1('\x1f'.join(('intro', *map(str, parts))).encode('utf-8')).hexdigest()
def forwards(apps, schema_editor):
Question = apps.get_model('content', 'Question')
Choice = apps.get_model('content', 'Choice')
Lesson = apps.get_model('content', 'Lesson')
SeedRecord = apps.get_model('content', 'SeedRecord')
batch = []
for q in Question.objects.all().iterator(chunk_size=1000):
new = convert(q.prompt)
if new != q.prompt:
q.prompt = new
batch.append(q)
if len(batch) >= 500:
Question.objects.bulk_update(batch, ['prompt'])
batch = []
if batch:
Question.objects.bulk_update(batch, ['prompt'])
batch = []
for c in Choice.objects.all().iterator(chunk_size=2000):
new = convert(c.value)
if new != c.value:
c.value = new
batch.append(c)
if len(batch) >= 500:
Choice.objects.bulk_update(batch, ['value'])
batch = []
if batch:
Choice.objects.bulk_update(batch, ['value'])
# بعد از تبدیل ممکن است دو سوالِ هم‌صورت در یک درس بماند: نسخه‌ی قدیمیِ LaTeXدار و نسخه‌ای که seed
# پیش از این migration با متنِ تمیز ساخته بود. یکی نگه داشته می‌شود: آن‌که پاسخِ بیشتری دارد، وگرنه قدیمی‌تر.
from django.db.models import Count
UserAnswer = apps.get_model('content', 'UserAnswer')
groups = {}
for qid, lid, prompt in Question.objects.values_list('id', 'lesson_id', 'prompt').iterator(chunk_size=2000):
groups.setdefault((lid, prompt), []).append(qid)
drop = []
for ids in groups.values():
if len(ids) > 1:
answered = dict(UserAnswer.objects.filter(question_id__in=ids).values_list('question_id').annotate(n=Count('id')))
keep = max(ids, key=lambda i: (answered.get(i, 0), -i))
drop.extend(i for i in ids if i != keep)
if drop:
Question.objects.filter(id__in=drop).delete()
for lesson in Lesson.objects.select_related('node__unit__grade').iterator(chunk_size=500):
new = {
'title': convert(lesson.title),
'intro_text': convert(lesson.intro_text),
'example': convert(lesson.example),
'steps': [convert(s) for s in (lesson.steps or [])],
'figures': convert_figures(lesson.figures or []),
}
changed = [f for f, v in new.items() if v != getattr(lesson, f)]
if not changed:
continue
old_intro, old_title = lesson.intro_text, lesson.title
for f in changed:
setattr(lesson, f, new[f])
lesson.save(update_fields=changed)
if 'intro_text' in changed:
n = lesson.node
key = _key(n.unit.grade.title, n.unit.title, n.title, old_title)
SeedRecord.objects.filter(key=key, value=_h(old_intro)).update(value=_h(new['intro_text']))
try:
Message = apps.get_model('ai_tutor', 'Message')
except LookupError:
return
from rag.services.mathtext import to_plain
batch = []
for m in Message.objects.all().iterator(chunk_size=500):
new = to_plain(m.text) if m.role == 'assistant' else convert(m.text)
if new != m.text:
m.text = new
batch.append(m)
if batch:
Message.objects.bulk_update(batch, ['text'])
class Migration(migrations.Migration):
dependencies = [('content', '0020_plain_math_lesson_texts'), ('ai_tutor', '0008_alter_message_created_at')]
operations = [migrations.RunPython(forwards, migrations.RunPython.noop)]

View File

@@ -11,15 +11,24 @@ LaTeX → متنِ ساده‌ی یونیکد، برای متنِ درس‌ها
import re
_SUP = {**{str(i): c for i, c in enumerate('⁰¹²³⁴⁵⁶⁷⁸⁹')}, **{'۰۱۲۳۴۵۶۷۸۹'[i]: c for i, c in enumerate('⁰¹²³⁴⁵⁶⁷⁸⁹')}, '+': '⁺', '-': '⁻', '−': '⁻', '=': '⁼',
'(': '⁽', ')': '⁾', 'n': 'ⁿ', 'i': 'ⁱ', 'x': 'ˣ', 'y': 'ʸ', 'k': 'ᵏ', 'm': 'ᵐ', 'p': 'ᵖ', 't': 'ᵗ'}
'(': '⁽', ')': '⁾', **dict(zip('abcdefghijklmnoprstuvwxyzαβγδεθφχ', 'ᵃᵇᶜᵈᵉᶠᵍʰⁱʲᵏˡᵐⁿᵒᵖʳˢᵗᵘᵛʷˣʸᶻᵅᵝᵞᵟᵋᶿᵠᵡ'))}
_SUB = {**{str(i): c for i, c in enumerate('₀₁₂₃₄₅₆₇₈₉')}, **{'۰۱۲۳۴۵۶۷۸۹'[i]: c for i, c in enumerate('₀₁₂₃₄₅₆₇₈₉')}, '+': '₊', '-': '₋', '−': '₋', '=': '₌',
'(': '₍', ')': '₎', 'n': 'ₙ', 'i': 'ᵢ', 'x': 'ₓ', 'k': 'ₖ', 'm': 'ₘ', 'p': 'ₚ', 't': 'ₜ'}
'(': '₍', ')': '₎', **dict(zip('aehijklmnoprstuvx', 'ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓ'))}
_SYMBOLS = {
'times': '×', 'cdot': '·', 'div': '÷', 'pm': '±', 'theta': 'θ', 'pi': 'π', 'alpha': 'α', 'beta': 'β',
'infty': '∞', 'neq': '≠', 'ne': '≠', 'leq': '≤', 'le': '≤', 'geq': '≥', 'ge': '≥', 'to': '→',
'rightarrow': '→', 'Rightarrow': '⇒', 'perp': '⊥', 'parallel': '∥', 'circ': '°', 'ldots': '…', 'dots': '…',
'lim': 'lim', 'sin': 'sin', 'cos': 'cos', 'tan': 'tan', 'log': 'log', 'ln': 'ln',
'int': '∫', 'sum': 'Σ', 'prod': '∏', 'partial': '∂', 'in': '∈', 'notin': '∉', 'subset': '⊂', 'subseteq': '⊆',
'supset': '⊃', 'cup': '∪', 'cap': '∩', 'emptyset': '∅', 'varnothing': '∅', 'forall': '∀', 'exists': '∃',
'angle': '∠', 'triangle': '△', 'approx': '≈', 'equiv': '≡', 'sim': '∼', 'cong': '≅', 'mid': '|', 'vert': '|',
'Delta': 'Δ', 'delta': 'δ', 'gamma': 'γ', 'lambda': 'λ', 'mu': 'μ', 'sigma': 'σ', 'Sigma': 'Σ', 'phi': 'φ',
'varphi': 'φ', 'omega': 'ω', 'epsilon': 'ε', 'varepsilon': 'ε', 'rho': 'ρ', 'tau': 'τ', 'Leftrightarrow': '⇔',
'iff': '⇔', 'implies': '⇒', 'leftarrow': '←', 'cdots': '⋯', 'therefore': '∴', 'setminus': '−', 'neg': '¬',
'quad': ' ', 'qquad': ' ', 'max': 'max', 'min': 'min', 'cot': 'cot', 'sec': 'sec', 'csc': 'csc',
'arcsin': 'arcsin', 'arccos': 'arccos', 'arctan': 'arctan', 'exp': 'exp', 'det': 'det', 'gcd': 'gcd',
'degree': '°', 'prime': '′',
}
_BLACKBOARD = {'R': 'ℝ', 'Q': 'ℚ', 'N': 'ℕ', 'Z': 'ℤ', 'C': 'ℂ'}
@@ -30,6 +39,11 @@ def _script(body: str, table: dict, marker: str) -> str:
body = body.strip()
if body and all(ch in table for ch in body):
return ''.join(table[ch] for ch in body)
if marker == '^':
# توانِ پیچیده (a^(γ−۲)، a^(۱/n)): نویسه‌ی بالانویس ندارد؛ به‌جای «^» می‌نویسیم «به توانِ».
return f' به توانِ ({body}) '
if marker == '_' and len(body) <= 4 and re.fullmatch(r'[\w۰-۹]+', body):
return body # اندیسِ بی‌نویسه‌ی زیرنویس (m_AB، x_A): بدونِ «_»، همان حروف می‌چسبند
return f'{marker}({body})'
@@ -47,33 +61,57 @@ def _wrap(s: str) -> str:
return s if _atomic(s) else f'({s})'
def _strip_markdown(s: str) -> str:
s = re.sub(r'\*\*(.+?)\*\*', r'\1', s, flags=re.S)
s = re.sub(r'(?<![_\w])__(.+?)__(?![_\w])', r'\1', s)
s = s.replace('`', '')
return re.sub(r'^\s{0,3}#{1,6}\s+', '', s, flags=re.M)
def convert(text: str) -> str:
if not isinstance(text, str) or not re.search(r'[\\^]|[A-Za-z]_', text):
if not isinstance(text, str) or not re.search(r'[\\^$ÂÊ]|[A-Za-z]_|\*\*|__|`|^#{1,6}\s', text, re.M):
return text
s = text
if re.search('[ÂÊ]', s):
# «ÂÊB» و «Â1»: زاویه‌ی کلاه‌دار که فونتِ گوشی درست نشان نمی‌دهد → ∠AEB و ∠A₁
s = re.sub(r'([A-Z]?)Â([A-Z]?)Ê([A-Z])', lambda m: '∠' + m[1] + 'A' + m[2] + 'E' + m[3], s)
s = re.sub(r'([A-Z])Ê([A-Z])', r'∠\1E\2', s)
s = re.sub(r'Â([0-9])', lambda m: '∠A' + '₀₁₂₃₄₅₆₇₈₉'[int(m[1])], s)
s = re.sub(r'\$\$(.+?)\$\$', r'\1', s, flags=re.S)
s = re.sub(r'(?<![\w$])\$([^$\n]+?)\$(?![\w$])', r'\1', s)
s = re.sub(r'\\[(\[]\s*|\s*\\[)\]]', '', s) # \( \) \[ \] با فاصله‌ی داخلشان
for _ in range(4): # آکولادِ تودرتو، از داخل به بیرون
s = re.sub(r'\\vec' + _GROUP, r'\1', s)
s = re.sub(r'\\(?:overrightarrow|overline|bar|hat)' + _GROUP, r'\1', s)
s = re.sub(r'\\mathbb' + _GROUP, lambda m: _BLACKBOARD.get(m[1], m[1]), s)
s = re.sub(r'\\(?:text|mathrm|operatorname)' + _GROUP, r'\1', s)
s = re.sub(r'\\frac' + _GROUP + _GROUP, lambda m: f'{_wrap(m[1])}/{_wrap(m[2])}', s)
s = re.sub(r'\\[dt]?frac' + _GROUP + _GROUP, lambda m: f'{_wrap(m[1])}/{_wrap(m[2])}', s)
s = re.sub(r'\\sqrt' + _GROUP, lambda m: '√' + _wrap(m[1]), s)
s = re.sub(r'\\lim\s*_' + _GROUP, r'lim(\1)', s) # lim_{x→0} پایینِ حد است، نه زیرنویس
s = re.sub(r'\\(left|right)\s*', '', s)
s = s.replace('\\|', '|').replace('\\{', '{').replace('\\}', '}').replace('\\,', ' ').replace('\\ ', ' ')
s = re.sub(r'\\([A-Za-z]+)', lambda m: _SYMBOLS.get(m[1], m[0]), s)
# بلندترین نامِ شناخته‌شده؛ \cdot که بعد از باز شدنِ \vec{b} به «\cdotb» رسیده هم درست خوانده می‌شود.
s = re.sub(r'\\(' + '|'.join(sorted(map(re.escape, _SYMBOLS), key=len, reverse=True)) + r')', lambda m: _SYMBOLS[m[1]], s)
s = re.sub(r'\^' + _GROUP, lambda m: _script(m[1], _SUP, '^'), s)
s = re.sub(r'_' + _GROUP, lambda m: _script(m[1], _SUB, '_'), s)
# شکل‌های بی‌آکولاد که کتاب‌ها و مدل‌ها نوشته‌اند: a^2، a^n، a^(m-n)، x_1. هر چه نویسه‌ی
# بالانویس/زیرنویس ندارد (a^b، D_f) همان‌طور می‌ماند. «___» (جای خالی) دست نمی‌خورد.
s = re.sub(r'\^\(([^()]*)\)', lambda m: _try(m[1], _SUP) or m[0], s)
s = re.sub(r'\^([+\-−]?[0-9۰-۹]+|[nixykmpt])(?![A-Za-z0-9۰-۹])', lambda m: _try(m[1], _SUP) or m[0], s)
s = re.sub(r'(?<=[A-Za-z\)])_([0-9۰-۹]+|[nikmpt])(?![A-Za-z0-9۰-۹])', lambda m: _try(m[1], _SUB) or m[0], s)
s = re.sub(r'\^\(((?:[^()]|\([^()]*\))*)\)', lambda m: _try(m[1], _SUP) or f' به توانِ ({m[1].strip()}) ', s)
s = re.sub(r'(?<=[A-Za-z0-9۰-۹\)₀-₉ₐ-ₜᵢⱼ])\^([A-Za-zα-ωΑ-Ω□▢])(?![A-Za-z0-9۰-۹])', lambda m: _try(m[1], _SUP) or f' به توانِ {m[1]} ', s)
s = re.sub(r'\^([+\-−]?[0-9۰-۹]+)', lambda m: _try(m[1], _SUP) or m[0], s)
s = s = re.sub(r'(?<=[A-Za-z\)∫Σ∏])_([0-9۰-۹]+|[A-Za-z]{1,4}[0-9۰-۹]?)', lambda m: ''.join(_SUB.get(ch, ch) for ch in m[1]), s)
s = re.sub(r'log_([A-Za-z])(?![A-Za-z0-9])', lambda m: m[0] if m[1] in _SUB else f'log پایه‌ی {m[1]}', s)
s = re.sub(r'(?<=\S) {2,}(?=\S)', ' ', s)
s = re.sub(r'(?<=[A-Za-z])_\(([^()]*)\)', r'(\1)', s)
s = re.sub(r'\^([+\-−])', lambda m: _SUP[m[1]], s)
s = re.sub(r"(?<=[A-Za-z)'])_([+\-−])", lambda m: _SUB[m[1]], s)
s = re.sub(r'\^(√[0-9۰-۹A-Za-z]+)', r' به توانِ \1 ', s)
s = re.sub(r'\^([A-Za-z]{2,3})(?![A-Za-z0-9])', r' به توانِ \1 ', s)
s = _strip_markdown(s)
return s
_LEFTOVER = re.compile(r'\\[A-Za-z]+|\\[()\[\]]|\$|[_^]\{')
_LEFTOVER = re.compile(r'\\[A-Za-z]+|\\[()\[\]]|\$|[_^]\{|\^[0-9۰-۹(a-z−+-]|\*\*|(?<![_\s])__|`|^#{1,6}\s', re.M)
def leftover(text: str) -> list[str]:

View File

@@ -26,6 +26,8 @@ from django.db import transaction
from rag.services import diagram as diagram_spec
from .plain_math import convert as plain
from .models import Choice, Lesson, Question
VALID_TYPES = {value for value, _ in Question.TYPE_CHOICES}
@@ -44,7 +46,8 @@ def _validate_row(row, index: int) -> dict:
if not isinstance(lesson_id, int):
raise ImportError_(f'{where}: lessonId باید عدد باشد.')
prompt = (row.get('prompt') or '').strip()
# LaTeX/markdown هرگز وارد دیتابیس نمی‌شود (فرانت رندر نمی‌کند): تبدیل در همان ورودی.
prompt = plain((row.get('prompt') or '').strip())
if not prompt:
raise ImportError_(f'{where}: prompt خالی است.')
@@ -55,7 +58,7 @@ def _validate_row(row, index: int) -> dict:
choices = row.get('choices')
if not isinstance(choices, list) or len(choices) < 2:
raise ImportError_(f'{where}: حداقل دو گزینه لازم است.')
choices = [str(c).strip() for c in choices]
choices = [plain(str(c).strip()) for c in choices]
if any(not c for c in choices):
raise ImportError_(f'{where}: گزینه‌ی خالی دارد.')
if len(set(choices)) != len(choices):

View File

@@ -78817,10 +78817,10 @@
},
{
"title": "توان یک عدد توان‌دار",
"introText": "برای محاسبه توان یک عدد توان‌دار، توان‌ها را در هم ضرب کنید و پایه را ثابت نگه دارید. فرمول کلی: (aᵐ)ⁿ = a^(m×n)",
"introText": "برای محاسبه توان یک عدد توان‌دار، توان‌ها را در هم ضرب کنید و پایه را ثابت نگه دارید. فرمول کلی: (aᵐ)ⁿ = a به توانِ (m×n) ",
"example": "حاصل (۲²)³؟",
"steps": [
"۲^(۲×۳) = ۲⁶.",
"۲ به توانِ (۲×۳) = ۲⁶.",
"✅ جواب: ۶۴"
]
}
@@ -79187,7 +79187,7 @@
{
"title": "محاسبه توان‌های کسری",
"introText": "۱. توان کسری را به صورت صورت و مخرج شناسایی کنید. ۲. عدد پایه را به توان صورت برسانید. ۳. ریشه مخرج را از عدد به دست آمده بگیرید. ۴. نتیجه نهایی را بنویسید.",
"example": "۴^(۱/۲) را حساب کنید.",
"example": "۴ به توانِ (۱/۲) را حساب کنید.",
"steps": [
"توان ۱/۲ یعنی جذر.",
"✅ جواب: ۲"
@@ -91845,7 +91845,7 @@
"introText": "برای نوشتن عدد به صورت توان‌دار، ابتدا عدد را به عوامل اول تجزیه کرده و سپس به صورت توان‌دار بنویسید.",
"example": "عبارت [(1/2)³]⁴ را به صورت توان ساده بنویسید.",
"steps": [
"طبق قانون (aᵐ)ⁿ = a^(m×n)، داریم:",
"طبق قانون (aᵐ)ⁿ = a به توانِ (m×n) ، داریم:",
"[(1/2)³]⁴ = (1/2)⁽3×4) = (1/2)¹²",
"✅ جواب: (1/2)¹²"
]
@@ -92060,7 +92060,7 @@
},
{
"title": "نوشتن به صورت عددی توان‌دار",
"introText": "برای نوشتن یک عبارت به صورت عددی توان‌دار، ابتدا پایه و توان را مشخص کرده و سپس به صورت a^b نوشته می‌شود.",
"introText": "برای نوشتن یک عبارت به صورت عددی توان‌دار، ابتدا پایه و توان را مشخص کرده و سپس به صورت aᵇ نوشته می‌شود.",
"example": "۲⁶ ÷ ۲² را به صورت یک توان بنویسید.",
"steps": [
"۶ − ۲ = ۴.",
@@ -92108,13 +92108,13 @@
{
"title": "محاسبه عبارات توان‌دار",
"introText": "برای محاسبه عبارات توان‌دار، ابتدا پایه و توان را مشخص کرده و سپس محاسبه می‌کنیم.",
"example": "پر کردن جای خالی در عبارت (2¹⁵)/(2³)^(square) = 1",
"example": "پر کردن جای خالی در عبارت (2¹⁵)/(2³) به توانِ (square) = 1",
"steps": [
"ابتدا توان مخرج را بازنویسی می‌کنیم:",
"(2³)^(square) = 2^(3× square)",
"عبارت به صورت (2¹⁵)/(2^(3× square)) = 1 است.",
"(2³) به توانِ (square) = 2 به توانِ (3× square) ",
"عبارت به صورت (2¹⁵)/(2 به توانِ (3× square) ) = 1 است.",
"طبق قانون تقسیم توان‌ها:",
"2^(15 - 3× square) = 1",
"2 به توانِ (15 - 3× square) = 1",
"چون 1 = 2⁰ است، پس: 15 - 3× square = 0 3× square = 15 square = 5",
"✅ جواب: ۵"
]
@@ -92656,7 +92656,7 @@
},
{
"title": "محاسبه حاصل ضرب توان‌ها",
"introText": "۱. قانون ضرب توان‌ها را اعمال کنید: (aˣ) × (bʸ) = (a × b)^(x + y).\n۲. حاصل ضرب را محاسبه کنید.",
"introText": "۱. قانون ضرب توان‌ها را اعمال کنید: (aˣ) × (bʸ) = (a × b) به توانِ (x + y) .\n۲. حاصل ضرب را محاسبه کنید.",
"example": "حاصل ۲³ × ۲² × ۲؟",
"steps": [
"۳ + ۲ + ۱ = ۶.",
@@ -109138,7 +109138,7 @@
"lessons": [
{
"title": "درج واسطه هندسی",
"introText": "۱. تعیین نسبت مشترک (r) با استفاده از فرمول r = (آخرین جمله / اولین جمله)^(۱/(تعداد واسطه‌ها + ۱)).\n۲. محاسبه واسطه‌ها با استفاده از فرمول tn = t1 * rⁿ⁻¹.\n۳. جایگذاری مقادیر داده شده برای یافتن واسطه‌ها.",
"introText": "۱. تعیین نسبت مشترک (r) با استفاده از فرمول r = (آخرین جمله / اولین جمله) به توانِ (۱/(تعداد واسطه‌ها + ۱)) .\n۲. محاسبه واسطه‌ها با استفاده از فرمول tn = t1 * rⁿ⁻¹.\n۳. جایگذاری مقادیر داده شده برای یافتن واسطه‌ها.",
"example": "بین ۲ و ۱۸ یک واسطهٔ هندسی درج کنید.",
"steps": [
"x² = ۲ × ۱۸ = ۳۶.",
@@ -119423,7 +119423,7 @@
{
"title": "مقایسه اعداد با توان",
"introText": "۱. اعداد را به صورت توان‌های مشابه بنویسید. ۲. مقایسه کنید و علامت مناسب را قرار دهید.",
"example": "۲^(۱/۲) و ۳^(۱/۲) را مقایسه کنید.",
"example": "۲ به توانِ (۱/۲) و ۳ به توانِ (۱/۲) را مقایسه کنید.",
"steps": [
"√۲ ≈ ۱٫۴۱.",
"√۳ ≈ ۱٫۷۳.",
@@ -119520,7 +119520,7 @@
},
{
"title": "تعیین تساوی توان‌های گویا",
"introText": "۱. مقدار a و n را تعیین کنید. ۲. بررسی کنید که آیا aⁿ و (aⁿ)^(1/n) برابر هستند.",
"introText": "۱. مقدار a و n را تعیین کنید. ۲. بررسی کنید که آیا aⁿ و (aⁿ) به توانِ (1/n) برابر هستند.",
"example": "تساوی زیر به ازای چه مقادیری از a و n برقرار نیست؟ n√(aⁿ) = (n√a)ⁿ",
"steps": [
"اگر a ≥ 0 باشد، طبق جدول n√(aⁿ) = a.",
@@ -119551,8 +119551,8 @@
"lessons": [
{
"title": "تعریف توان‌های گویا",
"introText": "برای هر عدد طبیعی n ≥ 1، عدد مثبت a را چنین تعریف می‌کنیم: a^(1/n) = √[n]{a}. این رابطه را می‌توان برای توان‌های دیگر نیز تعریف کرد.",
"example": "a^(۱/۲) چیست؟",
"introText": "برای هر عدد طبیعی n ≥ 1، عدد مثبت a را چنین تعریف می‌کنیم: a به توانِ (1/n) = √[n]{a}. این رابطه را می‌توان برای توان‌های دیگر نیز تعریف کرد.",
"example": "a به توانِ (۱/۲) چیست؟",
"steps": [
"توان ۱/۲ یعنی ریشه دوم.",
"✅ جواب: √a"
@@ -119561,7 +119561,7 @@
{
"title": "محاسبه توان‌های گویا",
"introText": "برای محاسبه توان‌های گویا، ابتدا توان را به صورت کسر بنویسید. سپس صورت کسر را به عنوان توان و مخرج را به عنوان ریشه در نظر بگیرید. عبارت را به شکل رادیکالی تبدیل کنید و محاسبات لازم را انجام دهید.",
"example": "۸^(۲/۳)؟",
"example": "۸ به توانِ (۲/۳) ؟",
"steps": [
"∛۸ = ۲.",
"۲² = ۴.",
@@ -119571,7 +119571,7 @@
{
"title": "محاسبه توان‌های گویا با اعداد طبیعی",
"introText": "برای محاسبه توان‌های گویا با اعداد طبیعی، ابتدا توان را به صورت کسر بنویسید. سپس از قاعده ضرب توان‌ها استفاده کنید و محاسبات لازم را انجام دهید.",
"example": "۱۶^(۱/۴)؟",
"example": "۱۶ به توانِ (۱/۴) ؟",
"steps": [
"۲⁴ = ۱۶.",
"✅ جواب: ۲"
@@ -119580,7 +119580,7 @@
{
"title": "نوشتن به صورت رادیکالی",
"introText": "برای نوشتن یک عدد به صورت رادیکالی، توان آن را به صورت کسری نوشته و سپس به صورت رادیکال تبدیل کنید.",
"example": "x^(۳/۲) را رادیکالی بنویسید.",
"example": "x به توانِ (۳/۲) را رادیکالی بنویسید.",
"steps": [
"(√x)³.",
"✅ جواب: √(x³)"
@@ -119592,7 +119592,7 @@
"example": "∛(x²) را توان کسری بنویسید.",
"steps": [
"ریشه سوم ← ۱/۳.",
"✅ جواب: x^(۲/۳)"
"✅ جواب: x به توانِ (۲/۳) "
]
},
{
@@ -119929,7 +119929,7 @@
{
"title": "محاسبه حاصل عبارت",
"introText": "برای محاسبه حاصل عبارت، ابتدا عبارت را ساده کنید و سپس مقدار آن را به‌دست آورید.",
"example": "(x^(۱/۳))³ را حساب کنید.",
"example": "(x به توانِ (۱/۳) )³ را حساب کنید.",
"steps": [
"(۱/۳) × ۳ = ۱.",
"✅ جواب: x"
@@ -119938,7 +119938,7 @@
{
"title": "محاسبه توان‌های گویا",
"introText": "برای محاسبه توان‌های گویا، ابتدا پایه را به توان صورت کسر رسانده و سپس ریشه مخرج کسر را محاسبه کنید.",
"example": "۲۷^(۲/۳)؟",
"example": "۲۷ به توانِ (۲/۳) ؟",
"steps": [
"∛۲۷ = ۳.",
"۳² = ۹.",
@@ -126542,7 +126542,7 @@
{
"title": "تشخیص رابطه بین دو خط در فضا",
"introText": "1. دو خط را در فضای سه‌بعدی در نظر بگیرید.\n2. بررسی کنید که آیا دو خط در یک صفحه قرار دارند یا خیر.\n3. اگر در یک صفحه باشند، یا موازی یا متقاطع هستند.\n4. اگر در یک صفحه نباشند، نسبت به هم متنافر هستند.\n5. نتیجه‌گیری نسبت به موقعیت دو خط در فضا (موازی، متقاطع، متنافر) را بیان کنید.",
"example": "اگر خط و صفحه با هم اشتراکی نداشته باشند، نسبت به هم __ هستند. اگر خط و صفحه در یک نقطه مشترک باشند، نسبت به هم __ هستند. اگر خط و صفحه بی‌شمار نقطه اشتراک داشته باشند، خط بر صفحه واقع است.",
"example": "اگر خط و صفحه با هم اشتراکی نداشته باشند، نسبت به هم هستند. اگر خط و صفحه در یک نقطه مشترک باشند، نسبت به هم هستند. اگر خط و صفحه بی‌شمار نقطه اشتراک داشته باشند، خط بر صفحه واقع است.",
"steps": [
"اگر خط و صفحه هیچ نقطه اشتراکی نداشته باشند، نسبت به هم موازی هستند.",
"اگر خط و صفحه در یک نقطه مشترک باشند، نسبت به هم متقاطع هستند.",
@@ -136384,7 +136384,7 @@
"lessons": [
{
"title": "محاسبه طول پاره‌خط روی محور اعداد",
"introText": "1. نقاط داده شده را روی محور اعداد مشخص کنید.\n2. طول پاره‌خط بین دو نقطه را با تفاضل قدر مطلق مختصات آن دو نقطه محاسبه کنید.\n3. اگر نقاط متقارنی نسبت به مبدا داده شده‌اند، مختصات آنها را به صورت عددی مشخص کنید.\n4. طول پاره‌خط را با استفاده از فرمول |x_B - x_A| محاسبه کنید.",
"introText": "1. نقاط داده شده را روی محور اعداد مشخص کنید.\n2. طول پاره‌خط بین دو نقطه را با تفاضل قدر مطلق مختصات آن دو نقطه محاسبه کنید.\n3. اگر نقاط متقارنی نسبت به مبدا داده شده‌اند، مختصات آنها را به صورت عددی مشخص کنید.\n4. طول پاره‌خط را با استفاده از فرمول |xB - xA| محاسبه کنید.",
"example": "نقاط A = −۳ و B = ۵ روی محور. AB؟",
"steps": [
"|۵ − (−۳)|.",
@@ -136502,7 +136502,7 @@
},
{
"title": "بررسی قائم‌الزاویه بودن مثلث در صفحه مختصات",
"introText": "1. سه نقطه A(x₁, y₁)، B(x₂, y₂) و C(x₃, y₃) را در نظر بگیرید.\n2. شیب خطوط AB و AC را محاسبه کنید: m_AB = (y₂ - y₁) / (x₂ - x₁)، m_AC = (y₃ - y₁) / (x₃ - x₁).\n3. اگر حاصل‌ضرب شیب‌ها برابر -1 باشد، خطوط عمودند و زاویه بین آن‌ها قائمه است.\n4. بنابراین مثلث ABC قائم‌الزاویه است اگر m_AB * m_AC = -1.\n5. در غیر این صورت، زاویه قائمه نیست.",
"introText": "1. سه نقطه A(x₁, y₁)، B(x₂, y₂) و C(x₃, y₃) را در نظر بگیرید.\n2. شیب خطوط AB و AC را محاسبه کنید: mAB = (y₂ - y₁) / (x₂ - x₁)، mAC = (y₃ - y₁) / (x₃ - x₁).\n3. اگر حاصل‌ضرب شیب‌ها برابر -1 باشد، خطوط عمودند و زاویه بین آن‌ها قائمه است.\n4. بنابراین مثلث ABC قائم‌الزاویه است اگر mAB * mAC = -1.\n5. در غیر این صورت، زاویه قائمه نیست.",
"example": "دو نقطه A(2, 5) و B(6, 3) را در صفحه‌ مختصات در نظر بگیرید. طول پاره‌خط AB را محاسبه کنید.",
"steps": [
"مختصات نقاط: A(2, 5) و B(6, 3).",
@@ -136908,13 +136908,13 @@
},
{
"title": "محاسبه طول نقطه وسط یک پاره‌خط",
"introText": "برای یافتن طول نقطه M که وسط پاره‌خط AB است، ابتدا مختصات نقاط A و B را روی محور عددی مشخص می‌کنیم. سپس طول پاره‌خط AM و MB را محاسبه می‌کنیم که برابرند. طول M از A برابر نصف فاصله کل AB است. به عبارت دیگر، x_M = (x_A + x_B) / 2.",
"introText": "برای یافتن طول نقطه M که وسط پاره‌خط AB است، ابتدا مختصات نقاط A و B را روی محور عددی مشخص می‌کنیم. سپس طول پاره‌خط AM و MB را محاسبه می‌کنیم که برابرند. طول M از A برابر نصف فاصله کل AB است. به عبارت دیگر، xM = (xA + xB) / 2.",
"example": "دو نقطه A و B به ترتیب دارای مختصات 4 و 10 هستند. طول نقطه وسط M این پاره‌خط را محاسبه کنید.",
"steps": [
"ابتدا مختصات A و B را مشخص می‌کنیم: A = 4 و B = 10.",
"فاصله کل پاره‌خط AB را محاسبه می‌کنیم: 10 - 4 = 6.",
"طول نقطه وسط M از A را محاسبه می‌کنیم: 6 ÷ 2 = 3.",
"مختصات نقطه وسط M را با استفاده از فرمول محاسبه می‌کنیم: x_M = (4 + 10) ÷ 2 = 7.",
"مختصات نقطه وسط M را با استفاده از فرمول محاسبه می‌کنیم: xM = (4 + 10) ÷ 2 = 7.",
"پس مختصات نقطه M برابر با 7 است.",
"✅ جواب: 7"
],
@@ -136959,7 +136959,7 @@
},
{
"title": "محاسبه مختصات نقطه وسط پاره‌خط در صفحه مختصات",
"introText": "برای یافتن مختصات نقطه M که وسط پاره‌خط AB است در صفحه مختصات، ابتدا مختصات نقاط A و B را به صورت (x_A, y_A) و (x_B, y_B) مشخص می‌کنیم. سپس مختصات M را با میانگین گرفتن از مختصات x و y نقاط A و B به دست می‌آوریم: x_M = (x_A + x_B) / 2 و y_M = (y_A + y_B) / 2.",
"introText": "برای یافتن مختصات نقطه M که وسط پاره‌خط AB است در صفحه مختصات، ابتدا مختصات نقاط A و B را به صورت (xA, yA) و (xB, yB) مشخص می‌کنیم. سپس مختصات M را با میانگین گرفتن از مختصات x و y نقاط A و B به دست می‌آوریم: xM = (xA + xB) / 2 و yM = (yA + yB) / 2.",
"example": "وسط پاره‌خط (۲،۴) و (۶،۸).",
"steps": [
"x: (۲+۶)/۲ = ۴.",
@@ -143030,7 +143030,7 @@
},
{
"title": "محاسبه شعاع دایره محاطی و دایره‌های محاطی خارجی در مثلث",
"introText": "1. ابتدا نیمساز زاویه A مثلث ABC را رسم می‌کنیم. 2. نقطه O را به عنوان نقطه تقاطع نیمساز زاویه C با خط BC مشخص می‌کنیم. 3. شعاع دایره محاطی داخلی (r) و شعاع دایره‌های محاطی خارجی (r_a, r_b, r_c) را تعریف می‌کنیم. 4. مساحت مثلث ABC را با S نشان می‌دهیم و محیط مثلث را با p که برابر با a+b+c است، مشخص می‌کنیم. 5. برای محاسبه شعاع دایره محاطی خارجی مقابل ضلع a، از رابطه r_a = S / (p - a) استفاده می‌کنیم. 6. به طور مشابه شعاع دایره‌های محاطی خارجی مقابل اضلاع دیگر را با روابط مشابه محاسبه می‌کنیم. 7. توجه داشته باشید که برخلاف مثلث، همه چندضلعی‌های دیگر لزوماً محاطی یا محیطی نیستند و شرایط خاصی برای محاطی یا محیطی بودن چهارضلعی وجود دارد.",
"introText": "1. ابتدا نیمساز زاویه A مثلث ABC را رسم می‌کنیم. 2. نقطه O را به عنوان نقطه تقاطع نیمساز زاویه C با خط BC مشخص می‌کنیم. 3. شعاع دایره محاطی داخلی (r) و شعاع دایره‌های محاطی خارجی (rₐ, rb, rc) را تعریف می‌کنیم. 4. مساحت مثلث ABC را با S نشان می‌دهیم و محیط مثلث را با p که برابر با a+b+c است، مشخص می‌کنیم. 5. برای محاسبه شعاع دایره محاطی خارجی مقابل ضلع a، از رابطه rₐ = S / (p - a) استفاده می‌کنیم. 6. به طور مشابه شعاع دایره‌های محاطی خارجی مقابل اضلاع دیگر را با روابط مشابه محاسبه می‌کنیم. 7. توجه داشته باشید که برخلاف مثلث، همه چندضلعی‌های دیگر لزوماً محاطی یا محیطی نیستند و شرایط خاصی برای محاطی یا محیطی بودن چهارضلعی وجود دارد.",
"example": "مثلثی به مساحت ۲۴ و محیط ۲۴ داده شده است (مثلث ۶-۸-۱۰). شعاع دایرهٔ محاطی آن چه‌قدر است؟",
"steps": [
"r = مساحت ÷ نیم‌محیط.",
@@ -143970,7 +143970,7 @@
},
{
"title": "رابطه شعاع‌های دایره‌های محیطی و محاطی مثلث",
"introText": "برای نشان دادن رابطه بین شعاع‌های سه دایره محیطی خارجی مثلث (r_a, r_b, r_c) و شعاع دایره محاطی (r)، از فرمول داده شده استفاده می‌کنیم. این فرمول به صورت معکوس جمع معکوس شعاع‌های محیطی برابر معکوس شعاع محاطی است. با استفاده از این رابطه می‌توان شعاع دایره محاطی را از شعاع‌های محیطی محاسبه کرد.",
"introText": "برای نشان دادن رابطه بین شعاع‌های سه دایره محیطی خارجی مثلث (rₐ, rb, rc) و شعاع دایره محاطی (r)، از فرمول داده شده استفاده می‌کنیم. این فرمول به صورت معکوس جمع معکوس شعاع‌های محیطی برابر معکوس شعاع محاطی است. با استفاده از این رابطه می‌توان شعاع دایره محاطی را از شعاع‌های محیطی محاسبه کرد.",
"example": "در مثلث ABC: R شعاع محیطی و r محاطی. برای متساوی‌الاضلاع R و r چه نسبتی دارند؟",
"steps": [
"R = ۲r در متساوی‌الاضلاع.",
@@ -149575,7 +149575,7 @@
"steps": [
"(g∘f)(x) = g(f(x)).",
"x باید در دامنهٔ f باشد و f(x) هم در دامنهٔ g باشد.",
"✅ جواب: D_(g∘f) = {x ∈ D_f | f(x) ∈ D_g}"
"✅ جواب: D(g∘f) = {x ∈ Df | f(x) ∈ Dg}"
]
},
{
@@ -156577,9 +156577,9 @@
"introText": "1. رابطه تابع را به صورت f(x) = √[x] یا به شکل توان کسری بنویسید.\n2. برای هر مقدار x، مقدار تابع را با استفاده از قوانین توان‌های کسری محاسبه کنید.\n3. اگر x منفی است و توان کسری به گونه‌ای است که مقدار حقیقی ندارد، مقدار را نادیده بگیرید یا علامت ... بگذارید.\n4. مقادیر محاسبه شده را در جدول جایگزین کنید.",
"example": "محاسبه مقدار تابع f(x) = √[x] برای x = 16.",
"steps": [
"تابع را به صورت f(x) = x^(1/2) بنویسیم.",
"مقدار x را در تابع جایگزین می‌کنیم: f(16) = 16^(1/2).",
"حساب می‌کنیم: 16^(1/2) = √16.",
"تابع را به صورت f(x) = x به توانِ (1/2) بنویسیم.",
"مقدار x را در تابع جایگزین می‌کنیم: f(16) = 16 به توانِ (1/2) .",
"حساب می‌کنیم: 16 به توانِ (1/2) = √16.",
"مقدار رادیکال را محاسبه می‌کنیم: √16 = 4.",
"✅ جواب: 4"
]
@@ -156841,7 +156841,7 @@
},
{
"title": "مسئله مدل‌سازی رشد نمایی و نیمه‌عمر",
"introText": "1. تعریف تابع نمایی بر اساس نیمه عمر یا نرخ رشد داده شده. 2. جایگذاری مقادیر اولیه و زمان در تابع برای محاسبه مقدار ماده در زمان‌های مختلف. 3. استفاده از رابطه Q(t) = Q₀ * (1/2)^(t/T) که در آن T نیمه عمر است. 4. حل معادله برای زمان یا مقدار ماده در زمان مشخص.",
"introText": "1. تعریف تابع نمایی بر اساس نیمه عمر یا نرخ رشد داده شده. 2. جایگذاری مقادیر اولیه و زمان در تابع برای محاسبه مقدار ماده در زمان‌های مختلف. 3. استفاده از رابطه Q(t) = Q₀ * (1/2) به توانِ (t/T) که در آن T نیمه عمر است. 4. حل معادله برای زمان یا مقدار ماده در زمان مشخص.",
"example": "نیمه‌عمر ۵ سال ، مقدار ۸۰. بعد ۱۰ سال؟",
"steps": [
"۱۰ سال = ۲ نیمه‌عمر.",
@@ -157037,7 +157037,7 @@
{
"title": "تکمیل جای خالی در توابع نمایی",
"introText": "برای تابع نمایی f(x) = aˣ، اگر a > 1 باشد، با افزایش x مقدار تابع افزایش می‌یابد و اگر 0 < a < 1 باشد، با افزایش x مقدار تابع کاهش می‌یابد. این ویژگی‌ها را در جای خالی‌های داده شده قرار می‌دهیم.",
"example": "۲^□ = ۱۶.",
"example": "۲ به توانِ □ = ۱۶.",
"steps": [
"۲⁴ = ۱۶.",
"✅ جواب: ۴"
@@ -157135,7 +157135,7 @@
},
{
"title": "تعیین ضابطه توابع نمایی از روی نمودار",
"introText": "1. نقاط مشخص روی نمودار را انتخاب کنید.\n2. با توجه به شکل کلی تابع نمایی y = aˣ یا y = a^(x+c) + d ضابطه را حدس بزنید.\n3. با استفاده از نقاط داده شده مقدار a و پارامترهای دیگر را پیدا کنید.\n4. ضابطه به دست آمده را با نمودارهای دیگر مقایسه کنید و نتیجه‌گیری کنید.",
"introText": "1. نقاط مشخص روی نمودار را انتخاب کنید.\n2. با توجه به شکل کلی تابع نمایی y = aˣ یا y = aˣ⁺ᶜ + d ضابطه را حدس بزنید.\n3. با استفاده از نقاط داده شده مقدار a و پارامترهای دیگر را پیدا کنید.\n4. ضابطه به دست آمده را با نمودارهای دیگر مقایسه کنید و نتیجه‌گیری کنید.",
"example": "نمودار از (۰،۱) و (۱،۳). تابع نمایی؟",
"steps": [
"y = aˣ.",
@@ -157231,7 +157231,7 @@
"lessons": [
{
"title": "حل نامعادلات نمایی",
"introText": "1. نامعادله را به صورت a^f(x) > a^g(x) یا مشابه آن بنویسید.\n2. چون پایه a > 1 است، جهت نامعادله را حفظ کنید.\n3. توان‌ها را مقایسه کنید و نامعادله را به صورت f(x) > g(x) تبدیل کنید.\n4. نامعادله به دست آمده را حل کنید.",
"introText": "1. نامعادله را به صورت aᶠ(x) > aᵍ(x) یا مشابه آن بنویسید.\n2. چون پایه a > 1 است، جهت نامعادله را حفظ کنید.\n3. توان‌ها را مقایسه کنید و نامعادله را به صورت f(x) > g(x) تبدیل کنید.\n4. نامعادله به دست آمده را حل کنید.",
"example": "نامعادلهٔ ۲ˣ > ۸.",
"steps": [
"۸ = ۲³.",
@@ -157294,11 +157294,11 @@
{
"title": "یافتن مقدار تقریبی اعداد با کمک نمودار و ماشین حساب",
"introText": "1. عدد مورد نظر را به صورت نمایی یا رادیکالی بنویسید.\n2. با استفاده از نمودار تابع مربوطه مقدار تقریبی را حدس بزنید.\n3. مقدار تقریبی را با ماشین حساب محاسبه کنید.\n4. صحت مقدار را با نمودار بررسی کنید.",
"example": "نقطه x=√7 را روی محور xها مشخص کنید، سپس مقدار تقریبی y=2^√7 را با استفاده از نمودار پیدا کنید.",
"example": "نقطه x=√7 را روی محور xها مشخص کنید، سپس مقدار تقریبی y=2 به توانِ √7 را با استفاده از نمودار پیدا کنید.",
"steps": [
"ابتدا مقدار √7 را محاسبه می‌کنیم که تقریباً برابر 2.6457 است.",
"سپس در نمودار تابع y=2ˣ مقدار y را برای x=2.6457 پیدا می‌کنیم که تقریباً برابر 6.3 است.",
"بنابراین y=2^√7 ≈ 6.3.",
"بنابراین y=2 به توانِ √7 ≈ 6.3.",
"✅ جواب: ≈ ۶٫۳"
],
"figures": [
@@ -157306,7 +157306,7 @@
"where": "example",
"diagram": {
"kind": "plane",
"title": "۲^√۷ ≈ ۶٫۳",
"title": "۲ به توانِ √۷ ≈ ۶٫۳",
"axes": true,
"points": {},
"items": [
@@ -157662,7 +157662,7 @@
},
{
"title": "محاسبه مقدار تابع لگاریتمی در نقاط مختلف",
"introText": "1. تابع لگاریتمی به صورت f(x) = log_a x تعریف می‌شود که a پایه لگاریتم است.\n2. برای محاسبه مقدار تابع در نقطه x، مقدار لگاریتم پایه a از x را محاسبه می‌کنیم.\n3. اگر x در دامنه تابع (x>0) نباشد، مقدار تابع تعریف نشده است.\n4. برای محاسبه لگاریتم می‌توان از رابطه معکوس نمایی استفاده کرد: y = log_a x ⇔ aʸ = x.\n5. در صورت نیاز، از ماشین حساب با دکمه log و تنظیم پایه مناسب استفاده می‌کنیم.",
"introText": "1. تابع لگاریتمی به صورت f(x) = logₐ x تعریف می‌شود که a پایه لگاریتم است.\n2. برای محاسبه مقدار تابع در نقطه x، مقدار لگاریتم پایه a از x را محاسبه می‌کنیم.\n3. اگر x در دامنه تابع (x>0) نباشد، مقدار تابع تعریف نشده است.\n4. برای محاسبه لگاریتم می‌توان از رابطه معکوس نمایی استفاده کرد: y = logₐ x ⇔ aʸ = x.\n5. در صورت نیاز، از ماشین حساب با دکمه log و تنظیم پایه مناسب استفاده می‌کنیم.",
"example": "محاسبه مقدار تابع f(x) = log₂ 8 را انجام دهید.",
"steps": [
"برای محاسبه f(8) = log₂ 8، باید ببینیم ۲ به چه توانایی برابر با ۸ است.",
@@ -157710,13 +157710,13 @@
},
{
"title": "تبدیل لگاریتم به صورت توانی",
"introText": "برای تبدیل لگاریتم به صورت توانی، از تعریف لگاریتم استفاده می‌کنیم: اگر log_a b = c باشد، آنگاه a^c = b. بنابراین برای هر لگاریتم داده شده، پایه لگاریتم را به توان مقدار لگاریتم می‌رسانیم تا عدد داخل لگاریتم به دست آید.",
"introText": "برای تبدیل لگاریتم به صورت توانی، از تعریف لگاریتم استفاده می‌کنیم: اگر logₐ b = c باشد، آنگاه aᶜ = b. بنابراین برای هر لگاریتم داده شده، پایه لگاریتم را به توان مقدار لگاریتم می‌رسانیم تا عدد داخل لگاریتم به دست آید.",
"example": "تبدیل لگاریتم log₂ 16 به صورت توانی.",
"steps": [
"ما داریم log₂ 16 = c.",
"طبق تعریف لگاریتم، 2^c = 16.",
"طبق تعریف لگاریتم، 2ᶜ = 16.",
"عدد 16 را می‌توان به صورت 2⁴ نوشت.",
"بنابراین، 2^c = 2⁴.",
"بنابراین، 2ᶜ = 2⁴.",
"از آنجا که پایه‌ها برابرند، می‌توان نتیجه گرفت که c = 4.",
"✅ جواب: 4"
],
@@ -157763,7 +157763,7 @@
"lessons": [
{
"title": "محاسبه مقادیر لگاریتمی با استفاده از تعریف",
"introText": "برای محاسبه مقدار لگاریتم، ابتدا مقدار لگاریتم را برابر با یک متغیر فرض می‌کنیم، سپس با استفاده از تعریف لگاریتم، معادله نمایی متناظر را می‌نویسیم و مقدار مجهول را محاسبه می‌کنیم. اگر لگاریتم به صورت log_a b = x باشد، آنگاه aˣ = b.",
"introText": "برای محاسبه مقدار لگاریتم، ابتدا مقدار لگاریتم را برابر با یک متغیر فرض می‌کنیم، سپس با استفاده از تعریف لگاریتم، معادله نمایی متناظر را می‌نویسیم و مقدار مجهول را محاسبه می‌کنیم. اگر لگاریتم به صورت logₐ b = x باشد، آنگاه aˣ = b.",
"example": "log₂ ۸؟",
"steps": [
"۲³ = ۸.",
@@ -157806,7 +157806,7 @@
},
{
"title": "رسم نمودار توابع لگاریتمی و تعیین ضابطه",
"introText": "برای رسم نمودار تابع لگاریتمی با پایه مشخص، ابتدا نقاطی از دامنه را انتخاب کرده و مقادیر تابع را محاسبه می‌کنیم. سپس نقاط به دست آمده را روی دستگاه مختصات رسم می‌کنیم. ضابطه تابع لگاریتمی به صورت f(x) = log_a x است که a پایه لگاریتم است. با توجه به نمودار و نقاط داده شده، می‌توان ضابطه هر تابع را تعیین کرد.",
"introText": "برای رسم نمودار تابع لگاریتمی با پایه مشخص، ابتدا نقاطی از دامنه را انتخاب کرده و مقادیر تابع را محاسبه می‌کنیم. سپس نقاط به دست آمده را روی دستگاه مختصات رسم می‌کنیم. ضابطه تابع لگاریتمی به صورت f(x) = logₐ x است که a پایه لگاریتم است. با توجه به نمودار و نقاط داده شده، می‌توان ضابطه هر تابع را تعیین کرد.",
"example": "نقاط log₂x برای x = ۱ ، ۲ ، ۴.",
"steps": [
"۰ ، ۱ ، ۲.",
@@ -157866,7 +157866,7 @@
},
{
"title": "رسم و مقایسه نمودارهای نمایی و لگاریتمی",
"introText": "1. نمودار تابع نمایی y = (1/2)ˣ را رسم کنید. 2. نمودار تابع لگاریتمی y = log_(1/2) x را رسم کنید. 3. ویژگی‌های هر نمودار مانند جهت نمودار، نقاط تقاطع با محورهای مختصات و رفتار نمودار در بی‌نهایت را بررسی کنید. 4. نمودارها را در یک دستگاه مختصات رسم کرده و تفاوت‌ها و شباهت‌های آن‌ها را مقایسه کنید.",
"introText": "1. نمودار تابع نمایی y = (1/2)ˣ را رسم کنید. 2. نمودار تابع لگاریتمی y = log(1/2) x را رسم کنید. 3. ویژگی‌های هر نمودار مانند جهت نمودار، نقاط تقاطع با محورهای مختصات و رفتار نمودار در بی‌نهایت را بررسی کنید. 4. نمودارها را در یک دستگاه مختصات رسم کرده و تفاوت‌ها و شباهت‌های آن‌ها را مقایسه کنید.",
"example": "رابطهٔ نمودار ۲ˣ و log₂x؟",
"steps": [
"وارون هم‌اند.",
@@ -157968,12 +157968,12 @@
},
{
"title": "محاسبه مقدار لگاریتم",
"introText": "1. از تعریف لگاریتم استفاده کنید: اگر log_a b = c باشد، آنگاه a^c = b. 2. عدد داخل لگاریتم را به صورت توان پایه لگاریتم بنویسید. 3. توان را به عنوان جواب لگاریتم بنویسید. 4. اگر لازم است، از خواص لگاریتم برای ساده‌سازی استفاده کنید.",
"introText": "1. از تعریف لگاریتم استفاده کنید: اگر logₐ b = c باشد، آنگاه aᶜ = b. 2. عدد داخل لگاریتم را به صورت توان پایه لگاریتم بنویسید. 3. توان را به عنوان جواب لگاریتم بنویسید. 4. اگر لازم است، از خواص لگاریتم برای ساده‌سازی استفاده کنید.",
"example": "محاسبه مقدار log₂ 32",
"steps": [
"عدد 32 را به صورت توان پایه 2 بنویسیم: 32 = 2⁵.",
"طبق تعریف لگاریتم، اگر log₂ 32 = c باشد، آنگاه 2^c = 32.",
"با توجه به اینکه 32 = 2⁵، می‌توانیم بنویسیم: 2^c = 2⁵.",
"طبق تعریف لگاریتم، اگر log₂ 32 = c باشد، آنگاه 2ᶜ = 32.",
"با توجه به اینکه 32 = 2⁵، می‌توانیم بنویسیم: 2ᶜ = 2⁵.",
"از آنجا که پایه‌ها برابرند، می‌توانیم نتیجه بگیریم که c = 5.",
"بنابراین، log₂ 32 = 5.",
"✅ جواب: 5"
@@ -158015,7 +158015,7 @@
},
{
"title": "محاسبه مقدار لگاریتم با استفاده از تعریف لگاریتم",
"introText": "برای محاسبه مقدار لگاریتم عبارت‌هایی مانند log_a b، از تعریف لگاریتم استفاده می‌کنیم که می‌گوید اگر y = log_a b آنگاه aʸ = b. با تبدیل عدد داخل لگاریتم به صورت توان یا ریشه، مقدار لگاریتم را به صورت عددی پیدا می‌کنیم.",
"introText": "برای محاسبه مقدار لگاریتم عبارت‌هایی مانند logₐ b، از تعریف لگاریتم استفاده می‌کنیم که می‌گوید اگر y = logₐ b آنگاه aʸ = b. با تبدیل عدد داخل لگاریتم به صورت توان یا ریشه، مقدار لگاریتم را به صورت عددی پیدا می‌کنیم.",
"example": "log₃ ۹ و log₁₀ ۱۰۰۰ را حساب کنید.",
"steps": [
"۳² = ۹.",
@@ -158031,7 +158031,7 @@
"lessons": [
{
"title": "مقایسه نمودار توابع لگاریتمی با پایه‌های مختلف",
"introText": "برای مقایسه نمودار توابع y = log_a x با پایه‌های مختلف، ابتدا ویژگی‌های پایه را بررسی می‌کنیم: اگر a > 1 باشد، نمودار صعودی است و اگر 0 < a < 1 باشد، نمودار نزولی است. سپس شکل و جهت نمودارها را با هم مقایسه می‌کنیم.",
"introText": "برای مقایسه نمودار توابع y = logₐ x با پایه‌های مختلف، ابتدا ویژگی‌های پایه را بررسی می‌کنیم: اگر a > 1 باشد، نمودار صعودی است و اگر 0 < a < 1 باشد، نمودار نزولی است. سپس شکل و جهت نمودارها را با هم مقایسه می‌کنیم.",
"example": "log₂x و log₃x برای x > ۱ کدام بزرگ‌تر؟",
"steps": [
"x = ۹: log₂ ۹ ≈ ۳٫۲ ؛ log₃ ۹ = ۲.",
@@ -158078,7 +158078,7 @@
},
{
"title": "یافتن نقاط قطع نمودارهای نمایی با خطوط افقی",
"introText": "برای یافتن نقطه قطع نمودار تابع نمایی y = aˣ با خط افقی y = c، مقدار x را از معادله aˣ = c پیدا می‌کنیم. با گرفتن لگاریتم دو طرف معادله، x = log_a c به دست می‌آید.",
"introText": "برای یافتن نقطه قطع نمودار تابع نمایی y = aˣ با خط افقی y = c، مقدار x را از معادله aˣ = c پیدا می‌کنیم. با گرفتن لگاریتم دو طرف معادله، x = logₐ c به دست می‌آید.",
"example": "خط y = 16 نمودار تابع y = 4ˣ را در چه نقطه‌ای قطع می‌کند؟",
"steps": [
"معادله را به صورت 4ˣ = 16 بنویسیم.",
@@ -158248,7 +158248,7 @@
"lessons": [
{
"title": "ویژگی‌های لگاریتم و اثبات روابط لگاریتمی",
"introText": "برای اثبات روابط لگاریتمی ابتدا از تعریف لگاریتم استفاده می‌کنیم. فرض می‌کنیم لگاریتم‌ها به صورت log_a b = x و log_a c = y تعریف شده‌اند، سپس با تبدیل لگاریتم به صورت نمایی (aˣ = b و aʸ = c) و استفاده از خواص توان‌ها، رابطه مورد نظر را اثبات می‌کنیم. به عنوان مثال برای اثبات log_c(ab) = log_c a + log_c b، ابتدا a و b را به صورت توان‌های پایه c می‌نویسیم و سپس با استفاده از قانون ضرب توان‌ها، رابطه را اثبات می‌کنیم.",
"introText": "برای اثبات روابط لگاریتمی ابتدا از تعریف لگاریتم استفاده می‌کنیم. فرض می‌کنیم لگاریتم‌ها به صورت logₐ b = x و logₐ c = y تعریف شده‌اند، سپس با تبدیل لگاریتم به صورت نمایی (aˣ = b و aʸ = c) و استفاده از خواص توان‌ها، رابطه مورد نظر را اثبات می‌کنیم. به عنوان مثال برای اثبات log پایه‌ی c(ab) = log پایه‌ی c a + log پایه‌ی c b، ابتدا a و b را به صورت توان‌های پایه c می‌نویسیم و سپس با استفاده از قانون ضرب توان‌ها، رابطه را اثبات می‌کنیم.",
"example": "log(aⁿ) = n log a را اثبات کنید.",
"steps": [
"aⁿ = a × … × a.",
@@ -158258,7 +158258,7 @@
},
{
"title": "ویژگی لگاریتم توان‌دار",
"introText": "برای حل مسائل مربوط به لگاریتم توان‌دار، از قانون لگاریتم توان استفاده می‌کنیم که می‌گوید log_a(bⁿ) = n * log_a b. ابتدا لگاریتم توان را به صورت ضرب n در لگاریتم پایه b می‌نویسیم و سپس با توجه به مقدار n و b، مقدار لگاریتم را محاسبه می‌کنیم.",
"introText": "برای حل مسائل مربوط به لگاریتم توان‌دار، از قانون لگاریتم توان استفاده می‌کنیم که می‌گوید logₐ(bⁿ) = n * logₐ b. ابتدا لگاریتم توان را به صورت ضرب n در لگاریتم پایه b می‌نویسیم و سپس با توجه به مقدار n و b، مقدار لگاریتم را محاسبه می‌کنیم.",
"example": "log ۸ را با log ۲ بنویسید.",
"steps": [
"۸ = ۲³.",
@@ -158278,7 +158278,7 @@
},
{
"title": "حل معادلات لگاریتمی",
"introText": "برای حل معادلات لگاریتمی ابتدا باید معادله را به گونه‌ای ساده کنیم که لگاریتم‌ها در دو طرف معادله با پایه‌های یکسان قرار گیرند. سپس با استفاده از خاصیت برابری لگاریتم‌ها (اگر log_a(x) = log_a(y) آنگاه x = y) عبارت‌های داخل لگاریتم را برابر قرار می‌دهیم. در نهایت معادله به یک معادله جبری تبدیل شده و آن را حل می‌کنیم. پس از یافتن جواب‌ها، باید بررسی کنیم که آیا جواب‌ها در دامنه تعریف لگاریتم قرار دارند یا خیر، زیرا اعداد داخل لگاریتم باید مثبت باشند.",
"introText": "برای حل معادلات لگاریتمی ابتدا باید معادله را به گونه‌ای ساده کنیم که لگاریتم‌ها در دو طرف معادله با پایه‌های یکسان قرار گیرند. سپس با استفاده از خاصیت برابری لگاریتم‌ها (اگر logₐ(x) = logₐ(y) آنگاه x = y) عبارت‌های داخل لگاریتم را برابر قرار می‌دهیم. در نهایت معادله به یک معادله جبری تبدیل شده و آن را حل می‌کنیم. پس از یافتن جواب‌ها، باید بررسی کنیم که آیا جواب‌ها در دامنه تعریف لگاریتم قرار دارند یا خیر، زیرا اعداد داخل لگاریتم باید مثبت باشند.",
"example": "log₂x = ۳.",
"steps": [
"x = ۲³.",
@@ -158459,12 +158459,12 @@
},
{
"title": "محاسبه جرم باقی‌مانده ماده هسته‌ای با نیمه عمر مشخص",
"introText": "1. نیمه عمر ماده هسته‌ای مشخص است (مثلاً 25 سال).\n2. جرم اولیه ماده داده شده است (مثلاً 24 میلی‌گرم).\n3. رابطه جرم باقی‌مانده به صورت نمایی است: m(t) = m₀ × (1/2)^(t/T) که در آن t زمان گذشته و T نیمه عمر است.\n4. مقدار t را در رابطه قرار می‌دهیم.\n5. مقدار m(t) را محاسبه می‌کنیم تا جرم باقی‌مانده پس از t سال به دست آید.",
"introText": "1. نیمه عمر ماده هسته‌ای مشخص است (مثلاً 25 سال).\n2. جرم اولیه ماده داده شده است (مثلاً 24 میلی‌گرم).\n3. رابطه جرم باقی‌مانده به صورت نمایی است: m(t) = m₀ × (1/2) به توانِ (t/T) که در آن t زمان گذشته و T نیمه عمر است.\n4. مقدار t را در رابطه قرار می‌دهیم.\n5. مقدار m(t) را محاسبه می‌کنیم تا جرم باقی‌مانده پس از t سال به دست آید.",
"example": "نیمه عمر یک ماده هسته‌ای 10 سال است و جرم اولیه آن 80 میلی‌گرم است. جرم باقی‌مانده پس از 30 سال را محاسبه کنید.",
"steps": [
"نیمه عمر T = 10 سال و زمان t = 30 سال است.",
"مقدار t/T را محاسبه می‌کنیم: 30/10 = 3.",
"حال مقدار m(t) را با استفاده از فرمول m(t) = m₀ × (1/2)^(t/T) محاسبه می‌کنیم: m(30) = 80 × (1/2)³.",
"حال مقدار m(t) را با استفاده از فرمول m(t) = m₀ × (1/2) به توانِ (t/T) محاسبه می‌کنیم: m(30) = 80 × (1/2)³.",
"محاسبه می‌کنیم: (1/2)³ = 1/8.",
"بنابراین m(30) = 80 × 1/8 = 10 میلی‌گرم.",
"✅ جواب: 10"
@@ -158619,12 +158619,12 @@
{
"title": "یافتن مقدار مجهول در تابع لگاریتمی با استفاده از نمودار",
"introText": "1. معادله تابع لگاریتمی را بنویسید.\n2. مختصات نقطه داده شده را در تابع قرار دهید.\n3. معادله به دست آمده را حل کنید تا مقدار مجهول پیدا شود.",
"example": "اگر نمودار تابع f(x) = log_a x از نقطه (8, 3) عبور کند، مقدار a چند است؟",
"example": "اگر نمودار تابع f(x) = logₐ x از نقطه (8, 3) عبور کند، مقدار a چند است؟",
"steps": [
"معادله تابع را می‌نویسیم: f(8) = log_a 8 = 3.",
"معادله تابع را می‌نویسیم: f(8) = logₐ 8 = 3.",
"از تعریف لگاریتم استفاده می‌کنیم: 8 = a³.",
"حالا برای پیدا کردن a، هر دو طرف را به توان 1/3 می‌رسانیم: a = 8^(1/3).",
"محاسبه می‌کنیم: 8^(1/3) = 2.",
"حالا برای پیدا کردن a، هر دو طرف را به توان 1/3 می‌رسانیم: a = 8 به توانِ (1/3) .",
"محاسبه می‌کنیم: 8 به توانِ (1/3) = 2.",
"پس مقدار a برابر با 2 است.",
"✅ جواب: 2"
],
@@ -158633,7 +158633,7 @@
"where": "example",
"diagram": {
"kind": "plane",
"title": "log_a x از (۸ ، ۳)",
"title": "logₐ x از (۸ ، ۳)",
"axes": true,
"points": {},
"items": [
@@ -158680,7 +158680,7 @@
},
{
"title": "توانِ منفی و کسری",
"introText": "a⁻ⁿ = ۱/aⁿ و a^(m/k) = ᵏ√(aᵐ).",
"introText": "a⁻ⁿ = ۱/aⁿ و a به توانِ (m/k) = ᵏ√(aᵐ).",
"example": "",
"steps": []
},
@@ -158704,7 +158704,7 @@
"lessons": [
{
"title": "مقدارِ لگاریتم",
"introText": "log_b(bᵏ) = k.",
"introText": "logb(bᵏ) = k.",
"example": "",
"steps": []
},
@@ -158716,7 +158716,7 @@
},
{
"title": "معادله‌ی لگاریتمی",
"introText": "log_b x = k ⇔ x = bᵏ.",
"introText": "logb x = k ⇔ x = bᵏ.",
"example": "",
"steps": []
},
@@ -160384,7 +160384,7 @@
},
{
"title": "محاسبه ارتفاع مثلث با استفاده از نسبت‌های مثلثاتی و مساحت مثلث",
"introText": "1. ارتفاع BH در مثلث ABC را با استفاده از تعریف سینوس زاویه A محاسبه می‌کنیم: sin A = BH / AC که از آن BH = AC × sin A به دست می‌آید.\n2. مساحت مثلث ABC را با استفاده از فرمول مساحت (نصف حاصلضرب قاعده در ارتفاع) محاسبه می‌کنیم: S_ABC = (1/2) × BH × AC.\n3. در نهایت با جایگذاری مقدار BH از مرحله اول، مساحت را به صورت تابعی از طول ضلع‌ها و سینوس زاویه به دست می‌آوریم.",
"introText": "1. ارتفاع BH در مثلث ABC را با استفاده از تعریف سینوس زاویه A محاسبه می‌کنیم: sin A = BH / AC که از آن BH = AC × sin A به دست می‌آید.\n2. مساحت مثلث ABC را با استفاده از فرمول مساحت (نصف حاصلضرب قاعده در ارتفاع) محاسبه می‌کنیم: SABC = (1/2) × BH × AC.\n3. در نهایت با جایگذاری مقدار BH از مرحله اول، مساحت را به صورت تابعی از طول ضلع‌ها و سینوس زاویه به دست می‌آوریم.",
"example": "مثلثی با ضلع ۱۰ و زاویه‌های مجاور ۳۰° و ۹۰°. مساحت؟",
"steps": [
"ضلع قائم دیگر = ۱۰ tan ۳۰° = ۱۰/√۳.",
@@ -160423,7 +160423,7 @@
},
{
"title": "محاسبه مساحت مثلث با استفاده از فرمول سینوس دو ضلع و زاویه بین آنها",
"introText": "مساحت هر مثلث برابر است با نصف حاصل‌ضرب اندازه‌های دو ضلع در سینوس زاویه بین آن‌ها. به صورت فرمولی:\nS_ABC = (1/2) × b × c × sin A = (1/2) × a × b × sin C = (1/2) × a × c × sin B\nبرای محاسبه مساحت، ابتدا دو ضلع و زاویه بین آن‌ها را مشخص می‌کنیم و سپس در فرمول جایگذاری می‌کنیم.",
"introText": "مساحت هر مثلث برابر است با نصف حاصل‌ضرب اندازه‌های دو ضلع در سینوس زاویه بین آن‌ها. به صورت فرمولی:\nSABC = (1/2) × b × c × sin A = (1/2) × a × b × sin C = (1/2) × a × c × sin B\nبرای محاسبه مساحت، ابتدا دو ضلع و زاویه بین آن‌ها را مشخص می‌کنیم و سپس در فرمول جایگذاری می‌کنیم.",
"example": "ضلع‌های ۸ و ۱۲ با زاویهٔ ۳۰°. مساحت؟",
"steps": [
"S = ½ ab sin θ.",
@@ -161198,7 +161198,7 @@
},
{
"title": "طولِ میانه",
"introText": "m_a² = (۲b² + ۲c² − a²)/۴.",
"introText": "mₐ² = (۲b² + ۲c² − a²)/۴.",
"example": "",
"steps": []
},
@@ -163768,7 +163768,7 @@
},
{
"title": "رابطه بین مختصات نقاط روی دایره مثلثاتی و نسبت‌های مثلثاتی زوایای قرینه",
"introText": "1. نقطه P روی دایره مثلثاتی با زاویه α به صورت P(x_P, y_P) = (cos α, sin α) تعریف می‌شود.\n2. نقطه Q قرینه P نسبت به محور x است، پس Q(x_Q, y_Q) = (cos(-α), sin(-α)) = (cos α, -sin α).\n3. با توجه به این مختصات، روابط مثلثاتی برای زاویه -α را می‌توان به دست آورد:\n - cos(-α) = cos α\n - sin(-α) = -sin α\n - tan(-α) = -tan α\n - cot(-α) = -cot α\n4. این روابط از مختصات نقاط روی دایره مثلثاتی و تعاریف نسبت‌های مثلثاتی استخراج می‌شوند.",
"introText": "1. نقطه P روی دایره مثلثاتی با زاویه α به صورت P(xP, yP) = (cos α, sin α) تعریف می‌شود.\n2. نقطه Q قرینه P نسبت به محور x است، پس Q(xQ, yQ) = (cos(-α), sin(-α)) = (cos α, -sin α).\n3. با توجه به این مختصات، روابط مثلثاتی برای زاویه -α را می‌توان به دست آورد:\n - cos(-α) = cos α\n - sin(-α) = -sin α\n - tan(-α) = -tan α\n - cot(-α) = -cot α\n4. این روابط از مختصات نقاط روی دایره مثلثاتی و تعاریف نسبت‌های مثلثاتی استخراج می‌شوند.",
"example": "cos(−α) و cosα؟",
"steps": [
"P(cosα ، sinα) و قرینه (cosα ، −sinα).",
@@ -163851,7 +163851,7 @@
},
{
"title": "رابطه‌های مثلثاتی زوایای مکمل و زاویه‌های به شکل π-α و π+α",
"introText": "1. نقاط P و Q روی دایره مثلثاتی را با مختصات (x_P, y_P) و (x_Q, y_Q) در نظر بگیرید که زاویه P برابر α و زاویه Q برابر π-α یا π+α است.\n2. با توجه به مختصات نقاط و تعریف دایره مثلثاتی، روابط مختصات نقاط را به دست آورید، مثلاً x_Q = -x_P و y_Q = y_P برای زاویه π-α.\n3. با استفاده از روابط مختصات، مقادیر توابع مثلثاتی را برای زاویه‌های π-α و π+α به صورت تابعی از α بنویسید.\n4. از روابط اولیه توابع مثلثاتی (sin, cos, tan, cot) استفاده کنید تا روابط زیر را اثبات یا کامل کنید:\n - sin(π-α) = sin α\n - cos(π-α) = -cos α\n - tan(π-α) = -tan α\n - cot(π-α) = -cot α\n - sin(π+α) = -sin α\n - cos(π+α) = -cos α\n - tan(π+α) = tan α\n - cot(π+α) = cot α\n5. برای محاسبه مقادیر عددی توابع مثلثاتی زاویه‌های داده شده، از این روابط استفاده کنید و مقادیر را به صورت عددی محاسبه نمایید.",
"introText": "1. نقاط P و Q روی دایره مثلثاتی را با مختصات (xP, yP) و (xQ, yQ) در نظر بگیرید که زاویه P برابر α و زاویه Q برابر π-α یا π+α است.\n2. با توجه به مختصات نقاط و تعریف دایره مثلثاتی، روابط مختصات نقاط را به دست آورید، مثلاً xQ = -xP و yQ = yP برای زاویه π-α.\n3. با استفاده از روابط مختصات، مقادیر توابع مثلثاتی را برای زاویه‌های π-α و π+α به صورت تابعی از α بنویسید.\n4. از روابط اولیه توابع مثلثاتی (sin, cos, tan, cot) استفاده کنید تا روابط زیر را اثبات یا کامل کنید:\n - sin(π-α) = sin α\n - cos(π-α) = -cos α\n - tan(π-α) = -tan α\n - cot(π-α) = -cot α\n - sin(π+α) = -sin α\n - cos(π+α) = -cos α\n - tan(π+α) = tan α\n - cot(π+α) = cot α\n5. برای محاسبه مقادیر عددی توابع مثلثاتی زاویه‌های داده شده، از این روابط استفاده کنید و مقادیر را به صورت عددی محاسبه نمایید.",
"example": "sin ۱۵۰؟",
"steps": [
"۱۵۰ = ۱۸۰ − ۳۰.",
@@ -171894,7 +171894,7 @@
"تابع f یک به یک است و بنابراین وارون‌پذیر است.",
"نمودار تابع وارون f⁻¹ با تقارن نسبت به خط y = x رسم می‌شود.",
"برای یافتن ضابطه تابع وارون، معادله y = x³ را نسبت به x حل می‌کنیم:",
"x = y^(1/3)",
"x = y به توانِ (1/3) ",
"✅ جواب: f⁻¹(x) = ³√x"
],
"figures": [
@@ -173249,19 +173249,19 @@
{
"title": "تشخیص ابعاد و عناصر ماتریس",
"introText": "1. تعداد سطرهای ماتریس را بشمارید.\n2. تعداد ستون‌های ماتریس را بشمارید.\n3. ابعاد ماتریس را به صورت m×n بنویسید که m تعداد سطرها و n تعداد ستون‌ها است.\n4. هر عنصر ماتریس را با توجه به موقعیت سطر و ستون آن مشخص کنید.\n5. اعداد حقیقی داخل ماتریس را به صورت دقیق یادداشت کنید.",
"example": "ماتریس B به ابعاد m×n با درایه‌های b_ij که i=1 تا m و j=1 تا n تغییر می‌کند، نمایش داده شده است. ماتریس B را به صورت درایه‌ای نمایش دهید.",
"example": "ماتریس B به ابعاد m×n با درایه‌های bᵢⱼ که i=1 تا m و j=1 تا n تغییر می‌کند، نمایش داده شده است. ماتریس B را به صورت درایه‌ای نمایش دهید.",
"steps": [
"ماتریس B به صورت زیر نمایش داده می‌شود:",
"B_(m×n) = b₁₁ b₁₂ ⋯ b_(1j) ⋯ b_(1n)",
"b₂₁ b₂₂ ⋯ b_(2j) ⋯ b_(2n)",
"B(m×n) = b₁₁ b₁₂ ⋯ b(1j) ⋯ b(1n)",
"b₂₁ b₂₂ ⋯ b(2j) ⋯ b(2n)",
"vdots vdots ddots vdots ddots vdots",
"b_(i1) b_(i2) ⋯ b_(ij) ⋯ b_(in)",
"✅ جواب: نمایش درایه‌ای ماتریس B با b_(ij) برای سطر i و ستون j صحیح است."
"b(i1) b(i2) ⋯ b(ij) ⋯ b(in)",
"✅ جواب: نمایش درایه‌ای ماتریس B با b(ij) برای سطر i و ستون j صحیح است."
]
},
{
"title": "نمایش ماتریس با درایه‌ها",
"introText": "1. ماتریس را با ابعاد مشخص (m×n) در نظر بگیرید.\n2. هر درایه ماتریس را با اندیس سطر و ستون آن مشخص کنید، به صورت b_ij که i شماره سطر و j شماره ستون است.\n3. ماتریس را به صورت یک جدول مستطیلی با درایه‌های مشخص شده نمایش دهید.",
"introText": "1. ماتریس را با ابعاد مشخص (m×n) در نظر بگیرید.\n2. هر درایه ماتریس را با اندیس سطر و ستون آن مشخص کنید، به صورت bᵢⱼ که i شماره سطر و j شماره ستون است.\n3. ماتریس را به صورت یک جدول مستطیلی با درایه‌های مشخص شده نمایش دهید.",
"example": "در ماتریس A با سطرهای (۲، −۱، ۴) و (۰، ۷، ۳)، درایهٔ a₂₃ و ابعاد A را بنویسید.",
"steps": [
"a₂₃ یعنی سطر دوم، ستون سوم.",
@@ -173271,8 +173271,8 @@
},
{
"title": "ساخت ماتریس با شرایط درایه‌ها",
"introText": "1. ماتریس را با ابعاد مشخص (مثلاً ۲×۲) در نظر بگیرید.\n2. برای هر درایه a_ij شرط داده شده را اعمال کنید (مثلاً a_ij=7 اگر i=j، a_ij=5 اگر i>j و a_ij=-2 اگر i<j).\n3. درایه‌ها را بر اساس این شرایط مقداردهی کنید.\n4. ماتریس نهایی را با درایه‌های مقداردهی شده نمایش دهید.",
"example": "ماتریس ۲×۲ بسازید که a_ij = i + 2j باشد.",
"introText": "1. ماتریس را با ابعاد مشخص (مثلاً ۲×۲) در نظر بگیرید.\n2. برای هر درایه aᵢⱼ شرط داده شده را اعمال کنید (مثلاً aᵢⱼ=7 اگر i=j، aᵢⱼ=5 اگر i>j و aᵢⱼ=-2 اگر i<j).\n3. درایه‌ها را بر اساس این شرایط مقداردهی کنید.\n4. ماتریس نهایی را با درایه‌های مقداردهی شده نمایش دهید.",
"example": "ماتریس ۲×۲ بسازید که aᵢⱼ = i + 2j باشد.",
"steps": [
"a₁₁ = ۱ + ۲ = ۳ و a₁₂ = ۱ + ۴ = ۵.",
"a₂₁ = ۲ + ۲ = ۴ و a₂₂ = ۲ + ۴ = ۶.",
@@ -173291,7 +173291,7 @@
},
{
"title": "تشخیص ماتریس مربعی و قطری",
"introText": "1. بررسی تعداد سطرها و ستون‌ها: اگر تعداد سطرها و ستون‌ها برابر باشد، ماتریس مربعی است.\n2. تعیین قطر اصلی: عناصر a_ii که در قطر اصلی قرار دارند مشخص می‌شوند.\n3. بررسی صفر بودن عناصر خارج از قطر اصلی: اگر تمام عناصر خارج از قطر اصلی صفر باشند، ماتریس قطری است.",
"introText": "1. بررسی تعداد سطرها و ستون‌ها: اگر تعداد سطرها و ستون‌ها برابر باشد، ماتریس مربعی است.\n2. تعیین قطر اصلی: عناصر aᵢᵢ که در قطر اصلی قرار دارند مشخص می‌شوند.\n3. بررسی صفر بودن عناصر خارج از قطر اصلی: اگر تمام عناصر خارج از قطر اصلی صفر باشند، ماتریس قطری است.",
"example": "کدام ماتریس قطری است: سطرهای (۳،۰) و (۰،−۲) یا (۳،۱) و (۰،−۲)؟",
"steps": [
"قطری یعنی مربعی با همهٔ درایه‌های خارج قطر اصلی صفر.",
@@ -173347,7 +173347,7 @@
},
{
"title": "برابر بودن دو ماتریس",
"introText": "برای بررسی برابر بودن دو ماتریس هم‌مرتبه A و B، درایه‌های متناظر آن‌ها را با هم برابر قرار می‌دهیم. یعنی برای هر i و j داریم a_ij = b_ij. سپس معادلات به دست آمده را حل می‌کنیم تا مقادیر مجهولات پیدا شود.",
"introText": "برای بررسی برابر بودن دو ماتریس هم‌مرتبه A و B، درایه‌های متناظر آن‌ها را با هم برابر قرار می‌دهیم. یعنی برای هر i و j داریم aᵢⱼ = bᵢⱼ. سپس معادلات به دست آمده را حل می‌کنیم تا مقادیر مجهولات پیدا شود.",
"example": "دو ماتریس با سطرهای (x، ۳) و (۱، y) و (۵، ۳) و (۱، −۲) برابرند. x و y؟",
"steps": [
"درایه‌های متناظر برابرند.",
@@ -173357,7 +173357,7 @@
},
{
"title": "جمع ماتریس‌ها",
"introText": "برای جمع دو ماتریس هم‌مرتبه A و B، درایه‌های متناظر آن‌ها را با هم جمع می‌کنیم. یعنی اگر A = [a_ij] و B = [b_ij] باشند، حاصل جمع A + B = [a_ij + b_ij] است. این عمل برای هر درایه انجام می‌شود تا ماتریس جدید به دست آید.",
"introText": "برای جمع دو ماتریس هم‌مرتبه A و B، درایه‌های متناظر آن‌ها را با هم جمع می‌کنیم. یعنی اگر A = [aᵢⱼ] و B = [bᵢⱼ] باشند، حاصل جمع A + B = [aᵢⱼ + bᵢⱼ] است. این عمل برای هر درایه انجام می‌شود تا ماتریس جدید به دست آید.",
"example": "(۱، ۲؛ ۳، ۴) + (۵، ۰؛ −۱، ۲) را حساب کنید.",
"steps": [
"درایه‌های متناظر را جمع می‌کنیم.",
@@ -173383,7 +173383,7 @@
},
{
"title": "ضرب عدد حقیقی در ماتریس",
"introText": "برای ضرب یک عدد حقیقی r در ماتریس A که ابعاد m×n دارد، هر عنصر ماتریس A را در عدد r ضرب می‌کنیم. به عبارت دیگر، اگر A = [a_ij] باشد، ماتریس حاصل rA = [r * a_ij] است.",
"introText": "برای ضرب یک عدد حقیقی r در ماتریس A که ابعاد m×n دارد، هر عنصر ماتریس A را در عدد r ضرب می‌کنیم. به عبارت دیگر، اگر A = [aᵢⱼ] باشد، ماتریس حاصل rA = [r * aᵢⱼ] است.",
"example": "ماتریس A = (۱، −۲؛ ۳، ۰) را در ۳ ضرب کنید.",
"steps": [
"هر درایه در ۳ ضرب می‌شود.",
@@ -173449,7 +173449,7 @@
},
{
"title": "ضرب ماتریس‌ها",
"introText": "برای ضرب دو ماتریس A و B که ابعادشان به گونه‌ای است که تعداد ستون‌های A برابر با تعداد سطرهای B باشد، عنصر c_ij از ماتریس حاصل C برابر است با حاصل ضرب درایه‌های سطر iام ماتریس A در درایه‌های ستون jام ماتریس B و جمع آن‌ها. به عبارت دیگر، c_ij = a_i1*b_1j + a_i2*b_2j + ... + a_ip*b_pj. سپس این کار برای همه درایه‌های ماتریس C انجام می‌شود تا ماتریس حاصل کامل شود.",
"introText": "برای ضرب دو ماتریس A و B که ابعادشان به گونه‌ای است که تعداد ستون‌های A برابر با تعداد سطرهای B باشد، عنصر cᵢⱼ از ماتریس حاصل C برابر است با حاصل ضرب درایه‌های سطر iام ماتریس A در درایه‌های ستون jام ماتریس B و جمع آن‌ها. به عبارت دیگر، cᵢⱼ = aᵢ₁*b₁j + aᵢ₂*b₂j + ... + aᵢₚ*bₚⱼ. سپس این کار برای همه درایه‌های ماتریس C انجام می‌شود تا ماتریس حاصل کامل شود.",
"example": "(۱، ۲؛ ۳، ۴) × (۰، ۱؛ ۱، ۰) را حساب کنید.",
"steps": [
"درایهٔ (۱،۱): ۱×۰ + ۲×۱ = ۲؛ (۱،۲): ۱×۱ + ۲×۰ = ۱.",
@@ -173516,7 +173516,7 @@
{
"title": "تعیین عناصر ماتریس با شرایط داده شده",
"introText": "1. ماتریس را با ابعاد داده شده تعریف کنید.\n2. بر اساس شرط داده شده برای عناصر ماتریس (مثلاً برای i=j مقدار ثابت، برای i>j مقدار تابعی از i و j، و برای i<j مقدار تابعی دیگر) هر عنصر را تعیین کنید.\n3. ماتریس نهایی را با جایگذاری مقادیر به دست آمده بنویسید.",
"example": "ماتریس ۲×۲ با درایه‌هایی که a_ij = ۱ اگر i = j و a_ij = ۰ در غیر این صورت.",
"example": "ماتریس ۲×۲ با درایه‌هایی که aᵢⱼ = ۱ اگر i = j و aᵢⱼ = ۰ در غیر این صورت.",
"steps": [
"درایه‌های قطر ۱ و بقیه ۰.",
"ماتریس همانی.",
@@ -173572,7 +173572,7 @@
{
"title": "محاسبه ضرب دو ماتریس با عناصر تعریف شده به صورت شرطی",
"introText": "1. ماتریس‌های A و B را با توجه به تعریف شرطی عناصرشان بنویسید.\n2. عناصر ماتریس‌ها را برای هر i,j محاسبه کنید.\n3. ضرب ماتریس‌ها را با استفاده از تعریف ضرب ماتریسی انجام دهید.\n4. ماتریس‌های حاصل B×A و A×B را محاسبه کنید.",
"example": "ماتریس A ۲×۲ با a_ij = i×j و B = I. حاصل AB؟",
"example": "ماتریس A ۲×۲ با aᵢⱼ = i×j و B = I. حاصل AB؟",
"steps": [
"A = (۱،۲؛۲،۴).",
"AI = A.",
@@ -173939,7 +173939,7 @@
"lessons": [
{
"title": "مرتبه و درایه",
"introText": "ماتریسِ m × n دارای m سطر و n ستون است؛ a_ij درایه‌ی سطر i و ستونِ j است. در پرسش‌ها هر کروشه‌ی داخلی یک سطر است.",
"introText": "ماتریسِ m × n دارای m سطر و n ستون است؛ aᵢⱼ درایه‌ی سطر i و ستونِ j است. در پرسش‌ها هر کروشه‌ی داخلی یک سطر است.",
"example": "",
"steps": []
},
@@ -174234,7 +174234,7 @@
"steps": []
},
{
"title": "تقسیم‌پذیری و توان‌ها (اگر a|b آنگاه a|b^n)",
"title": "تقسیم‌پذیری و توان‌ها (اگر a|b آنگاه a|bⁿ)",
"introText": "روش معمول: استقراء ریاضی روی n. پایه: برای n=1 حکم درست است چون a|b فرض شده. فرض استقرایی: فرض کنید a|bᵏ برای برخی k≥1. گام استقرایی: bᵏ⁺¹ = bᵏ·b؛ از فرض استقرایی a|bᵏ و از فرض اولیه a|b نتیجه می‌شود a|bᵏ⁺¹ (زیرا اگر a|X و a|Y آنگاه a|(X·Y) با توجه به فرم X و Y و اینکه یکی از آنها مضربی از a است). بنابراین برای همه n طبیعی a|bⁿ.",
"example": "",
"steps": []
@@ -174469,13 +174469,13 @@
},
{
"title": "یافتن باقی‌مانده تقسیم عدد بر ۳",
"introText": "عدد n رقمی را به صورت A = aₙ₋₁aₙ₋₂...a_1a₀ در نظر می‌گیریم. با توجه به هم‌نهشتی 10ᵏ ≡ 1 (mod 3) برای هر k، عدد A ≡ aₙ₋₁ + aₙ₋₂ + ... + a₁ + a₀ (mod 3) است. بنابراین باقی‌مانده تقسیم عدد بر ۳ برابر باقی‌مانده جمع ارقام آن بر ۳ است.",
"introText": "عدد n رقمی را به صورت A = aₙ₋₁aₙ₋₂...a₁a₀ در نظر می‌گیریم. با توجه به هم‌نهشتی 10ᵏ ≡ 1 (mod 3) برای هر k، عدد A ≡ aₙ₋₁ + aₙ₋₂ + ... + a₁ + a₀ (mod 3) است. بنابراین باقی‌مانده تقسیم عدد بر ۳ برابر باقی‌مانده جمع ارقام آن بر ۳ است.",
"example": "",
"steps": []
},
{
"title": "یافتن باقی‌مانده تقسیم عدد بر ۱۱ با توجه به توان‌های فرد و زوج ۱۰",
"introText": "عدد n رقمی را به صورت A = aₙ₋₁aₙ₋₂...a_1a₀ در نظر می‌گیریم. با توجه به اینکه 10² ≡ 1 (mod 11) و 10¹ ≡ -1 (mod 11)، توان‌های زوج ۱۰ برابر ۱ و توان‌های فرد برابر -۱ در هم‌نهشتی با ۱۱ هستند. بنابراین A ≡ a₀ - a₁ + a₂ - a₃ + ... (mod 11) است. باقی‌مانده تقسیم عدد بر ۱۱ برابر باقی‌مانده این جمع متناوب است.",
"introText": "عدد n رقمی را به صورت A = aₙ₋₁aₙ₋₂...a₁a₀ در نظر می‌گیریم. با توجه به اینکه 10² ≡ 1 (mod 11) و 10¹ ≡ -1 (mod 11)، توان‌های زوج ۱۰ برابر ۱ و توان‌های فرد برابر -۱ در هم‌نهشتی با ۱۱ هستند. بنابراین A ≡ a₀ - a₁ + a₂ - a₃ + ... (mod 11) است. باقی‌مانده تقسیم عدد بر ۱۱ برابر باقی‌مانده این جمع متناوب است.",
"example": "",
"steps": []
},
@@ -174697,7 +174697,7 @@
},
{
"title": "استفاده از بسط دو جمله‌ای برای اثبات هم‌نهشتی",
"introText": "با استفاده از فرمول بسط دو جمله‌ای (a + b)ⁿ و خواص هم‌نهشتی، می‌توان اثبات کرد که (a + b)^ab ≡ aⁿ + bⁿ (mod m) برای اعداد صحیح a,b و n برقرار است.",
"introText": "با استفاده از فرمول بسط دو جمله‌ای (a + b)ⁿ و خواص هم‌نهشتی، می‌توان اثبات کرد که (a + b) به توانِ ab ≡ aⁿ + bⁿ (mod m) برای اعداد صحیح a,b و n برقرار است.",
"example": "",
"steps": []
},
@@ -174852,7 +174852,7 @@
},
{
"title": "تعدادِ مقسوم‌علیه‌ها",
"introText": "اگر n = p₁^a₁ ⋯ pₖ^aₖ آنگاه تعدادِ مقسوم‌علیه‌ها (a₁+۱)⋯(aₖ+۱) است.",
"introText": "اگر n = p₁ᵃ₁ ⋯ pₖᵃₖ آنگاه تعدادِ مقسوم‌علیه‌ها (a₁+۱)⋯(aₖ+۱) است.",
"example": "",
"steps": []
}
@@ -183403,7 +183403,7 @@
},
{
"title": "شناسایی رئوس مجاور (همسایه) و مجموعه همسایگی در گراف",
"introText": "1. دو راس u و v را مجاور یا همسایه می‌نامیم اگر یالی بین آن‌ها وجود داشته باشد.\n2. مجموعه همسایگی باز N_G(v) شامل تمام رئوسی است که به راس v متصل هستند.\n3. مجموعه همسایگی بسته N_G[v] شامل مجموعه همسایگی باز به علاوه خود راس v است.\n4. برای هر راس، مجموعه همسایگی باز و بسته را با بررسی یال‌های متصل به آن تعیین کنید.",
"introText": "1. دو راس u و v را مجاور یا همسایه می‌نامیم اگر یالی بین آن‌ها وجود داشته باشد.\n2. مجموعه همسایگی باز NG(v) شامل تمام رئوسی است که به راس v متصل هستند.\n3. مجموعه همسایگی بسته NG[v] شامل مجموعه همسایگی باز به علاوه خود راس v است.\n4. برای هر راس، مجموعه همسایگی باز و بسته را با بررسی یال‌های متصل به آن تعیین کنید.",
"example": "مجموعهٔ همسایگی رأس v را در گراف شکل بنویسید.",
"steps": [
"همسایه‌ها رأس‌هایی هستند که با یال به v وصل‌اند.",
@@ -188059,7 +188059,7 @@
},
{
"title": "تعیین حد تابع 1/x وقتی x به صفر از سمت چپ نزدیک می‌شود",
"introText": "1. بررسی مقادیر تابع 1/x برای x نزدیک به صفر از سمت چپ (مقادیر منفی کوچک).\n2. مشاهده اینکه مقادیر تابع به سمت منفی بی‌نهایت میل می‌کنند.\n3. نوشتن حد به صورت lim(x → 0^-) 1/x = -∞.",
"introText": "1. بررسی مقادیر تابع 1/x برای x نزدیک به صفر از سمت چپ (مقادیر منفی کوچک).\n2. مشاهده اینکه مقادیر تابع به سمت منفی بی‌نهایت میل می‌کنند.\n3. نوشتن حد به صورت lim(x → 0⁻) 1/x = -∞.",
"example": "حد تابع 1/x را وقتی x به صفر از سمت چپ نزدیک می‌شود، تعیین کنید.",
"steps": [
"برای x های نزدیک به صفر از سمت چپ، مقادیر x منفی هستند، مانند -0.1، -0.01 و -0.001.",
@@ -190099,7 +190099,7 @@
},
{
"title": "حد چند جمله‌ای‌ها در بی‌نهایت",
"introText": "حد یک چند جمله‌ای f(x) = aₙ xⁿ + a_(n-1) xⁿ⁻¹ + ... + a₁ x + a₀ وقتی x به ±∞ می‌رود برابر حد جمله‌ای است که دارای بزرگ‌ترین درجه است، یعنی:\nlim (x→±∞) f(x) = lim (x→±∞) aₙ xⁿ",
"introText": "حد یک چند جمله‌ای f(x) = aₙ xⁿ + a(n-1) xⁿ⁻¹ + ... + a₁ x + a₀ وقتی x به ±∞ می‌رود برابر حد جمله‌ای است که دارای بزرگ‌ترین درجه است، یعنی:\nlim (x→±∞) f(x) = lim (x→±∞) aₙ xⁿ",
"example": "lim(x → ∞) (−۲x³ + x)",
"steps": [
"جمله با بزرگ‌ترین توان: −۲x³.",
@@ -193275,7 +193275,7 @@
},
{
"title": "نمایش بردارهای یکه در مختصات سه‌بعدی",
"introText": "برای نمایش یک بردار دلخواه در صفحه سه‌بعدی، ابتدا بردارهای یکه در جهت محورهای x، y و z را معرفی می‌کنیم که به ترتیب i = (1,0,0)، j = (0,1,0) و k = (0,0,1) هستند. سپس هر بردار دلخواه a را به صورت ترکیب خطی از این بردارهای پایه می‌نویسیم: a = a_x i + a_y j + a_z k که در آن a_x، a_y و a_z مولفه‌های بردار در جهت محورهای x، y و z هستند. برای یافتن این مولفه‌ها، مقادیر متناظر در هر محور را استخراج می‌کنیم.",
"introText": "برای نمایش یک بردار دلخواه در صفحه سه‌بعدی، ابتدا بردارهای یکه در جهت محورهای x، y و z را معرفی می‌کنیم که به ترتیب i = (1,0,0)، j = (0,1,0) و k = (0,0,1) هستند. سپس هر بردار دلخواه a را به صورت ترکیب خطی از این بردارهای پایه می‌نویسیم: a = aₓ i + ay j + az k که در آن aₓ، ay و az مولفه‌های بردار در جهت محورهای x، y و z هستند. برای یافتن این مولفه‌ها، مقادیر متناظر در هر محور را استخراج می‌کنیم.",
"example": "در فضا بردار (۲،−۳،۵) را با i و j و k بنویسید.",
"steps": [
"مؤلفه‌ها ضرایب i و j و k‌اند.",
@@ -196748,7 +196748,7 @@
},
{
"title": "تعداد جواب‌های صحیح و مثبت معادلات ترکیبی با شرط‌های نامساوی چندگانه",
"introText": "برای معادله x₁ + x₂ + ... + xₖ = n با چند شرط نامساوی مانند xᵢ > aᵢ و x_j > b_j، ابتدا همه حداقل‌ها را از متغیرها کم می‌کنیم تا متغیرهای جدید با حداقل صفر داشته باشیم. سپس معادله جدید را حل می‌کنیم. تعداد جواب‌ها با فرمول ترکیب با تکرار محاسبه می‌شود. اگر شرط‌ها پیچیده‌تر باشند، ممکن است نیاز به روش‌های شمارش ترکیبی پیشرفته‌تر باشد.",
"introText": "برای معادله x₁ + x₂ + ... + xₖ = n با چند شرط نامساوی مانند xᵢ > aᵢ و xⱼ > bⱼ، ابتدا همه حداقل‌ها را از متغیرها کم می‌کنیم تا متغیرهای جدید با حداقل صفر داشته باشیم. سپس معادله جدید را حل می‌کنیم. تعداد جواب‌ها با فرمول ترکیب با تکرار محاسبه می‌شود. اگر شرط‌ها پیچیده‌تر باشند، ممکن است نیاز به روش‌های شمارش ترکیبی پیشرفته‌تر باشد.",
"example": "",
"steps": []
},
@@ -196914,7 +196914,7 @@
{
"title": "تعریف و شناسایی مربع لاتین متعامد",
"introText": "برای تعریف مربع لاتین متعامد، دو مربع لاتین هم‌مرتبه A و B را در نظر می‌گیریم که کنار هم قرار گرفته‌اند. مربع جدیدی از زوج مرتب‌ها تشکیل می‌شود که هر خانه آن شامل یک عدد از A و یک عدد از B است. اگر هیچ زوج عددی در خانه‌های مربع جدید تکرار نشود، این دو مربع لاتین را متعامد می‌نامیم. برای شناسایی مربع‌های متعامد، باید بررسی کنیم که هیچ زوج مرتب تکراری در مربع جدید وجود نداشته باشد.",
"example": "دو مربع لاتین A و B (شکل) را در نظر بگیرید. آیا متعامدند؟ (یعنی زوج‌های (A_ij، B_ij) همه متمایز باشند.)",
"example": "دو مربع لاتین A و B (شکل) را در نظر بگیرید. آیا متعامدند؟ (یعنی زوج‌های (Aᵢⱼ، Bᵢⱼ) همه متمایز باشند.)",
"steps": [
"زوج‌ها: (۱،۱)، (۲،۲)، (۳،۳)؛ (۲،۳)، (۳،۱)، (۱،۲)؛ (۳،۲)، (۱،۳)، (۲،۱).",
"نه زوجی تکرار شده.",
@@ -196998,7 +196998,7 @@
{
"title": "تشخیص متعامد بودن دو ماتریس لاتین",
"introText": "برای بررسی متعامد بودن دو ماتریس لاتین A و B به این صورت عمل می‌کنیم: 1. ماتریس‌های A و B را که هر کدام n×n هستند در نظر می‌گیریم. 2. بررسی می‌کنیم که در هر جایگاه (درایه) از ماتریس A و ماتریس B، اعداد متناظر با هم متفاوت باشند. 3. اگر در هر دو ماتریس، جایگاه‌های متناظر اعداد یکسانی نداشته باشند (یعنی هیچ عددی در جایگاه متناظر در هر دو ماتریس تکرار نشود)، ماتریس‌ها متعامد هستند. 4. در غیر این صورت، ماتریس‌ها متعامد نیستند. این روش به ما کمک می‌کند تا با مقایسه جایگاه‌های اعداد در دو ماتریس لاتین، متعامد بودن آن‌ها را تشخیص دهیم.",
"example": "دو مربع لاتین A و B (شکل) را در نظر بگیرید. آیا متعامدند؟ (یعنی زوج‌های (A_ij، B_ij) همه متمایز باشند.)",
"example": "دو مربع لاتین A و B (شکل) را در نظر بگیرید. آیا متعامدند؟ (یعنی زوج‌های (Aᵢⱼ، Bᵢⱼ) همه متمایز باشند.)",
"steps": [
"زوج‌ها: (۱،۱)، (۲،۲)، (۳،۳)؛ (۲،۳)، (۳،۱)، (۱،۲)؛ (۳،۲)، (۱،۳)، (۲،۱).",
"نه زوجی تکرار شده.",
@@ -197350,7 +197350,7 @@
},
{
"title": "تعریف و شمارش مجموعه‌های گراف‌های طراحی شده با شرایط اشتراک",
"introText": "۱. مجموعه‌های گراف‌های طراحی شده را تعریف کنید (مثلاً Aₖ، A_a، A_h). ۲. شرایط اشتراک مجموعه‌ها را بررسی کنید (مثلاً تعداد گراف‌هایی که در اشتراک دو یا سه مجموعه هستند). ۳. از روابط شمارشی و اصل شمول و عدم شمول استفاده کنید. ۴. گراف‌های متقارن را شناسایی و رسم کنید. ۵. نتیجه نهایی تعداد گراف‌های موردنظر را به دست آورید.",
"introText": "۱. مجموعه‌های گراف‌های طراحی شده را تعریف کنید (مثلاً Aₖ، Aₐ، Aₕ). ۲. شرایط اشتراک مجموعه‌ها را بررسی کنید (مثلاً تعداد گراف‌هایی که در اشتراک دو یا سه مجموعه هستند). ۳. از روابط شمارشی و اصل شمول و عدم شمول استفاده کنید. ۴. گراف‌های متقارن را شناسایی و رسم کنید. ۵. نتیجه نهایی تعداد گراف‌های موردنظر را به دست آورید.",
"example": "",
"steps": []
}
@@ -197983,7 +197983,7 @@
},
{
"title": "محاسبه شیب خط مماس و خط قاطع بر منحنی",
"introText": "1. یک نقطه ثابت A روی منحنی انتخاب کنید.\n2. نقاط دیگری مانند B و C روی منحنی انتخاب کنید که به A نزدیک می‌شوند.\n3. خط قاطعی که از دو نقطه A و B می‌گذرد رسم کنید و شیب آن را با فرمول m = (y_B - y_A) / (x_B - x_A) محاسبه کنید.\n4. همین کار را برای نقاط دیگر مانند A و C انجام دهید.\n5. با نزدیک‌تر کردن نقاط به A، شیب خطوط قاطع به شیب خط مماس در نقطه A نزدیک می‌شود.\n6. شیب خط مماس در نقطه A برابر حد شیب خطوط قاطع گذرنده از A است وقتی نقاط به A نزدیک می‌شوند.",
"introText": "1. یک نقطه ثابت A روی منحنی انتخاب کنید.\n2. نقاط دیگری مانند B و C روی منحنی انتخاب کنید که به A نزدیک می‌شوند.\n3. خط قاطعی که از دو نقطه A و B می‌گذرد رسم کنید و شیب آن را با فرمول m = (yB - yA) / (xB - xA) محاسبه کنید.\n4. همین کار را برای نقاط دیگر مانند A و C انجام دهید.\n5. با نزدیک‌تر کردن نقاط به A، شیب خطوط قاطع به شیب خط مماس در نقطه A نزدیک می‌شود.\n6. شیب خط مماس در نقطه A برابر حد شیب خطوط قاطع گذرنده از A است وقتی نقاط به A نزدیک می‌شوند.",
"example": "شیب قاطع y = x² بین x = ۱ و ۳.",
"steps": [
"(۹ − ۱)/(۳ − ۱).",
@@ -198028,14 +198028,14 @@
},
{
"title": "محاسبه شیب خط مماس و متوسط",
"introText": "برای محاسبه شیب خط AB که یک خط متوسط است، شیب را به صورت نسبت تغییرات عمودی Δy به تغییرات افقی Δx تعریف می‌کنیم: m_AB = Δy / Δx. برای نقاط نزدیک به هم، این مقدار تقریب خوبی از شیب خط مماس است. با کاهش Δx به سمت صفر، شیب خط متوسط به شیب خط مماس در نقطه A نزدیک می‌شود. بنابراین، برای محاسبه شیب خط مماس، ابتدا تغییرات Δx و Δy را محاسبه می‌کنیم و سپس نسبت آنها را می‌گیریم. در هنگام محاسبه شیب‌های بالا، تغییرات Δx کوچکتر می‌شوند و این باعث تغییر مقدار شیب می‌شود.",
"example": "با توجه به تابع f(x) = 3x - 5 و نقاط A و B با مختصات x_A = 1 و x_B = 4، شیب خط AB را محاسبه کنید.",
"introText": "برای محاسبه شیب خط AB که یک خط متوسط است، شیب را به صورت نسبت تغییرات عمودی Δy به تغییرات افقی Δx تعریف می‌کنیم: mAB = Δy / Δx. برای نقاط نزدیک به هم، این مقدار تقریب خوبی از شیب خط مماس است. با کاهش Δx به سمت صفر، شیب خط متوسط به شیب خط مماس در نقطه A نزدیک می‌شود. بنابراین، برای محاسبه شیب خط مماس، ابتدا تغییرات Δx و Δy را محاسبه می‌کنیم و سپس نسبت آنها را می‌گیریم. در هنگام محاسبه شیب‌های بالا، تغییرات Δx کوچکتر می‌شوند و این باعث تغییر مقدار شیب می‌شود.",
"example": "با توجه به تابع f(x) = 3x - 5 و نقاط A و B با مختصات xA = 1 و xB = 4، شیب خط AB را محاسبه کنید.",
"steps": [
"ابتدا Δx را محاسبه می‌کنیم: Δx = 4 - 1 = 3.",
"سپس مقدار تابع را برای x_A محاسبه می‌کنیم: f(1) = 3(1) - 5 = -2.",
"حالا مقدار تابع را برای x_B محاسبه می‌کنیم: f(4) = 3(4) - 5 = 7.",
"سپس مقدار تابع را برای xA محاسبه می‌کنیم: f(1) = 3(1) - 5 = -2.",
"حالا مقدار تابع را برای xB محاسبه می‌کنیم: f(4) = 3(4) - 5 = 7.",
"حالا Δy را محاسبه می‌کنیم: Δy = 7 - (-2) = 9.",
"در نهایت، شیب خط AB را محاسبه می‌کنیم: m_AB = Δy / Δx = 9 / 3 = 3.",
"در نهایت، شیب خط AB را محاسبه می‌کنیم: mAB = Δy / Δx = 9 / 3 = 3.",
"✅ جواب: 3"
],
"figures": [
@@ -198316,7 +198316,7 @@
},
{
"title": "محاسبه شیب خط قطعی بین دو نقطه روی منحنی",
"introText": "1. دو نقطه A و B روی منحنی با مختصات (a, f(a)) و (a+Δx, f(a+Δx)) را مشخص کنید.\n2. شیب خط قطعی بین این دو نقطه را با فرمول m_AB = [f(a+Δx) - f(a)] / Δx محاسبه کنید.\n3. اگر Δx به سمت صفر میل کند، شیب خط مماس به دست می‌آید که همان مشتق در نقطه a است.",
"introText": "1. دو نقطه A و B روی منحنی با مختصات (a, f(a)) و (a+Δx, f(a+Δx)) را مشخص کنید.\n2. شیب خط قطعی بین این دو نقطه را با فرمول mAB = [f(a+Δx) - f(a)] / Δx محاسبه کنید.\n3. اگر Δx به سمت صفر میل کند، شیب خط مماس به دست می‌آید که همان مشتق در نقطه a است.",
"example": "شیب قاطع f(x) = x² بین ۱ و ۲.",
"steps": [
"(۴ − ۱)/۱.",
@@ -198464,13 +198464,13 @@
{
"title": "محاسبه مشتق تابع و بررسی نقاط مشتق‌پذیری با نمودار",
"introText": "برای محاسبه مشتق تابع f(x) = -x² + 1 ابتدا مشتق تابع را به صورت f'(x) = -2x محاسبه می‌کنیم. سپس مقادیر مشتق را در نقاط داده شده مانند x=5 و x=8 جایگذاری می‌کنیم. برای تعیین نقاطی که مشتق در آنها قرینه است، مقادیر مشتق را در نقاط مختلف بررسی می‌کنیم. با استفاده از نمودار تابع، نقاطی که مشتق مثبت یا منفی است را مشخص می‌کنیم. همچنین شیب خطوط مماس بر منحنی در نقاط مختلف را با هم مقایسه می‌کنیم. در نهایت با محاسبه مشتق در نقاط مشخص شده، صحت حدس‌های مربوط به مشتق را بررسی می‌کنیم.",
"example": "تابع f(x) = -x² + 10 داده شده است. نقاط A(2, f(2)) و B(6, f(6)) روی منحنی در بازه 0 ≤ x ≤ 10 در نظر گرفته شده‌اند. شیب خطی که از نقاط A و B می‌گذرد یعنی m_AB را به دست آورید.",
"example": "تابع f(x) = -x² + 10 داده شده است. نقاط A(2, f(2)) و B(6, f(6)) روی منحنی در بازه 0 ≤ x ≤ 10 در نظر گرفته شده‌اند. شیب خطی که از نقاط A و B می‌گذرد یعنی mAB را به دست آورید.",
"steps": [
"مقادیر تابع را در نقاط A و B محاسبه می‌کنیم:",
"f(2) = -(2)² + 10 = -4 + 10 = 6",
"f(6) = -(6)² + 10 = -36 + 10 = -26",
"شیب خط قاطع m_AB را با فرمول شیب محاسبه می‌کنیم:",
"m_AB = (y_B - y_A) / (x_B - x_A) = (f(6) - f(2)) / (6 - 2) = (-26 - 6) / (4) = (-32) / 4 = -8",
"شیب خط قاطع mAB را با فرمول شیب محاسبه می‌کنیم:",
"mAB = (yB - yA) / (xB - xA) = (f(6) - f(2)) / (6 - 2) = (-26 - 6) / (4) = (-32) / 4 = -8",
"بنابراین شیب خط قاطع بین نقاط A و B برابر -8 است.",
"✅ جواب: −۸"
],
@@ -198944,7 +198944,7 @@
},
{
"title": "بررسی مشتق‌پذیری تابع در نقطه با استفاده از حدهای چپ و راست",
"introText": "۱. ابتدا تابع را در نقطه مورد نظر بررسی می‌کنیم و مقدار تابع در آن نقطه را می‌یابیم.\n۲. حد سمت راست مشتق را با استفاده از تعریف مشتق و حد حداقل به صورت lim(x → a^+) (f(x)-f(a))/(x-a) محاسبه می‌کنیم.\n۳. حد سمت چپ مشتق را به صورت lim(x → a^-) (f(x)-f(a))/(x-a) محاسبه می‌کنیم.\n۴. اگر حدهای چپ و راست برابر باشند، مشتق در آن نقطه وجود دارد و برابر با آن حد است.\n۵. اگر حدهای چپ و راست برابر نباشند، مشتق در آن نقطه وجود ندارد، حتی اگر تابع در آن نقطه پیوسته باشد.",
"introText": "۱. ابتدا تابع را در نقطه مورد نظر بررسی می‌کنیم و مقدار تابع در آن نقطه را می‌یابیم.\n۲. حد سمت راست مشتق را با استفاده از تعریف مشتق و حد حداقل به صورت lim(x → a⁺) (f(x)-f(a))/(x-a) محاسبه می‌کنیم.\n۳. حد سمت چپ مشتق را به صورت lim(x → a⁻) (f(x)-f(a))/(x-a) محاسبه می‌کنیم.\n۴. اگر حدهای چپ و راست برابر باشند، مشتق در آن نقطه وجود دارد و برابر با آن حد است.\n۵. اگر حدهای چپ و راست برابر نباشند، مشتق در آن نقطه وجود ندارد، حتی اگر تابع در آن نقطه پیوسته باشد.",
"example": "مشتق چپ و راست |x| در ۰؟",
"steps": [
"چپ −۱.",
@@ -198981,7 +198981,7 @@
},
{
"title": "محاسبه مشتق چپ و راست تابع در نقطه خاص",
"introText": "برای محاسبه مشتق راست تابع f در نقطه a، حد نسبت تغییرات تابع از سمت راست نقطه a را محاسبه می‌کنیم: f'_+(a) = lim (x→a^+) (f(x)-f(a))/(x-a). برای مشتق چپ نیز حد مشابه از سمت چپ نقطه a محاسبه می‌شود: f'_-(a) = lim (x→a^-) (f(x)-f(a))/(x-a). اگر این دو حد برابر باشند، مشتق تابع در نقطه a وجود دارد و برابر با این مقدار است. در غیر این صورت، مشتق در آن نقطه وجود ندارد ولی مشتق چپ و راست تعریف شده‌اند که به آنها نیم‌مماس چپ و راست گفته می‌شود.",
"introText": "برای محاسبه مشتق راست تابع f در نقطه a، حد نسبت تغییرات تابع از سمت راست نقطه a را محاسبه می‌کنیم: f'₊(a) = lim (x→a⁺) (f(x)-f(a))/(x-a). برای مشتق چپ نیز حد مشابه از سمت چپ نقطه a محاسبه می‌شود: f'₋(a) = lim (x→a⁻) (f(x)-f(a))/(x-a). اگر این دو حد برابر باشند، مشتق تابع در نقطه a وجود دارد و برابر با این مقدار است. در غیر این صورت، مشتق در آن نقطه وجود ندارد ولی مشتق چپ و راست تعریف شده‌اند که به آنها نیم‌مماس چپ و راست گفته می‌شود.",
"example": "f(x) = |x| : مشتق چپ و راست در ۰؟",
"steps": [
"−۱ و ۱.",
@@ -199017,7 +199017,7 @@
},
{
"title": "تعریف و محاسبه مشتق چپ و راست با استفاده از حد",
"introText": "مشتق راست تابع f در نقطه a به صورت حد زیر تعریف می‌شود: f'_+(a) = lim (x→a^+) (f(x) - f(a)) / (x - a) یا به صورت معادل: f'_+(a) = lim (h→0^+) (f(a + h) - f(a)) / h. مشتق چپ نیز به صورت f'_-(a) = lim (x→a^-) (f(x) - f(a)) / (x - a) یا f'_-(a) = lim (h→0^-) (f(a + h) - f(a)) / h تعریف می‌شود. اگر این دو حد برابر باشند، مشتق تابع در نقطه a وجود دارد و برابر با این مقدار است. در غیر این صورت، مشتق وجود ندارد ولی مشتق چپ و راست تعریف شده‌اند.",
"introText": "مشتق راست تابع f در نقطه a به صورت حد زیر تعریف می‌شود: f'₊(a) = lim (x→a⁺) (f(x) - f(a)) / (x - a) یا به صورت معادل: f'₊(a) = lim (h→0⁺) (f(a + h) - f(a)) / h. مشتق چپ نیز به صورت f'₋(a) = lim (x→a⁻) (f(x) - f(a)) / (x - a) یا f'₋(a) = lim (h→0⁻) (f(a + h) - f(a)) / h تعریف می‌شود. اگر این دو حد برابر باشند، مشتق تابع در نقطه a وجود دارد و برابر با این مقدار است. در غیر این صورت، مشتق وجود ندارد ولی مشتق چپ و راست تعریف شده‌اند.",
"example": "تابع f(x) = x² در نقطه a = 3 را در نظر بگیرید. مشتق راست و چپ این تابع را محاسبه کنید.",
"steps": [
"برای محاسبه مشتق راست، ابتدا f(3) را محاسبه می‌کنیم: f(3) = 3² = 9.",
@@ -199070,10 +199070,10 @@
"introText": "1. ابتدا پیوستگی تابع را در نقطه مورد نظر بررسی می‌کنیم. 2. مشتق چپ و مشتق راست تابع را در آن نقطه محاسبه می‌کنیم. 3. اگر مشتق چپ و مشتق راست برابر باشند، مشتق در آن نقطه وجود دارد و برابر با آن مقدار است. 4. اگر مشتق چپ و راست برابر نباشند یا حد مشتق وجود نداشته باشد، تابع در آن نقطه مشتق‌پذیر نیست.",
"example": "دو تابع مختلف f و g مثال بزنید که هر دو در x=2 پیوسته باشند ولی در این نقطه مشتق‌پذیر نباشند.",
"steps": [
"برای مثال تابع f(x) = |x-2| و تابع g(x) = (x-2)^(2/3) را در نظر بگیرید.",
"برای مثال تابع f(x) = |x-2| و تابع g(x) = (x-2) به توانِ (2/3) را در نظر بگیرید.",
"هر دو در x=2 پیوسته هستند زیرا مقدار تابع و حد چپ و راست برابر است.",
"اما مشتق چپ و راست در x=2 برابر نیستند، پس مشتق‌پذیر نیستند.",
"✅ جواب: f(x)=|x-2|, g(x)=(x-2)^(2/3)"
"✅ جواب: f(x)=|x-2|, g(x)=(x-2) به توانِ (2/3) "
],
"figures": [
{
@@ -199103,7 +199103,7 @@
"introText": "1. مشتق تابع را به صورت حد تعریف مشتق در نقطه مورد نظر محاسبه می‌کنیم. 2. اگر حد مشتق به بی‌نهایت میل کند، مشتق در آن نقطه وجود ندارد اما تابع ممکن است مشتق‌پذیر نباشد و دارای مماس قائم باشد. 3. شکل نمودار و خطوط مماس قائم را بررسی می‌کنیم تا رفتار تابع در آن نقطه را توصیف کنیم.",
"example": "مشتق ∛x در ۰؟",
"steps": [
"f′ = ۱/(۳ x^(۲/۳)) → ∞.",
"f′ = ۱/(۳ x به توانِ (۲/۳) ) → ∞.",
"مماس قائم.",
"✅ جواب: بی‌نهایت (مماس قائم)"
],
@@ -199408,10 +199408,10 @@
{
"title": "مشتق توابع با توان منفی و کسری",
"introText": "برای مشتق توابعی که به صورت توان منفی یا کسری هستند، ابتدا تابع را به صورت xⁿ با n عدد صحیح یا کسری بازنویسی می‌کنیم. سپس از قاعده مشتق توانی استفاده می‌کنیم: f'(x) = n*xⁿ⁻¹. در صورت وجود توان منفی، توان را کاهش می‌دهیم و علامت منفی را در مشتق لحاظ می‌کنیم.",
"example": "f(x) = x⁻² و x^(۱/۲).",
"example": "f(x) = x⁻² و x به توانِ (۱/۲) .",
"steps": [
"(x⁻²)′ = −۲x⁻³.",
"(x^(۱/۲))′ = ۱/(۲√x).",
"(x به توانِ (۱/۲) )′ = ۱/(۲√x).",
"✅ جواب: −۲x⁻³ و ۱/(۲√x)"
],
"figures": [
@@ -199419,7 +199419,7 @@
"where": "example",
"diagram": {
"kind": "plane",
"title": "x⁻² و x^(۱/۲)",
"title": "x⁻² و x به توانِ (۱/۲) ",
"axes": true,
"points": {},
"items": [
@@ -199493,7 +199493,7 @@
"introText": "برای یافتن مشتق تابعی به شکل f(x) = √(ax + b)، ابتدا تعریف مشتق به صورت حد تفاضل را به کار می‌بریم. سپس صورت کسر را با عبارت مزدوج ضرب می‌کنیم تا رادیکال‌ها حذف شوند. پس از ساده‌سازی، حد را محاسبه می‌کنیم و در نهایت مشتق را به صورت f'(x) = a / (2√(ax + b)) به دست می‌آوریم.",
"example": "مشتق √x؟",
"steps": [
"x^(۱/۲).",
"x به توانِ (۱/۲) .",
"✅ جواب: ۱/(۲√x)"
],
"figures": [
@@ -199539,8 +199539,8 @@
"introText": "برای مشتق تابعی به شکل f(x) = ⁿ√x، از تعریف حد مشتق استفاده می‌کنیم. سپس صورت کسر را در عبارت مزدوج ضرب می‌کنیم که شامل مجموع رادیکال‌های nام است. پس از ساده‌سازی و محاسبه حد، مشتق به صورت f'(x) = 1 / (n ⁿ√(xⁿ⁻¹)) به دست می‌آید.",
"example": "مشتق ∛x؟",
"steps": [
"x^(۱/۳).",
"✅ جواب: ۱/(۳ x^(۲/۳))"
"x به توانِ (۱/۳) .",
"✅ جواب: ۱/(۳ x به توانِ (۲/۳) )"
],
"figures": [
{
@@ -201444,7 +201444,7 @@
"lessons": [
{
"title": "مشتقِ تابعِ توانی",
"introText": "مشتقِ ax^n برابر است با n·a·x^(n−1): توان را جلوی ضریب می‌آوریم و یکی از توان کم می‌کنیم.",
"introText": "مشتقِ axⁿ برابر است با n·a·xⁿ⁻¹: توان را جلوی ضریب می‌آوریم و یکی از توان کم می‌کنیم.",
"example": "مشتقِ ۳x⁴ برابر است با ۴ × ۳ x³ = ۱۲x³.",
"steps": [
"توان (۴) را در ضریب (۳) ضرب می‌کنیم: ۱۲.",
@@ -201501,7 +201501,7 @@
},
{
"title": "مشتقِ تابعِ مرکب (توان)",
"introText": "(u^n)′ = n·u^(n−1)·u′. مشتقِ داخل را فراموش نکنید.",
"introText": "(uⁿ)′ = n·uⁿ⁻¹·u′. مشتقِ داخل را فراموش نکنید.",
"example": "",
"steps": []
},
@@ -203455,7 +203455,7 @@
"steps": [
"تابع g(x)=√x را در نظر می‌گیریم. مشتق اول آن g'(x) = 1/(2√x) است که با افزایش x کاهش می‌یابد، بنابراین شیب خطوط مماس در منحنی g(x) کم می‌شود.",
"تابع h(x)=x² را در نظر می‌گیریم. مشتق اول آن h'(x) = 2x است که با افزایش x افزایش می‌یابد، بنابراین شیب خطوط مماس در منحنی h(x) زیاد می‌شود.",
"جهت تقعر منحنی g(x) با توجه به مشتق دوم g''(x) = -1/(4x^(3/2)) که منفی است، رو به پایین است.",
"جهت تقعر منحنی g(x) با توجه به مشتق دوم g''(x) = -1/(4x به توانِ (3/2) ) که منفی است، رو به پایین است.",
"جهت تقعر منحنی h(x) با توجه به مشتق دوم h''(x) = 2 که مثبت است، رو به بالا است.",
"✅ جواب: مشتق‌ها و علامت آن‌ها درست است؛ g'' منفی (تقعر رو به پایین) و h'' مثبت (تقعر رو به بالا) است."
]

File diff suppressed because it is too large Load Diff

View File

@@ -233,8 +233,8 @@ class NodeQuizCompleteTests(TestCase):
self.assertTrue(UserLessonCompletion.objects.filter(user_id=self.user.id).exists())
class NodeQuizRotationTests(TestCase):
"""دوباره‌بازیِ یک جزیره آزمونِ تازه می‌دهد؛ رفرش تا پایانِ آزمون همان را می‌دهد."""
class NodeQuizStabilityTests(TestCase):
"""آزمونِ یک جزیره برای یک کاربر ثابت می‌ماند، حتی بعد از تمام‌کردنِ آزمون و حتی با استخرِ بزرگ."""
def setUp(self):
cache.clear()
@@ -255,13 +255,8 @@ class NodeQuizRotationTests(TestCase):
body = self.client.get(f'/api/nodes/{self.node.pk}/quiz', **self.auth).json()
return [q['id'] for q in body['questions']]
def test_refresh_keeps_the_quiz_until_it_is_completed(self):
self.assertEqual(self._ids(), self._ids())
def test_each_completed_round_draws_a_fresh_quiz(self):
def test_quiz_is_the_same_after_completing_it(self):
first = self._ids()
UserNodeCompletion.objects.create(
user_id=self.user.id, node=self.node, correct_count=4, total_questions=4, stars=3)
second = self._ids()
self.assertNotEqual(first, second)
self.assertEqual(second, self._ids())
self.assertEqual(first, self._ids())

View File

@@ -18,8 +18,8 @@ class ConvertTests(SimpleTestCase):
self.assertEqual(convert('(−۱)^{۲+۲}'), '(−۱)²⁺²')
def test_unmappable_script_is_kept_readable_not_dropped(self):
self.assertEqual(convert('D_{g}'), 'D_(g)')
self.assertEqual(convert('a^b'), 'a^b')
self.assertEqual(convert('D_{g}'), 'Dg')
self.assertEqual(convert('a^b'), 'aᵇ')
def test_blank_placeholder_untouched(self):
self.assertEqual(convert('3، 6، ___، 12'), '3، 6، ___، 12')
@@ -35,6 +35,15 @@ class ConvertTests(SimpleTestCase):
self.assertEqual(out['label'], 'f(x)=x²')
class MarkupTests(SimpleTestCase):
def test_caret_markdown_and_integral(self):
self.assertEqual(convert('(۲/۳)^(−۴)'), '(۲/۳)⁻⁴')
self.assertEqual(convert('**تمرین:** حل کنید'), 'تمرین: حل کنید')
self.assertEqual(convert(r'\int_0^1 x\,dx'), '∫₀¹ x dx')
self.assertEqual(convert(r'$\vec{a}\cdot\vec{b}$'), 'a·b')
self.assertEqual(leftover(convert('x^2y^3 و log_a b')), [])
class SeedHasNoLatexTests(SimpleTestCase):
"""گزارشِ مالک ۲۰۲۶-۱۰-۱۲: LaTeX خام در درس‌های بردار. فرانت LaTeX رندر نمی‌کند."""
@@ -50,3 +59,10 @@ class SeedHasNoLatexTests(SimpleTestCase):
if leftover(t):
bad.append((l['title'], leftover(t)))
self.assertEqual(bad, [])
class SeedQuestionsHaveNoMarkupTests(SimpleTestCase):
def test_no_markup_in_questions(self):
rows = json.loads((SEED.parent / 'questions.json').read_text(encoding='utf-8'))['questions']
bad = [t for r in rows for t in [r['prompt'], *r['choices']] if leftover(t)]
self.assertEqual(bad[:5], [])

View File

@@ -1036,15 +1036,9 @@ class NodeQuizView(APIView):
# درهم‌ریزیِ پایدار: همان کاربر روی همان مبحث همیشه همان ترتیب را
# می‌بیند، ولی دو کاربرِ مختلف دو ترتیبِ مختلف.
seed = request.query_params.get('seed') or str(getattr(request.user, 'id', '') or '')
# دوباره‌بازیِ همان جزیره آزمونِ تازه می‌دهد: شمارِ آزمون‌های تمام‌شده‌ی این کاربر روی این
# جزیره در مبنای درهم‌ریزی می‌آید. تا پایانِ آزمون عدد ثابت است، پس رفرش همان آزمون را
# می‌دهد. با استخرِ یک‌سوال‌به‌درس عملاً چیزی عوض نمی‌شود؛ معنی‌اش با استخرِ بزرگ پیداست.
# فقط برای کاربرِ واردشده و بی‌`?seed=`؛ نسنجیده: اثرش روی کشِ فرانت.
rounds = 0
if not request.query_params.get('seed') and getattr(request.user, 'id', None):
rounds = UserNodeCompletion.objects.filter(
user_id=request.user.id, node_id=node_id).count()
rng = random.Random(f'{node_id}:{seed}:{rounds}' if rounds else f'{node_id}:{seed}')
# آزمونِ هر جزیره برای هر کاربر ثابت است (تصمیمِ مالک ۲۰۲۶-۱۰-۱۲): هر بار که برگردد همان
# سوال‌ها را می‌بیند تا بتواند ایرادش را رفع و مکانِ سوال‌ها را یاد بگیرد.
rng = random.Random(f'{node_id}:{seed}')
rng.shuffle(questions)
# حداکثر یک سوال از هر درس تا آزمون روی یک مهارت گیر نکند؛ اگر با این