Կլորացման սխալներ անցման ընթացքում

Բավարիայում \(2{,}33\) միջին գնահատականը վկայում է մարզադպրոցի \(2{,}34\) ՝ ոչ: Այս կտրուկ սահմանային արժեքի դեպքում երկու կլորացման գործողությունների հերթականությունը կարող է որոշել, թե երեխան որ կողմում է: Գյունտեր Ֆելբինգերը քննարկում է այս կլորացման էֆեկտի հնարավոր հետևանքները իր բլոգում : Մաքուր հետաքրքրությունից ելնելով՝ ես ինքս հաշվարկել եմ էֆեկտները մոդելում թույլատրված բոլոր դասարանների համակցությունների համար:


Իմ հիմնական հարցն այն է. որքան հաճախ է ամբողջ առարկայի գնահատականների վաղ կլորացումը հանգեցնում դպրոցի տարբեր տեսակի հաշվարկի, քան չկլորացված առարկայական միջիններով հաշվարկները: Ավելին, հետաքրքիր կլիներ տեսնել, թե ինչ է փոխվում, եթե առանձին առարկաների միջինները (ինչպես առաջարկվում է այնտեղ) սկզբնապես կլորացվեն մինչև միայն մեկ տասնորդական նիշ:

Բավարիայի տարրական դպրոցի կանոնադրության 6-րդ բաժնի համաձայն՝ միջին գնահատականը հաշվարկվում է գերմաներենի, մաթեմատիկայի, տեղագիտական և ընդհանուր առարկաների գնահատականներից: Կիրառող կանոնակարգերը սահմանում են սահմանաչափերը՝ մինչև \(2{,}33\) և մինչև \(2{,}66\) : Հետևյալ հաշվարկային մոդելում յուրաքանչյուր ընդհանուր միջինը կրճատվում է մինչև երկու տասնորդական նիշ և կրկին չի կլորացվում: Այսպես, օրինակ...

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

Սա կարևոր է դասակարգման համար. \(2{,}3366\ldots\) ը չի դառնում \(2{,}34\) , այլ \(2{,}33\) և, հետևաբար, դեռևս բավարար է քերականական դպրոցի համար։

Սկզբնական գրառումը ցույց է տալիս վաղ կլորացումը՝ ենթադրելով առարկայական միջին արժեքներ \(1{,}6\) , \(2{,}6\) և \(2{,}6\) : Սրանցից նախ ստացվում են \(2\) , \(3\) և \(3\) ամբողջական գնահատականները: Դրանց միջինը հավասար է

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

ինչը նշանակում է, որ աշակերտը չի համապատասխանում քերականական դպրոց ընդունվելու իրավունքին: Սակայն, առանց ամբողջական գնահատականների կլորացման, ենթադրական օրինակում արդյունքը կլինի...

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

Երկրորդ օրինակում կլորացումը գործում է հակառակ ուղղությամբ. \(2{,}4\) , \(3{,}4\) և \(2{,}4\) դառնում են \(2\) , \(3\) և \(2\) ամբողջական նոտայի արժեքները, պաշտոնապես \(2{,}33\) : Սակայն չկլորացված արժեքները հանգեցնում են \(2{,}73\) : Օրինակները հստակ ցույց են տալիս ազդեցությունը: Սակայն դրանք դեռևս չեն բացահայտում, թե որքան հաճախ է դա տեղի ունենում կամ ինչ հետևանքներ կունենա կլորացման այլ մեթոդը:

Հետևաբար, իմ հաշվարկի համար ես օգտագործում եմ հստակ արդյունքի տարածություն։ Յուրաքանչյուր առարկայի միջինը կարող է լինել իր մեջ մտնող \(501\) արժեքներից մեկը։

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

Ենթադրենք։ Ես հավասարապես կշռում եմ գերմաներենի, մաթեմատիկայի, ինչպես նաև տեղագիտական և ընդհանուր առարկաների բոլոր կարգավորված համակցությունները։ Այսպիսով, կան

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

Դեպքեր։ Հետևաբար, մոդելը միանշանակ է, բայց արհեստական. այն ենթադրում է հավասարաչափ բաշխված առարկայական միջիններ, երեք առարկաների անկախություն և ճիշտ մեկ հարյուրերորդական քայլեր։ Այն չի արտացոլում Բավարիայի տարրական դպրոցի երեխաների իրական բաշխումը։

Երեք ենթակա միջոցների համար \(d,m,h\) մենք գրում ենք

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

ընդհանուր միջինի համար, որը կրճատվել է մինչև երկու տասնորդական նիշ։ Հիմա համեմատենք հաշվարկման երեք մեթոդներ։:

\[
\begin{հավասարեցված}
A_0 &= A(\operatorname{round}(d),\operatorname{round}(m),\operatorname{round}(h)),\\
A_1 &= A(\operatorname{round}_1(d),\operatorname{round}_1(m),\operatorname{round}_1(h)),\\
A_\mathrm{ref} &= A(d,m,h).
\end{հավասարեցված}
\]

\(A_0\) ը համապատասխանում է ամբողջ գնահատականներով հաշվարկին, \(A_1\) -ը՝ մեկ տասնորդական նիշով առաջարկին, իսկ \(A_\mathrm{ref}\) ը՝ մոդելի ներսում չկլորացված հղմանը։ Օրինակ՝ հաշվարկը կարող է իրականացվել անմիջապես Rust- ում։:

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
        );
    }
}

