use scirs2_special::*;
use std::collections::HashMap;
use std::f64::consts::PI;
use std::io::{self, Write};
#[derive(Debug, Clone)]
struct LearningProgress {
modules_completed: Vec<String>,
quiz_scores: HashMap<String, f64>,
exercises_completed: Vec<String>,
total_time_spent: u32, }
impl LearningProgress {
fn new() -> Self {
Self {
modules_completed: Vec::new(),
quiz_scores: HashMap::new(),
exercises_completed: Vec::new(),
total_time_spent: 0,
}
}
fn complete_module(&mut self, modulename: &str) {
if !self.modules_completed.contains(&modulename.to_string()) {
self.modules_completed.push(modulename.to_string());
}
}
fn add_quiz_score(&mut self, quizname: &str, score: f64) {
self.quiz_scores.insert(quizname.to_string(), score);
}
fn complete_exercise(&mut self, exercisename: &str) {
if !self.exercises_completed.contains(&exercisename.to_string()) {
self.exercises_completed.push(exercisename.to_string());
}
}
fn show_summary(&self) {
println!("\n📊 Learning Progress Summary");
println!("============================");
println!("Modules completed: {}", self.modules_completed.len());
println!("Exercises completed: {}", self.exercises_completed.len());
println!("Quiz scores:");
for (quiz, score) in &self.quiz_scores {
println!(" {}: {:.1}%", quiz, score * 100.0);
}
if !self.quiz_scores.is_empty() {
let avg_score: f64 =
self.quiz_scores.values().sum::<f64>() / self.quiz_scores.len() as f64;
println!("Average quiz score: {:.1}%", avg_score * 100.0);
}
println!("Total time spent: {} minutes", self.total_time_spent);
println!();
}
}
#[allow(dead_code)]
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🎓 Interactive Learning Modules for Special Functions");
println!("=====================================================\n");
let mut progress = LearningProgress::new();
loop {
display_main_menu(&progress);
let choice = get_user_input("Enter your choice (1-8, or 'q' to quit): ")?;
if choice.to_lowercase() == "q" {
progress.show_summary();
println!("👋 Thank you for learning with us! Keep exploring special functions!");
break;
}
match choice.parse::<u32>() {
Ok(1) => fundamentals_module(&mut progress)?,
Ok(2) => gamma_function_deep_dive(&mut progress)?,
Ok(3) => bessel_functions_masterclass(&mut progress)?,
Ok(4) => probability_and_statistics_module(&mut progress)?,
Ok(5) => physics_applications_module(&mut progress)?,
Ok(6) => engineering_problems_module(&mut progress)?,
Ok(7) => advanced_topics_module(&mut progress)?,
Ok(8) => custom_challenge_mode(&mut progress)?,
_ => println!("❌ Invalid choice. Please try again.\n"),
}
}
Ok(())
}
#[allow(dead_code)]
fn display_main_menu(progress: &LearningProgress) {
println!("📚 Choose a learning module:");
println!("1. 🌟 Fundamentals of Special Functions");
println!("2. 🎲 Gamma Function Deep Dive");
println!("3. 🌊 Bessel Functions Masterclass");
println!("4. 📊 Probability & Statistics Applications");
println!("5. ⚛️ Physics Applications Workshop");
println!("6. 🔧 Engineering Problem Solving");
println!("7. 🚀 Advanced Topics & Research");
println!("8. 🎯 Custom Challenge Mode");
println!("q. Quit and Show Progress");
println!();
if !progress.modules_completed.is_empty() {
println!("✅ Completed: {}", progress.modules_completed.join(", "));
}
if !progress.quiz_scores.is_empty() {
let avg_score: f64 =
progress.quiz_scores.values().sum::<f64>() / progress.quiz_scores.len() as f64;
println!("📈 Current average: {:.1}%", avg_score * 100.0);
}
println!();
}
#[allow(dead_code)]
fn get_user_input(prompt: &str) -> io::Result<String> {
print!("{}", prompt);
io::stdout().flush()?;
let mut input = String::new();
io::stdin().read_line(&mut input)?;
Ok(input.trim().to_string())
}
#[allow(dead_code)]
fn fundamentals_module(progress: &mut LearningProgress) -> Result<(), Box<dyn std::error::Error>> {
println!("\n🌟 FUNDAMENTALS OF SPECIAL FUNCTIONS");
println!("====================================\n");
println!("Welcome to the foundational module! Let's start with the basics.");
pause_for_user();
println!("📖 Lesson 1: What are Special Functions?");
println!("========================================\n");
println!("Special functions are mathematical functions that arise frequently in");
println!("mathematics, physics, and engineering. Unlike elementary functions");
println!("(polynomials, trigonometric, exponential), special functions often:");
println!("• Solve specific differential equations");
println!("• Have infinite series representations");
println!("• Appear in mathematical physics");
println!("• Have well-studied properties and applications\n");
println!("Examples of special functions:");
println!("• Gamma function Γ(z) - generalizes factorials");
println!("• Bessel functions J_ν(x) - cylindrical wave solutions");
println!("• Error function erf(x) - probability and statistics");
println!("• Elliptic integrals - arc length of ellipses");
println!("• Hypergeometric functions - unified framework\n");
pause_for_user();
println!("🧮 Interactive Example: Comparing Functions");
println!("Let's see how special functions behave compared to elementary ones:\n");
let x_values = vec![0.5_f64, 1.0_f64, 1.5_f64, 2.0_f64, 2.5_f64, 3.0_f64];
println!("x x² sin(x) Γ(x) J₀(x) erf(x)");
println!("--------------------------------------------------------");
for &x in &x_values {
println!(
"{:.1} {:6.3} {:6.3} {:6.3} {:6.3} {:6.3}",
x,
x * x,
x.sin(),
gamma(x),
j0(x),
erf(x)
);
}
println!("\nNotice how special functions have more complex behavior patterns!");
pause_for_user();
let quiz_score = fundamentals_quiz()?;
progress.add_quiz_score("Fundamentals", quiz_score);
println!("\n📖 Lesson 2: Series Representations");
println!("===================================\n");
println!("Many special functions can be expressed as infinite series.");
println!("This is often how they're computed numerically.\n");
println!("Example: The exponential function");
println!("e^x = 1 + x + x²/2! + x³/3! + x⁴/4! + ...\n");
println!("Similarly, the error function:");
println!("erf(x) = (2/√π) * [x - x³/3 + x⁵/(5·2!) - x⁷/(7·3!) + ...]\n");
series_approximation_demo()?;
println!("\n💪 Exercise: Series Convergence");
series_convergence_exercise(progress)?;
progress.complete_module("Fundamentals");
println!("\n✅ Fundamentals module completed!\n");
Ok(())
}
#[allow(dead_code)]
fn gamma_function_deep_dive(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n🎲 GAMMA FUNCTION DEEP DIVE");
println!("===========================\n");
if !progress
.modules_completed
.contains(&"Fundamentals".to_string())
{
println!(
"⚠️ Recommendation: Complete the Fundamentals module first for better understanding."
);
let proceed = get_user_input("Continue anyway? (y/n): ")?;
if proceed.to_lowercase() != "y" {
return Ok(());
}
}
println!("The Gamma function is one of the most important special functions!");
println!("Let's explore its definition, properties, and applications.\n");
println!("📖 Lesson 1: Definition and Basic Properties");
println!("===========================================\n");
println!("The Gamma function is defined by the integral:");
println!("Γ(z) = ∫₀^∞ t^(z-1) e^(-t) dt for Re(z) > 0\n");
println!("Key properties:");
println!("1. Recurrence relation: Γ(z+1) = z·Γ(z)");
println!("2. Factorial extension: Γ(n) = (n-1)! for positive integers n");
println!("3. Special value: Γ(1/2) = √π");
println!("4. Functional equation relates Γ(z) and Γ(1-z)\n");
println!("🧮 Let's verify these properties:");
println!("\n1. Recurrence relation verification:");
for z in [1.5_f64, 2.3_f64, 3.7_f64] {
let gamma_z = gamma(z);
let gamma_z_plus_1 = gamma(z + 1.0);
let computed_from_recurrence = z * gamma_z;
println!(
"z = {:.1}: Γ(z+1) = {:.6}, z·Γ(z) = {:.6}, difference = {:.2e}",
z,
gamma_z_plus_1,
computed_from_recurrence,
(gamma_z_plus_1 - computed_from_recurrence).abs()
);
}
println!("\n2. Factorial extension verification:");
for n in 1..=5 {
let gamma_n = gamma(n as f64);
let factorial_nminus_1 = (1..n).product::<usize>() as f64;
println!(
"n = {}: Γ({}) = {:.6}, ({}−1)! = {:.6}",
n, n, gamma_n, n, factorial_nminus_1
);
}
println!("\n3. Special value Γ(1/2) = √π:");
let gamma_half = gamma(0.5);
let sqrt_pi = PI.sqrt();
println!("Γ(1/2) = {:.10}", gamma_half);
println!("√π = {:.10}", sqrt_pi);
println!("Difference = {:.2e}", (gamma_half - sqrt_pi).abs());
pause_for_user();
println!("\n📖 Lesson 2: Related Functions and Applications");
println!("==============================================\n");
println!("Related functions:");
println!("• Log-gamma: ln Γ(z) - more numerically stable");
println!("• Digamma: ψ(z) = Γ'(z)/Γ(z) - logarithmic derivative");
println!("• Beta function: B(a,b) = Γ(a)Γ(b)/Γ(a+b)");
println!("• Incomplete gamma: γ(a,x) and Γ(a,x)\n");
println!("🧮 Exploring related functions:");
gamma_related_functions_demo()?;
let quiz_score = gamma_function_quiz()?;
progress.add_quiz_score("Gamma Function", quiz_score);
println!("\n💪 Advanced Exercise: Stirling's Approximation");
stirling_approximation_exercise(progress)?;
progress.complete_module("Gamma Function Deep Dive");
println!("\n✅ Gamma Function Deep Dive completed!\n");
Ok(())
}
#[allow(dead_code)]
fn bessel_functions_masterclass(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n🌊 BESSEL FUNCTIONS MASTERCLASS");
println!("===============================\n");
println!("Bessel functions are solutions to Bessel's differential equation");
println!("and appear frequently in problems with cylindrical symmetry.\n");
println!("📖 Lesson 1: The Bessel Differential Equation");
println!("=============================================\n");
println!("Bessel's differential equation:");
println!("x²y'' + xy' + (x² - ν²)y = 0\n");
println!("This equation arises when separating variables in:");
println!("• Laplace's equation in cylindrical coordinates");
println!("• Wave equation for circular membranes");
println!("• Heat conduction in cylinders");
println!("• Quantum mechanics (hydrogen atom radial equation)\n");
println!("Solutions:");
println!("• J_ν(x): Bessel functions of the first kind");
println!("• Y_ν(x): Bessel functions of the second kind (Neumann functions)");
println!("• H_ν^(1)(x), H_ν^(2)(x): Hankel functions (complex combinations)");
println!("• I_ν(x), K_ν(x): Modified Bessel functions\n");
pause_for_user();
println!("📖 Lesson 2: Properties and Oscillatory Behavior");
println!("===============================================\n");
println!("Key properties of Bessel functions:");
println!("1. Orthogonality: ∫₀¹ x J_ν(α_n x) J_ν(α_m x) dx = 0 for m ≠ n");
println!("2. Asymptotic behavior for large x:");
println!(" J_ν(x) ~ √(2/πx) cos(x - νπ/2 - π/4)");
println!("3. Near x = 0: J_ν(x) ~ (x/2)^ν / Γ(ν+1)");
println!("4. Zeros: J_ν(x) has infinitely many positive zeros\n");
println!("🌊 Observing Oscillatory Behavior:");
bessel_oscillation_demo()?;
println!("\n📖 Lesson 3: Real-World Applications");
println!("===================================\n");
println!("Let's solve some practical problems using Bessel functions!\n");
println!("🥁 Application 1: Vibrating Circular Membrane (Drum)");
vibrating_membrane_problem(progress)?;
println!("\n🔥 Application 2: Heat Conduction in a Cylinder");
cylindrical_heat_conduction_problem(progress)?;
let quiz_score = bessel_functions_quiz()?;
progress.add_quiz_score("Bessel Functions", quiz_score);
progress.complete_module("Bessel Functions Masterclass");
println!("\n✅ Bessel Functions Masterclass completed!\n");
Ok(())
}
#[allow(dead_code)]
fn probability_and_statistics_module(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n📊 PROBABILITY & STATISTICS APPLICATIONS");
println!("=========================================\n");
println!("Special functions are fundamental to probability theory and statistics.");
println!("Let's explore how they enable advanced statistical analysis.\n");
println!("📖 Lesson 1: Normal Distribution and Error Function");
println!("==================================================\n");
println!("The error function is intimately connected to the normal distribution:");
println!("P(Z ≤ z) = (1/2)[1 + erf(z/√2)]\n");
println!("This connection allows us to:");
println!("• Calculate probabilities for normal random variables");
println!("• Determine confidence intervals");
println!("• Perform hypothesis tests");
println!("• Analyze measurement errors\n");
probability_calculator_demo()?;
println!("\n📖 Lesson 2: Gamma Distribution Family");
println!("=====================================\n");
println!("The gamma function defines an entire family of distributions:");
println!("• Gamma distribution: modeling waiting times");
println!("• Chi-square distribution: goodness-of-fit tests");
println!("• Beta distribution: Bayesian priors for probabilities");
println!("• Student's t-distribution: small sample inference\n");
gamma_distribution_family_demo()?;
println!("\n📖 Lesson 3: Bayesian Statistics Workshop");
println!("========================================\n");
bayesian_analysis_workshop(progress)?;
let quiz_score = statistics_quiz()?;
progress.add_quiz_score("Statistics", quiz_score);
progress.complete_module("Probability & Statistics");
println!("\n✅ Probability & Statistics module completed!\n");
Ok(())
}
#[allow(dead_code)]
fn physics_applications_module(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n⚛️ PHYSICS APPLICATIONS WORKSHOP");
println!("================================\n");
println!("Special functions are the language of mathematical physics!");
println!("Let's explore their role in fundamental physics problems.\n");
println!("🔬 Quantum Mechanics: Hydrogen Atom");
println!("===================================\n");
quantum_mechanics_hydrogen_atom(progress)?;
println!("\n🌐 Electromagnetic Theory: Multipole Expansions");
println!("==============================================\n");
electromagnetic_multipoles(progress)?;
println!("\n🌡️ Statistical Mechanics: Distribution Functions");
println!("===============================================\n");
statistical_mechanics_distributions(progress)?;
let quiz_score = physics_quiz()?;
progress.add_quiz_score("Physics", quiz_score);
progress.complete_module("Physics Applications");
println!("\n✅ Physics Applications module completed!\n");
Ok(())
}
#[allow(dead_code)]
fn engineering_problems_module(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n🔧 ENGINEERING PROBLEM SOLVING");
println!("==============================\n");
println!("Engineers use special functions to solve complex real-world problems.");
println!("Let's tackle some challenging engineering scenarios!\n");
println!("📡 Signal Processing: Filter Design");
println!("==================================\n");
signal_processing_filters(progress)?;
println!("\n🎛️ Control Systems: System Analysis");
println!("==================================\n");
control_systems_analysis(progress)?;
println!("\n🏗️ Structural Engineering: Vibration Analysis");
println!("============================================\n");
structural_vibration_analysis(progress)?;
let quiz_score = engineering_quiz()?;
progress.add_quiz_score("Engineering", quiz_score);
progress.complete_module("Engineering Problems");
println!("\n✅ Engineering Problems module completed!\n");
Ok(())
}
#[allow(dead_code)]
fn advanced_topics_module(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n🚀 ADVANCED TOPICS & RESEARCH");
println!("=============================\n");
if progress.modules_completed.len() < 3 {
println!("⚠️ This is an advanced module. We recommend completing at least 3 other modules first.");
let proceed = get_user_input("Continue anyway? (y/n): ")?;
if proceed.to_lowercase() != "y" {
return Ok(());
}
}
println!("Welcome to cutting-edge applications of special functions!");
println!("These topics represent active areas of research and development.\n");
println!("🔬 Current Research Frontiers");
println!("============================\n");
research_frontiers_overview()?;
println!("\n💻 Computational Challenges");
println!("==========================\n");
computational_challenges_workshop(progress)?;
println!("\n🌐 Interdisciplinary Applications");
println!("================================\n");
interdisciplinary_applications(progress)?;
let quiz_score = advanced_topics_quiz()?;
progress.add_quiz_score("Advanced Topics", quiz_score);
progress.complete_module("Advanced Topics");
println!("\n✅ Advanced Topics module completed!\n");
Ok(())
}
#[allow(dead_code)]
fn custom_challenge_mode(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n🎯 CUSTOM CHALLENGE MODE");
println!("========================\n");
println!("Test your knowledge with custom challenges!");
println!("Choose your difficulty level and topic focus.\n");
loop {
println!("Challenge Options:");
println!("1. 🟢 Beginner - Basic function evaluation");
println!("2. 🟡 Intermediate - Property verification");
println!("3. 🔴 Advanced - Research-level problems");
println!("4. 🎲 Random Challenge");
println!("5. 🏆 Ultimate Challenge (all topics)");
println!("6. 📊 View Challenge Statistics");
println!("7. Return to main menu");
let choice = get_user_input("Select challenge type (1-7): ")?;
match choice.as_str() {
"1" => beginner_challenge(progress)?,
"2" => intermediate_challenge(progress)?,
"3" => advanced_challenge(progress)?,
"4" => random_challenge(progress)?,
"5" => ultimate_challenge(progress)?,
"6" => show_challenge_statistics(progress),
"7" => break,
_ => println!("❌ Invalid choice. Please try again.\n"),
}
}
Ok(())
}
#[allow(dead_code)]
fn pause_for_user() {
println!("\nPress Enter to continue...");
let _ = io::stdin().read_line(&mut String::new());
}
#[allow(dead_code)]
fn fundamentals_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("\n🧠 Fundamentals Quiz");
println!("===================\n");
let mut correct = 0;
let total = 5;
println!("Question 1: What is Γ(4)?");
println!("a) 6 b) 24 c) 4 d) 3!");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "a" {
println!("✅ Correct! Γ(4) = 3! = 6\n");
correct += 1;
} else {
println!("❌ Incorrect. Γ(n) = (n-1)! for positive integers, so Γ(4) = 3! = 6\n");
}
println!("Question 2: Which function is odd?");
println!("a) erf(x) b) gamma(x) c) J₀(x) d) cos(x)");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "a" {
println!("✅ Correct! erf(-x) = -erf(x)\n");
correct += 1;
} else {
println!("❌ Incorrect. The error function is odd: erf(-x) = -erf(x)\n");
}
println!("Question 3: What is erf(∞)?");
println!("a) 0 b) 1 c) ∞ d) undefined");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "b" {
println!("✅ Correct! erf(∞) = 1\n");
correct += 1;
} else {
println!("❌ Incorrect. erf(∞) = 1 by definition\n");
}
println!("Question 4: Bessel functions solve which type of equation?");
println!("a) Algebraic b) Differential c) Integral d) Polynomial");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "b" {
println!("✅ Correct! Bessel functions solve Bessel's differential equation\n");
correct += 1;
} else {
println!("❌ Incorrect. Bessel functions are solutions to differential equations\n");
}
println!("Question 5: What is J₀(0)?");
println!("a) 0 b) 1 c) undefined d) ∞");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "b" {
println!("✅ Correct! J₀(0) = 1\n");
correct += 1;
} else {
println!("❌ Incorrect. J₀(0) = 1 by definition\n");
}
let score = correct as f64 / total as f64;
println!(
"Quiz completed! Score: {}/{} ({:.1}%)",
correct,
total,
score * 100.0
);
Ok(score)
}
#[allow(dead_code)]
fn series_approximation_demo() -> Result<(), Box<dyn std::error::Error>> {
println!("🧮 Interactive Series Demonstration");
println!("===================================\n");
let x = 0.5_f64;
println!("Let's see how series converge for erf({}):", x);
println!("erf(x) = (2/√π) * [x - x³/3 + x⁵/(5·2!) - x⁷/(7·3!) + ...]\n");
println!("Terms Partial Sum True Value Error");
println!("------------------------------------------");
let true_value = erf(x);
let mut partial_sum = 0.0;
let coeff = 2.0 / PI.sqrt();
for n in 0..10 {
let term = (-1.0_f64).powi(n) * x.powi(2 * n + 1)
/ ((2 * n + 1) as f64 * factorial(n as u32) as f64);
partial_sum += coeff * term;
let error = (partial_sum - true_value).abs();
println!(
"{:5} {:10.6} {:10.6} {:8.2e}",
n + 1,
partial_sum,
true_value,
error
);
}
println!("\nNotice how the series converges to the true value!");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn factorial(n: u32) -> u64 {
(1..=n as u64).product()
}
#[allow(dead_code)]
fn series_convergence_exercise(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("\n💪 Exercise: Estimate sin(1) using its Taylor series");
println!("sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ...\n");
let true_value = 1.0_f64.sin();
println!("True value: sin(1) = {:.10}", true_value);
let terms = get_user_input("How many terms do you want to use? ")?
.parse::<usize>()
.unwrap_or(5);
let mut sum = 0.0;
for n in 0..terms {
let term = (-1.0_f64).powi(n as i32) / factorial(2 * n as u32 + 1) as f64;
sum += term;
}
println!("Your approximation with {} terms: {:.10}", terms, sum);
println!("Error: {:.2e}", (sum - true_value).abs());
if (sum - true_value).abs() < 0.001 {
println!("🎉 Excellent approximation!");
progress.complete_exercise("Series Convergence");
} else if (sum - true_value).abs() < 0.01 {
println!("👍 Good approximation!");
progress.complete_exercise("Series Convergence");
} else {
println!("🤔 Try using more terms for better accuracy!");
}
Ok(())
}
#[allow(dead_code)]
fn gamma_related_functions_demo() -> Result<(), Box<dyn std::error::Error>> {
println!("Exploring gamma-related functions at x = 2.5:");
let x = 2.5;
println!("Γ({}) = {:.6}", x, gamma(x));
println!("ln Γ({}) = {:.6}", x, gammaln(x));
println!("ψ({}) = {:.6}", x, digamma(x));
let a = 2.0;
let b = 3.0;
println!("B({}, {}) = {:.6}", a, b, beta(a, b));
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn gamma_function_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("\n🧠 Gamma Function Quiz");
println!("=====================\n");
let mut correct = 0;
let total = 3;
println!("Question 1: What is the relationship between Γ(z+1) and Γ(z)?");
println!("a) Γ(z+1) = z·Γ(z) b) Γ(z+1) = Γ(z) + 1 c) Γ(z+1) = Γ(z)²");
let answer = get_user_input("Your answer (a/b/c): ")?;
if answer.to_lowercase() == "a" {
println!("✅ Correct! This is the fundamental recurrence relation.\n");
correct += 1;
} else {
println!("❌ Incorrect. The recurrence relation is Γ(z+1) = z·Γ(z)\n");
}
println!("Question 2: What is Γ(1/2)?");
println!("a) 1 b) √π c) π/2 d) 2");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "b" {
println!("✅ Correct! Γ(1/2) = √π\n");
correct += 1;
} else {
println!("❌ Incorrect. Γ(1/2) = √π ≈ 1.7725\n");
}
println!("Question 3: Which function is the logarithmic derivative of Γ(z)?");
println!("a) ln Γ(z) b) ψ(z) c) B(z,1) d) Γ'(z)");
let answer = get_user_input("Your answer (a/b/c/d): ")?;
if answer.to_lowercase() == "b" {
println!("✅ Correct! The digamma function ψ(z) = Γ'(z)/Γ(z)\n");
correct += 1;
} else {
println!("❌ Incorrect. The digamma function ψ(z) = Γ'(z)/Γ(z)\n");
}
let score = correct as f64 / total as f64;
println!(
"Quiz completed! Score: {}/{} ({:.1}%)",
correct,
total,
score * 100.0
);
Ok(score)
}
#[allow(dead_code)]
fn stirling_approximation_exercise(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Stirling's approximation: Γ(z) ≈ √(2π/z) * (z/e)^z");
println!("Let's test this approximation for large values:\n");
for &z in &[5.0, 10.0, 20.0, 50.0] {
let exact = gamma(z);
let stirling = (2.0 * PI / z).sqrt() * (z / std::f64::consts::E).powf(z);
let relative_error = (exact - stirling).abs() / exact;
println!(
"z = {:4.0}: Exact = {:12.2e}, Stirling = {:12.2e}, Error = {:.2e}",
z, exact, stirling, relative_error
);
}
println!("\nNotice how the approximation improves for larger z!");
progress.complete_exercise("Stirling Approximation");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn bessel_oscillation_demo() -> Result<(), Box<dyn std::error::Error>> {
println!("Demonstrating Bessel function oscillations...");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn vibrating_membrane_problem(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Solving vibrating circular membrane problem...");
progress.complete_exercise("Vibrating Membrane");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn cylindrical_heat_conduction_problem(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Solving cylindrical heat conduction problem...");
progress.complete_exercise("Cylindrical Heat Conduction");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn bessel_functions_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("Bessel Functions Quiz - simplified version");
Ok(0.85) }
#[allow(dead_code)]
fn probability_calculator_demo() -> Result<(), Box<dyn std::error::Error>> {
println!("Probability calculator demonstration...");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn gamma_distribution_family_demo() -> Result<(), Box<dyn std::error::Error>> {
println!("Gamma distribution family demonstration...");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn bayesian_analysis_workshop(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Bayesian analysis workshop...");
progress.complete_exercise("Bayesian Analysis");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn statistics_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("Statistics Quiz - simplified version");
Ok(0.80) }
#[allow(dead_code)]
fn quantum_mechanics_hydrogen_atom(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Quantum mechanics: Hydrogen atom analysis...");
progress.complete_exercise("Hydrogen Atom");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn electromagnetic_multipoles(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Electromagnetic multipole expansion...");
progress.complete_exercise("EM Multipoles");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn statistical_mechanics_distributions(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Statistical mechanics distributions...");
progress.complete_exercise("Statistical Mechanics");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn physics_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("Physics Quiz - simplified version");
Ok(0.90) }
#[allow(dead_code)]
fn signal_processing_filters(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Signal processing filter design...");
progress.complete_exercise("Filter Design");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn control_systems_analysis(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Control systems analysis...");
progress.complete_exercise("Control Systems");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn structural_vibration_analysis(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Structural vibration analysis...");
progress.complete_exercise("Structural Vibration");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn engineering_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("Engineering Quiz - simplified version");
Ok(0.88) }
#[allow(dead_code)]
fn research_frontiers_overview() -> Result<(), Box<dyn std::error::Error>> {
println!("Current research frontiers overview...");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn computational_challenges_workshop(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Computational challenges workshop...");
progress.complete_exercise("Computational Challenges");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn interdisciplinary_applications(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Interdisciplinary applications...");
progress.complete_exercise("Interdisciplinary Apps");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn advanced_topics_quiz() -> Result<f64, Box<dyn std::error::Error>> {
println!("Advanced Topics Quiz - simplified version");
Ok(0.85) }
#[allow(dead_code)]
fn beginner_challenge(progress: &mut LearningProgress) -> Result<(), Box<dyn std::error::Error>> {
println!("Beginner challenge...");
progress.complete_exercise("Beginner Challenge");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn intermediate_challenge(
progress: &mut LearningProgress,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Intermediate challenge...");
progress.complete_exercise("Intermediate Challenge");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn advanced_challenge(progress: &mut LearningProgress) -> Result<(), Box<dyn std::error::Error>> {
println!("Advanced challenge...");
progress.complete_exercise("Advanced Challenge");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn random_challenge(progress: &mut LearningProgress) -> Result<(), Box<dyn std::error::Error>> {
println!("Random challenge...");
progress.complete_exercise("Random Challenge");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn ultimate_challenge(progress: &mut LearningProgress) -> Result<(), Box<dyn std::error::Error>> {
println!("Ultimate challenge...");
progress.complete_exercise("Ultimate Challenge");
pause_for_user();
Ok(())
}
#[allow(dead_code)]
fn show_challenge_statistics(progress: &LearningProgress) {
println!("\n📊 Challenge Statistics");
println!("=======================");
println!(
"Exercises completed: {}",
progress.exercises_completed.len()
);
for exercise in &progress.exercises_completed {
println!("✅ {}", exercise);
}
println!();
}