Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dodane naloge z eksponentno #82

Merged
merged 12 commits into from
Dec 15, 2022
30 changes: 24 additions & 6 deletions nadlogar/problems/migrations/0018_splosniclenzaporedja.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,37 @@
class Migration(migrations.Migration):

dependencies = [
('problems', '0017_alter_problem_text'),
("problems", "0017_alter_problem_text"),
]

operations = [
migrations.CreateModel(
name='SplosniClenZaporedja',
name="SplosniClenZaporedja",
fields=[
('problem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='problems.problem')),
('zamik_alternirajoce', models.BooleanField(choices=[(True, 'Da'), (False, 'Ne')], default=False, help_text='Določa, če so v izbor predpisa vljučena zamaknjena zaporedja iz kvadratov in kubov ter alternirajoča zaporedja.', verbose_name='zamaknjeno in alternirajoče zaporedje')),
(
"problem_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="problems.problem",
),
),
(
"zamik_alternirajoce",
models.BooleanField(
choices=[(True, "Da"), (False, "Ne")],
default=False,
help_text="Določa, če so v izbor predpisa vljučena zamaknjena zaporedja iz kvadratov in kubov ter alternirajoča zaporedja.",
verbose_name="zamaknjeno in alternirajoče zaporedje",
),
),
],
options={
'verbose_name': 'Zaporedja / splošni člen zaporedja',
"verbose_name": "Zaporedja / splošni člen zaporedja",
},
bases=('problems.problem',),
bases=("problems.problem",),
),
]
38 changes: 30 additions & 8 deletions nadlogar/problems/migrations/0019_auto_20221201_1528.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,43 @@
class Migration(migrations.Migration):

dependencies = [
('problems', '0018_splosniclenzaporedja'),
("problems", "0018_splosniclenzaporedja"),
]

operations = [
migrations.CreateModel(
name='PrviCleniAritmeticnega',
name="PrviCleniAritmeticnega",
fields=[
('problem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='problems.problem')),
('racionalne_vrednosti', models.BooleanField(choices=[(True, 'Da'), (False, 'Ne')], default=False, verbose_name='prvi člen in diferenca zaporedja sta lahko racionalni vrednosti')),
(
"problem_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="problems.problem",
),
),
(
"racionalne_vrednosti",
models.BooleanField(
choices=[(True, "Da"), (False, "Ne")],
default=False,
verbose_name="prvi člen in diferenca zaporedja sta lahko racionalni vrednosti",
),
),
],
bases=('problems.problem',),
bases=("problems.problem",),
),
migrations.AlterField(
model_name='splosniclenzaporedja',
name='zamik_alternirajoce',
field=models.BooleanField(choices=[(True, 'Da'), (False, 'Ne')], default=False, help_text='So v izbor predpisa vljučena zamaknjena zaporedja iz kvadratov in kubov ter alternirajoča zaporedja?', verbose_name='zamaknjeno in alternirajoče zaporedje'),
model_name="splosniclenzaporedja",
name="zamik_alternirajoce",
field=models.BooleanField(
choices=[(True, "Da"), (False, "Ne")],
default=False,
help_text="So v izbor predpisa vljučena zamaknjena zaporedja iz kvadratov in kubov ter alternirajoča zaporedja?",
verbose_name="zamaknjeno in alternirajoče zaporedje",
),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Generated by Django 4.1.3 on 2022-12-15 06:39

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("problems", "0020_alter_prvicleniaritmeticnega_options_and_more"),
]

operations = [
migrations.CreateModel(
name="ResevanjeEksponentneEnacbe",
fields=[
(
"problem_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="problems.problem",
),
),
],
options={
"verbose_name": "Eksponentna funkcija / reševanje eksponentne enačbe z eno osnovo",
},
bases=("problems.problem",),
),
migrations.CreateModel(
name="ResevanjeEksponentneEnacbeZDvemaOsnovama",
fields=[
(
"problem_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="problems.problem",
),
),
],
options={
"verbose_name": "Eksponentna funkcija / reševanje eksponentne enačbe z različnima osnovama",
},
bases=("problems.problem",),
),
]
1 change: 1 addition & 0 deletions nadlogar/problems/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .eksponentna_funkcija import *
from .kompleksna import *
from .meta import *
from .mnozice import *
Expand Down
166 changes: 166 additions & 0 deletions nadlogar/problems/models/eksponentna_funkcija.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import random

