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