Gabimet e rrumbullakosjes gjatë tranzicionit

Në Bavari, një notë mesatare e përgjithshme prej \(2{,}33\) vërteton përshtatshmërinë për gjimnaz \(2{,}34\) jo. Në këtë kufi të mprehtë, rendi i dy operacioneve të rrumbullakosjes mund të përcaktojë se në cilën anë bie një fëmijë. Günther Felbinger diskuton pasojat e mundshme të këtij efekti rrumbullakosjeje në një postim në blog . Nga interesi i pastër, i llogarita vetë efektet në të gjitha kombinimet e notave të lejuara në model.


Pyetja ime kryesore është: Sa shpesh rrumbullakosja e hershme në notat e të gjitha lëndëve çon në një lloj të ndryshëm llogaritjeje shkollore sesa llogaritjet që përdorin mesataret e paklodhura të lëndëve? Për më tepër, do të ishte interesante të shihej se çfarë ndryshon nëse mesataret e lëndëve individuale (siç sugjerohet aty) rrumbullakosen fillimisht vetëm në një shifër dhjetore.

Sipas Seksionit 6 të Rregullores së Shkollës Fillore të Bavarisë, nota mesatare llogaritet nga notat në gjermanisht, matematikë dhe studime lokale dhe të përgjithshme. Rregulloret zbatuese përcaktojnë kufijtë deri në \(2{,}33\) dhe deri në \(2{,}66\) . Në modelin e mëposhtëm të llogaritjes, çdo mesatare e përgjithshme shkurtohet në dy shifra dhjetore dhe nuk rrumbullakoset përsëri. Kështu, për shembull...

\[
\frac{2{,}33+2{,}34+2{,}34}{3}=2{,}3366\ldots \longrightarrow 2{,}33.
\]

Kjo është thelbësore për klasifikimin: \(2{,}3366\ldots\) nuk bëhet \(2{,}34\) , por \(2{,}33\) dhe për këtë arsye është ende i mjaftueshëm për shkollën e mesme.

Hyrja fillestare ilustron rrumbullakimin e hershëm me vlerat mesatare të supozuara specifike për lëndën \(1{,}6\) , \(2{,}6\) dhe \(2{,}6\) . Nga këto, fillimisht nxirren notat e plota \(2\) , \(3\) dhe \(3\) . Mesatarja e tyre është

\[
\frac{2+3+3}{3}=2{,}6666\ldots \longrightarrow 2{,}66,
\]

që do të thotë se studenti nuk kualifikohet për pranim të drejtpërdrejtë në shkollën e mesme. Megjithatë, pa rrumbullakosur në nota të plota, rezultati në shembullin hipotetik do të ishte...

\[
\frac{1{,}6+2{,}6+2{,}6}{3}=2{,}2666\ldots \longrightarrow 2{,}26.
\]

Në shembullin e dytë, rrumbullakosja funksionon në drejtim të kundërt: \(2{,}4\) , \(3{,}4\) dhe \(2{,}4\) bëhen vlerat e plota të notës \(2\) , \(3\) dhe \(2\) , zyrtarisht \(2{,}33\) . Megjithatë, vlerat e parrumbullakosura rezultojnë në \(2{,}73\) . Shembujt e demonstrojnë qartë efektin. Megjithatë, ato ende nuk zbulojnë se sa shpesh ndodh ose cilat do të ishin pasojat e një metode të ndryshme rrumbullakosjeje.

Prandaj, për llogaritjen time përdor një hapësirë të qartë rezultatesh. Çdo mesatare subjekti mund të jetë një nga vlerat \(501\) brenda saj.

\[
1{,}00,\, 1{,}01,\, 1{,}02,\, \ldots, \, 5{,}99, \, 6{,}00
\]

Supozoj. Unë i peshoj të gjitha kombinimet e renditura të gjermanishtes, matematikës dhe studimeve lokale dhe të përgjithshme në mënyrë të barabartë. Kështu, ekzistojnë

\[
501^3=125\,751\,501
\]

Rastet. Prandaj, modeli është i qartë, por artificial: Ai supozon mesatare të lëndëve të shpërndara në mënyrë të barabartë, pavarësinë e tre lëndëve dhe hapa saktësisht një të qindtën. Ai nuk pasqyron shpërndarjen aktuale të fëmijëve të shkollës fillore bavareze.

Për tre mesatare subjekti \(d,m,h\) shkruajmë

\[
A(d,m,h)=\frac{\left\lfloor 100\cdot\frac{d+m+h}{3}\right\rfloor}{100}
\]

për mesataren e përgjithshme të shkurtuar në dy shifra dhjetore. Tani krahasojmë tre metoda llogaritjeje.:

\[
\begin{aligned}
A_0 &= A(\operatoriemri{round}(d),\operatoriemri{round}(m),\operatoriemri{round}(h)),\\
A_1 &= A(\operatoriemri{round}_1(d),\operatoriemri{round}_1(m),\operatoriemri{round}_1(h)),\\
A_\mathrm{ref} &= A(d,m,h).
\end{i rreshtuar}
\]

\(A_0\) korrespondon me llogaritjen duke përdorur nota të plota, \(A_1\) me propozimin me një pikë dhjetore dhe \(A_\mathrm{ref}\) me referencën e parrumbullakosur brenda modelit. Llogaritja mund të zbatohet direkt në Rust , për shembull.:

const SCHOOL_GYMNASIUM: i32 = 0;
const SCHOOL_REALSCHULE: i32 = 1;
const SCHOOL_MITTELSCHULE: i32 = 2;
const FLOAT_TOLERANCE: f64 = 1e-9;

#[derive(Clone, Copy, Default)]
struct Statistic {
    conflict_count: u64,
    total_count: u64,
}

fn determine_school(average: f64) -> i32 {
    if average <= 2.33 {
        return SCHOOL_GYMNASIUM;
    }
    if average <= 2.66 {
        return SCHOOL_REALSCHULE;
    }
    SCHOOL_MITTELSCHULE
}

fn calculate_average(note_deutsch: f64, note_mathe: f64, note_hsu: f64) -> f64 {
    let average = (note_deutsch + note_mathe + note_hsu) / 3.0;
    ((average + FLOAT_TOLERANCE) * 100.0).floor() / 100.0
}

fn round_to_whole_grade(grade: f64) -> f64 {
    grade.round()
}

fn round_to_one_decimal(grade: f64) -> f64 {
    (grade * 10.0).round() / 10.0
}

fn normalize_grade(grade: f64) -> f64 {
    (grade * 100.0).round() / 100.0
}

fn percentage(count: u64, total: u64) -> f64 {
    count as f64 / total as f64 * 100.0
}

