বাভারিয়াতে, \(2{,}33\) -এর একটি সামগ্রিক গড় গ্রেড জিমনেসিয়াম \(2{,}34\) তা করে না। এই সুস্পষ্ট বিভাজন রেখায়, দুটি আসন্নীকরণ প্রক্রিয়ার ক্রম নির্ধারণ করতে পারে যে একটি শিশু কোন দিকে পড়বে। গুন্টার ফেলবিঙ্গার একটি ব্লগ পোস্টে এই আসন্নীকরণ প্রভাবের সম্ভাব্য পরিণতি নিয়ে আলোচনা করেছেন । নিছক আগ্রহবশত, আমি নিজে মডেলটিতে অনুমোদিত সমস্ত গ্রেড সমন্বয়ের ক্ষেত্রে এর প্রভাবগুলো গণনা করেছি।
আমার মূল প্রশ্নটি হলো: বিষয়ভিত্তিক গড়কে রাউন্ড না করে গণনার চেয়ে, প্রাথমিক পর্যায়ে পূর্ণ সংখ্যায় রাউন্ড করলে স্কুলের হিসাব পদ্ধতি কতবার ভিন্ন হয়? অধিকন্তু, যদি পৃথক বিষয়গুলোর গড়কে (যেমনটা সেখানে প্রস্তাব করা হয়েছে) প্রাথমিকভাবে কেবল এক দশমিক স্থান পর্যন্ত রাউন্ড করা হয়, তাহলে কী পরিবর্তন আসে তা দেখাও আকর্ষণীয় হবে।
বাভারিয়ান প্রাথমিক বিদ্যালয় বিধিমালা-র ধারা ৬ অনুসারে, জার্মান, গণিত এবং স্থানীয় ও সাধারণ অধ্যয়নের গ্রেড থেকে গড় গ্রেড গণনা করা হয়। বাস্তবায়নকারী বিধিমালায় \(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{aligned}
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{aligned}
\]
\(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\) নির্ণয় করা যায় না। সুতরাং আমার গণনা আসন্নীকরণের প্রভাবকে নিশ্চিত করে, কিন্তু এই স্বতন্ত্র সম্ভাবনাগুলিকে নয়। যাই হোক, প্রভাবিত শিশুদের প্রকৃত সংখ্যা সম্পর্কে বিবৃতি দেওয়ার জন্য বাস্তব শ্রেণি বণ্টন এবং তাদের নির্ভরশীলতার প্রয়োজন হবে।