با زبان C++ یک برنامه بنویسید که انتگرال عددی تابع f(x)=sin(x) را روی بازه [a,b] با روش ذوزنقهای (Trapezoidal rule) با n بخش محاسبه کند، مقدار تقریبی و خطای تقریبی نسبت به مقدار دقیق تحلیلی را نشان دهد و یک نسخه ساده موازیسازیشده با OpenMP برای مقایسه زمان اجرا پیادهسازی کند.
1.0 بازدید آخرین ویرایش در 220 روز قبل ساعت 02:00 0.0
از فرمول ذوزنقهای استفاده کنید: I ≈ h*( (f(a)+f(b))/2 + Σ f(a + i*h) ) با h=(b-a)/n. در C++ از نوع double برای دقت استفاده کرده، برای اندازهگیری زمان از std::chrono بهره ببرید و مقدار دقیق تحلیلی ∫_a^b sin(x) dx = -cos(b)+cos(a) را برای محاسبه خطا به کار ببرید. برای نسخه موازی با OpenMP حلقه جمع را با reduction جمع ببندید (مثلاً #pragma omp parallel for reduction(+ : sum)) و برنامه را با -fopenmp کامپایل کنید؛ همچنین به انتخاب مناسب n برای کاهش خطای گسسته و جلوگیری از مشکلات گرد شدگی توجه کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای دقت بهتر در تخمین با روش ذوزنقهای، n را به اندازه کافی بزرگ انتخاب کنید و از double برای همه محاسبات استفاده کنید تا از گرد شدن جلوگیری شود. در بازههای طولانی ممکن است خطای گرد شدن تجمعی شود، پس تست مختلفی با nهای مختلف انجام دهید و به حد همگرایی برسید. در نسخه موازی OpenMP از #pragma omp parallel for reduction(+ : sum) استفاده کنید و زمان اجرایی را با std::chrono مقایسه کنید، همچنین کامپایلر را با -fopenmp فعال کنید تا بار کار بین تردها درست تقسیم شود. برای ارزیابی خطا از مقدار دقیق تحلیلی -cos(b) + cos(a) استفاده کنید و در نهایت به انتخاب مناسب n برای کاهش خطاهای گسستگی و جلوگیری از تجمع خطا توجه کنید.
گزارش