fn main() {
    let mut combination_count = 0;
    let mut official_reference_conflicts = 0;
    let mut official_proposal_conflicts = 0;
    let mut proposal_reference_conflicts = 0;
    let mut statistics = [Statistic::default(); 4];

    let mut note_deutsch = 1.0;
    while note_deutsch <= 6.0 {
        let mut note_mathe = 1.0;
        while note_mathe <= 6.0 {
            let mut note_hsu = 1.0;
            while note_hsu <= 6.0 {
                combination_count += 1;

                let official_average = calculate_average(
                    round_to_whole_grade(note_deutsch),
                    round_to_whole_grade(note_mathe),
                    round_to_whole_grade(note_hsu),
                );
                let proposed_average = calculate_average(
                    round_to_one_decimal(note_deutsch),
                    round_to_one_decimal(note_mathe),
                    round_to_one_decimal(note_hsu),
                );
                let reference_average =
                    calculate_average(note_deutsch, note_mathe, note_hsu);
                let official_school = determine_school(official_average);
                let proposed_school = determine_school(proposed_average);
                let reference_school = determine_school(reference_average);

                if official_average == 3.0 {
                    statistics[0].total_count += 1;
                    if reference_school != SCHOOL_MITTELSCHULE {
                        statistics[0].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[1].total_count += 1;
                    if reference_school == SCHOOL_GYMNASIUM {
                        statistics[1].conflict_count += 1;
                    }
                }
                if official_average == 2.33 {
                    statistics[2].total_count += 1;
                    if reference_school != SCHOOL_GYMNASIUM {
                        statistics[2].conflict_count += 1;
                    }
                }
                if official_average == 2.66 {
                    statistics[3].total_count += 1;
                    if reference_school == SCHOOL_MITTELSCHULE {
                        statistics[3].conflict_count += 1;
                    }
                }

                if official_school != reference_school {
                    official_reference_conflicts += 1;
                }
                if official_school != proposed_school {
                    official_proposal_conflicts += 1;
                }
                if proposed_school != reference_school {
                    proposal_reference_conflicts += 1;
                }

                note_hsu = normalize_grade(note_hsu + 0.01);
            }
            note_mathe = normalize_grade(note_mathe + 0.01);
        }
        note_deutsch = normalize_grade(note_deutsch + 0.01);
    }

    println!(
        "official/reference: {}%",
        percentage(official_reference_conflicts, combination_count)
    );
    println!(
        "official/proposal: {}%",
        percentage(official_proposal_conflicts, combination_count)
    );
    println!(
        "proposal/reference: {}%",
        percentage(proposal_reference_conflicts, combination_count)
    );
    for (index, statistic) in statistics.iter().enumerate() {
        println!(
            "#{}: {}% ({}/{})",
            index + 1,
            percentage(statistic.conflict_count, statistic.total_count),
            statistic.conflict_count,
            statistic.total_count
        );
    }
}

Toleranca e vogël në calculate_average parandalon një vlerë të tillë si \(2{,}67\) për shkak të përfaqësimit të tij binar me nota, u konsiderua gabimisht \(2{,}669999\ldots\) është i prerë. normalize_grade Për më tepër, ai e redukton çdo vlerë të ciklit përsëri në një rrjetë të rendit të njëqindtë. Ekzistojnë të paktën dy vlera mesatare të ndryshme të mundshme. \(1/300\) veçmas; toleranca e \(10^{-9}\) prandaj është mjaftueshëm i vogël për të mos ndryshuar asnjë rast kufitar real.

Programi kompilohet dhe niset me

rustc -O calc.rs && ./calc

Programi përsërit të gjitha kombinimet \(125\,751\,501\) dhe kthimet:

KrahasimPorcion
Notat e plota kundrejt mesatareve të parrumbullakosura të lëndëve\(10{,}4411\,\%\)
Notat e plota krahasuar me propozimin me një shifër dhjetore\(10{,}1521\,\%\)
Propozim me një shifër dhjetore krahasuar me mesataret e parrumbullakosura të ekspertëve\(0{,}6615\,\%\)

Vlera qendrore për mua është \(10{,}4411\,\%\): Në më shumë se një në dhjetë kombinime, rrumbullakimi i hershëm në nota të plota çon në një lloj shkolle të llogaritur të ndryshëm nga referenca e parrumbullakosur. Ky proporcion përshkruan ekskluzivisht efektin e rrumbullakimit brenda modelit të zgjedhur.

Kalimi në mesataret e ekspertëve me një shifër dhjetore do të çonte në një klasifikim të ndryshëm në \(10{,}1521\,\%\) të të gjitha rasteve të modelit krahasuar me metodën e mëparshme. Megjithatë, krahasimi i tretë është thelbësor: krahasuar me referencën e parrumbullakosur, metoda me një shifër dhjetore lë vetëm \(0{,}6615\,\%\) rasteve devijuese. Devijimi nga referenca kështu zvogëlohet me

\[
1-\frac{0{,}6615}{10{,}4411}\approx 93{,}7\,\%.
\]

Kjo, për mua, është pikërisht pasoja e dyshimtë e metodës aktuale të llogaritjes: arritjet e supozuara specifike për lëndën mbeten të pandryshuara; vetëm momenti kohor në të cilin ndodh rrumbullakimi mund të ndryshojë llojin e shkollës së llogaritur. Ndërsa llogaritja me një shifër dhjetore nuk e eliminon plotësisht këtë efekt, ajo e zvogëlon atë ndjeshëm brenda modelit.

Megjithatë, këto shifra nuk na tregojnë se sa fëmijë preken në të vërtetë. Notat në raportet e studimit nuk gjenerohen domosdoshmërisht si mesatare të rrumbullakosura mekanikisht, performanca akademike nuk është as e shpërndarë në mënyrë uniforme dhe as e pavarur, dhe zgjedhja aktuale e llojit të shkollës nuk varet vetëm nga këto tre shifra. Llogaritja ime përgjigjet në një pyetje më specifike: Sa shpesh e ndryshon rrumbullakimi notën e llogaritur kur të gjitha kombinimet e vlerës së qindtës janë po aq të mundshme?

Së fundmi, një krahasim me postimin origjinal: Shkalla e përgjithshme e përmendur atje, afërsisht \(10\,\%\) është afër \(10{,}4411\,\%\) që kam llogaritur. Megjithatë, llogaritjet e mia nuk i konfirmojnë katër rastet individuale, secila e raportuar si \(1/6 \approx 17\,\%\) Për "mungesa në shkollën e mesme me \(3{,}00\) ", "mungesa në shkollën e mesme me \(2{,}33\) ", "arritja në shkollën e mesme me \(2{,}66\) " dhe "arritja në shkollën e mesme me \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) .

Katër vlerat janë probabilitete të kushtëzuara me grupe referimi me madhësi të ndryshme. Pa një hapësirë mostre të përcaktuar ndryshe \(1/6\) nuk mund të nxirret prej tyre. Llogaritja ime konfirmon kështu efektin e rrumbullakosjes, por jo këto probabilitete individuale. Sidoqoftë, deklaratat rreth numrit aktual të fëmijëve të prekur do të kërkonin shpërndarje reale të notave dhe varësitë e tyre.

Mbrapa