import sympy

from .meta import GeneratedDataIncorrect, Problem


def naredi_eksponentno(do=3, cela_osnova=False, premik=0):
"""
Funkcija vrne naključno eksponentno funkcijo, ki ustreza vpisanim pogojem.
"""

x = sympy.symbols("x")
izbor = list(range(2, do + 1))
if not cela_osnova:
izbor += (
[sympy.Rational(x, 2) for x in range(1, 2 * (do)) if x != 2]
+ [sympy.Rational(x, 3) for x in range(1, 3 * (do)) if x != 3]
+ [sympy.Rational(x, 4) for x in range(1, 4 * (do)) if x != 4]
+ [sympy.Rational(x, 5) for x in range(1, 5 * (do)) if x != 5]
)
osnova = random.choice(izbor)
return (osnova, premik, sympy.Add(sympy.Pow(osnova, x), premik, evaluate=False))


# class GrafEksponentne(Problem):
# """
# Naloga iz risanja dveh grafov eksponentne funkcije.
# """

# default_instruction = r"""V isti koordinatni sistem nariši grafa funkcij $f(x)=@eksponentna_prva$ in $g(x)=@eksponentna_druga$."""
# # TODO izpisovanje imena funkcij na grafu
# default_solution = r"""$f(x)=@eksponentna_prva$, $g(x)=@eksponentna_druga$ $\par
# \begin{minipage}{\linewidth}
# \centering
# \begin{tikzpicture}[baseline]
# \begin{axis}[axis lines=middle, xlabel=$x$, ylabel=$y$,
# xtick={-5,-4,...,5}, ytick={-5,-4,...,5},
# restrict y to domain=-5.5:5.5,
# xmin=-5.5, xmax=5.5, ymin=-5.5, ymax=5.5,]
# \addplot[domain =-5.5:5.5, color=black, smooth]{ {{naloga.narisi_eksponentna1}} } node[right, pos=1]{ {{latex(naloga.eksponentna1)}} };
# \addplot[domain =-5.5:5.5, color=black, smooth]{ {{naloga.narisi_eksponentna2}} } node[right, pos=0.98]{ {{latex(naloga.eksponentna2)}}};
# \addplot[domain =-5.5:5.5, color=black, dashed]{ {{naloga.premik2}} };
# \end{axis}
# \end{tikzpicture}
# \end{minipage}$"""

# class Meta:
# verbose_name = "Eksponentna funkcija / risanje grafa"

# def generate(self):
# x = sympy.symbols("x")
# osnova, premik, eksponentna_prva = naredi_eksponentno(
# premik=random.choice([i for i in range(-3, 4) if i != 0]), cela_osnova=True
# )
# predznak = random.choice([1, -1])
# premik_drugi = random.choice([x for x in range(-3, 4) if x != 0])
# eksponentna_druga = sympy.Add(
# predznak * sympy.Pow(osnova, x, evaluate=False),
# premik_drugi,
# evaluate=False,
# )
# narisi_eksponentna_prva = str(eksponentna_prva).replace("**", "^")
# narisi_eksponentna_druga = str(eksponentna_druga).replace("**", "^")
# return {
# "eksponentna_prva": sympy.latex(eksponentna_prva),
# "eksponentna_druga": sympy.latex(eksponentna_druga),
# "narisi_eksponentna_prva": sympy.latex(narisi_eksponentna_prva),
# "narisi_eksponentna_druga": sympy.latex(narisi_eksponentna_druga),
# "premik_drugi": sympy.latex(premik_drugi),
# }


class ResevanjeEksponentneEnacbe(Problem):
"""
Naloga za reševanje eksponentne enačbe z eno osnovo.
"""