Փոքր հանդուրժողականությունը՝ calculate_average կանխում է այնպիսի արժեք, ինչպիսին է \(2{,}67\) իր երկուական լողացող ներկայացման պատճառով, այն սխալմամբ համարվել է \(2{,}669999\ldots\) կտրված է։ normalize_grade Ավելին, այն յուրաքանչյուր ցիկլի արժեքը կրճատում է մինչև հարյուրերորդ կարգի ցանց։ Գոյություն ունեն առնվազն երկու տարբեր հնարավոր միջին արժեքներ։ \(1/300\) բացի; հանդուրժողականությունը \(10^{-9}\) հետևաբար, բավականաչափ փոքր է, որպեսզի չփոխի որևէ իրական սահմանային դեպք։

Ծրագիրը կազմվում է և մեկնարկվում է

rustc -O calc.rs && ./calc

Ծրագիրը կրկնում է բոլոր \(125\,751\,501\) համակցությունները և վերադարձնում է:

ՀամեմատությունՄաս
Ամբողջական գնահատականներ ընդդեմ չկլորացված առարկայական միջինների\(10{,}4411\,\%\)
Ամբողջական գնահատականներ՝ համեմատած առաջարկի հետ՝ մեկ տասնորդական նիշով\(10{,}1521\,\%\)
Առաջարկ՝ մեկ տասնորդական նիշով՝ համեմատած չկլորացված փորձագետների միջինների հետ\(0{,}6615\,\%\)

Ինձ համար կենտրոնական արժեքն է \(10{,}4411\,\%\): Տասը համակցություններից մեկից ավելի դեպքում, ամբողջական դասարանների վաղ կլորացումը հանգեցնում է չկլորացված հղման համեմատ հաշվարկված դպրոցի տարբեր տեսակի։ Այս համամասնությունը նկարագրում է բացառապես ընտրված մոդելի շրջանակներում կլորացման էֆեկտը։

Մեկ տասնորդական նիշով փորձագիտական միջիններին անցնելը կհանգեցնի տարբեր դասակարգման բոլոր մոդելային դեպքերի \(10{,}1521\,\%\) -ում՝ նախորդ մեթոդի համեմատ: Այնուամենայնիվ, երրորդ համեմատությունը կարևոր է. չկլորացված հղման համեմատ, մեկ տասնորդական նիշով մեթոդը թողնում է շեղվող դեպքերի միայն \(0{,}6615\,\%\) : Այսպիսով, հղման շեղումը նվազում է

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

Սա, ինձ համար, հենց ներկայիս հաշվարկման մեթոդի կասկածելի հետևանքն է. ենթադրվող առարկայական նվաճումները մնում են անփոփոխ. միայն այն պահը, երբ կլորացվում է, կարող է փոխել հաշվարկված դպրոցի տեսակը: Չնայած մեկ տասնորդական նիշով հաշվարկը լիովին չի վերացնում այս ազդեցությունը, այն զգալիորեն նվազեցնում է այն մոդելի ներսում:

Սակայն այս թվերը մեզ չեն ասում, թե իրականում քանի երեխա է տուժում։ Ատեստատների գնահատականները պարտադիր չէ, որ ստեղծվեն որպես մեխանիկորեն կլորացված միջիններ, ակադեմիական առաջադիմությունը ո՛չ միատեսակ է բաշխված, ո՛չ էլ անկախ, և դպրոցի տեսակի իրական ընտրությունը կախված չէ միայն այս երեք թվերից։ Իմ հաշվարկը պատասխանում է ավելի կոնկրետ հարցի. Որքա՞ն հաճախ է կլորացումը փոխում հաշվարկված գնահատականը, երբ բոլոր հարյուրերորդական արժեքների համակցությունները հավասարապես հավանական են։

Վերջապես, համեմատություն սկզբնական գրառման հետ. այնտեղ նշված ընդհանուր ցուցանիշը՝ մոտավորապես \(10\,\%\) մոտ է իմ \(10{,}4411\,\%\) -ին։ Սակայն իմ հաշվարկները չեն հաստատում չորս առանձին դեպքերը, որոնցից յուրաքանչյուրը ներկայացված է որպես \(1/6 \approx 17\,\%\) «Միջնակարգ դպրոցը բաց թողածների թիվը՝ \(3{,}00\) », «Միջնակարգ դպրոցը բաց թողածների թիվը՝ \(2{,}33\) », «Միջնակարգ դպրոցը ավարտածների թիվը՝ \(2{,}66\) » և «Միջնակարգ դպրոցը ավարտածների թիվը՝ \(2{,}66\) \(1{,}4615\,\%\) \(59{,}6096\,\%\) \(1{,}2023\,\%\) \(62{,}9395\,\%\) ։

Չորս արժեքները պայմանական հավանականություններ են՝ տարբեր չափերի հղման խմբերով։ Առանց տարբեր կերպ սահմանված նմուշային տարածքի \(1/6\) չի կարող ստացվել դրանցից։ Այսպիսով, իմ հաշվարկը հաստատում է կլորացման էֆեկտը, բայց ոչ այս անհատական հավանականությունները։ Ամեն դեպքում, ազդակիր երեխաների իրական թվի վերաբերյալ պնդումները կպահանջեն իրական գնահատականների բաշխումներ և դրանց կախվածություններ։

Վերադառնալ