با زبان 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) و از دسترسی ترتیبی به حافظه برای کاهش کش میس‌ها استفاده نمایید.

توسط پژوهشگر در 202 روز قبل ساعت 03:01
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arman در 202 روز قبل ساعت 07:46

برای بهبود کارایی، حلقه جمع‌زنی را با OpenMP و گزینه reduction روی متغیر مجموع اجرا کنید و کامپایلر را با -fopenmp بیاندازید. به‌جای استفاده از آرایه اضافی، مقادیر را در هر تکرار محاسبه کنید تا دسترسی ترتیبی به حافظه و کش بهتری داشته باشید. برای کاهش خطای جمع، می‌توانید از روش‌های مانند Kahan summation استفاده کنید. همچنین زمان اجرا را با std::chrono اندازه‌گیری کنید و خروجی دقیق‌تری به کاربر بدهید.

گزارش

1 پاسخ

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

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