# TODO tukaj bi se dalo izboljšati pogoje, da recimo sprejmemo samo celoštevilke rešitve ali kaj podobnega

default_instruction = r"""Reši eksponentno enačbo $@enacba$."""
default_solution = r"""$x=@resitev$."""

class Meta:
verbose_name = (
"Eksponentna funkcija / reševanje eksponentne enačbe z eno osnovo"
)

def generate(self):
x = sympy.symbols("x")
osnova = random.choice([2, 3, 4, 5, 10])
zamik_clena1 = random.choice([-3, -2, -1, 1, 2, 3])
zamik_clena2 = random.choice([-3, -2, -1, 1, 2, 3])
k_clena2 = random.choice([1, 2, 3, -1, -2, -3])
resitev = random.choice([-1, 0, 1, 2, 3])
if not (-2 < (resitev + zamik_clena1) and -2 < (resitev + zamik_clena2)):
raise GeneratedDataIncorrect
vrednost = sympy.Rational(
osnova ** (resitev + zamik_clena1)
+ k_clena2 * (osnova) ** (resitev + zamik_clena2)
)
enacba = sympy.Eq(
sympy.Pow(osnova, (x + zamik_clena1))
+ k_clena2 * sympy.Pow(osnova, (x + zamik_clena2)),
vrednost,
)

return {"enacba": sympy.latex(enacba), "resitev": sympy.latex(resitev)}


class ResevanjeEksponentneEnacbeZDvemaOsnovama(Problem):
"""
Naloga enačbe, kjer imata potenci dve različni osnovi.
"""

default_instruction = r"""Reši eksponentno enačbo $@enacba$."""
default_solution = r"""$x=@resitev$"""

class Meta:
verbose_name = (
"Eksponentna funkcija / reševanje eksponentne enačbe z različnima osnovama"
)

# TODO Ta funkcija daje zelo nenavadne in nenaravne naloge. Morda jo je treba popraviti.

def generate(self):
[osnova1, osnova2] = random.sample([2, 3, 5, 7, 10], 2)
x = sympy.symbols("x")
u = random.choice([0, 1, 2, 3])
v = random.choice([0, 1, 2, 3])
# V primeru, da imamo kako osnovo 7 ali 10, nekoliko omejimo zamik, da ne pridejo prevelike vrednosti.
if max(osnova1, osnova2) > 5:
komponenta1_zamika_enacbe1 = random.randint(-3, 3)
else:
komponenta1_zamika_enacbe1 = random.randint(-5, 5)
komponenta2_zamika_enacbe1 = random.choice([1, 2])
komponenta1_zamika_enacbe2 = komponenta1_zamika_enacbe1 - v + u
komponenta2_zamika_enacbe2 = random.choice([1, 2])
k_osnove1_levi = random.choice([1, 2, 3, 4, 5])
k_osnove1_desni = random.choice([1, 2, 3, 4, 5])
k_osnove2_levi = (
osnova2**u - osnova1**komponenta2_zamika_enacbe1 * k_osnove1_levi
)
k_osnove2_desni = (
osnova1**v - osnova2**komponenta2_zamika_enacbe2 * k_osnove1_desni
)
resitev = v - komponenta1_zamika_enacbe1
enacba = sympy.Eq(
sympy.simplify(
k_osnove1_levi
* osnova1
** (x + komponenta1_zamika_enacbe1 + komponenta2_zamika_enacbe1)
- k_osnove1_desni
* osnova2
** (x + komponenta1_zamika_enacbe2 + komponenta2_zamika_enacbe2),
rational=True,
),
sympy.simplify(
-k_osnove2_levi * osnova1 ** (x + komponenta1_zamika_enacbe1)
+ k_osnove2_desni * osnova2 ** (x + komponenta1_zamika_enacbe2),
rational=True,
),
)
if not (max([abs(k_osnove2_levi), abs(k_osnove2_desni)]) < 50):
raise GeneratedDataIncorrect # Zagotovi, da v enačbi ne nastopajo prevelike vrednosti.
return {"enacba": sympy.latex(enacba), "resitev": sympy.latex(resitev)}