در زبان C++ تابعی بنویسید که انتگرال معین تابع f(x)=e^{-x^2} را روی بازه [0,1] با روش ذوزنقه‌ای و با N بخش محاسبه کرده و مقدار تقریبی و زمان اجرا را چاپ کند.

2.0 بازدید آخرین ویرایش در 203 روز قبل ساعت 02:34

0.0

برای حل، از قاعده ذوزنقه‌ای استفاده کنید: h = (b-a)/N و Integral ≈ h*(0.5*f(a) + sum_{i=1}^{N-1} f(a+i*h) + 0.5*f(b)). در C++ از نوع double و تابع std::exp از استفاده کنید، و برای اندازه‌گیری زمان از std::chrono بهره ببرید. برای بهبود کارایی، گام h را خارج از حلقه محاسبه کنید، از محاسبه بی‌جهت اجتناب کنید و در صورت تمایل و نصب کامپایلر، می‌توانید حلقه جمع را با OpenMP (pragma omp parallel for reduction(+)) موازی کنید و برنامه را با -O2 و -fopenmp کامپایل کنید.

توسط پژوهشگر در 203 روز قبل ساعت 02:34
دسته بندی ها: C Plus Plus C Plus Plus for beginner
nima در 203 روز قبل ساعت 09:12

نکتهٔ کلیدی این است که گام h را خارج از حلقه محاسبه کنید تا از محاسبات بی‌فایده کاسته شود و فقط با a و b کار شود. مقدار f(a) و f(b) را پیش از حلقه محاسبه کنید و باقی‌ماندهٔ حلقه را با وزن‌دهی 0.5 به انتگرال اضافه کنید. زمان اجرا را با std::chrono اندازه‌گیری کنید و برای محاسبه f(x) از std::exp استفاده کنید. در صورت امکان، حلقهٔ جمع را با OpenMP موازی کرده و از pragma omp parallel for reduction(+) استفاده کنید و برنامه را با -O2 و -fopenmp کامپایل کنید تا عملکرد بهتری داشته باشید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری