با زبان C++ برنامهای بنویسید که انتگرال عددی تابع f(x)=e^{-x^2} را روی بازه [a,b] با روش ذوزنقهای (trapezoidal rule) و با n بخش محاسبه کرده و زمان اجرا را گزارش کند.
5.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 03:01 0.0
برای حل، مقدار a، b و n را از ورودی بگیرید، گام h = (b-a)/n را محاسبه کنید و با فرمول ذوزنقه مجموع را محاسبه نمایید: (h/2)*(f(a)+f(b)+2*sum_{i=1}^{n-1} f(a+i*h)). از نوع double برای دقت استفاده کنید و f را با std::exp(-x*x) پیادهسازی کنید. برای اندازهگیری زمان اجرا از std::chrono استفاده کنید. بهعنوان نکات بهینهسازی میتوانید حلقه جمعزنی را با OpenMP و گزینه reduction موازی کنید (با کامپایلر و فلگ مناسب مثل -fopenmp) و از دسترسی ترتیبی به حافظه برای کاهش کش میسها استفاده نمایید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای بهبود کارایی، حلقه جمعزنی را با OpenMP و گزینه reduction روی متغیر مجموع اجرا کنید و کامپایلر را با -fopenmp بیاندازید. بهجای استفاده از آرایه اضافی، مقادیر را در هر تکرار محاسبه کنید تا دسترسی ترتیبی به حافظه و کش بهتری داشته باشید. برای کاهش خطای جمع، میتوانید از روشهای مانند Kahan summation استفاده کنید. همچنین زمان اجرا را با std::chrono اندازهگیری کنید و خروجی دقیقتری به کاربر بدهید.
گزارش